Rust TDD 實戰:用測試驅動開發打造迷你 grep 工具「minigrep」

Vedanta-avatar-img
發佈於rust
更新 發佈閱讀 6 分鐘

今天帶你用 測試驅動開發(TDD) 的方式,在 Rust 裡從零打造一個命令列搜尋工具:minigrep

這是《Rust 程式設計語言》書中的經典範例,用來學習測試、模組化與生命週期。 Let's go 🚀


首先建立專案:

cargo new minigrep
cd minigrep

這會建立:

minigrep/
├── Cargo.toml
└── src/
└── main.rs

然後新增核心邏輯檔案:

touch src/lib.rs

TDD 第一步:寫一個失敗的測試

src/lib.rs

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn one_result() {
let query = "duct";
let contents = "\
Rust:
safe, fast, productive.
Pick three.";

assert_eq!(vec!["safe, fast, productive."], search(query, contents));
}
}

pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
vec![]
}

執行測試(預期會失敗 🔥):

cargo test
raw-image

TDD 第二步:寫出讓測試通過的最小實作

修改 src/lib.rs

pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
let mut results = Vec::new();

for line in contents.lines() {
if line.contains(query) {
results.push(line);
}
}

results
}


再次測試 💥:

cargo test
raw-image

✅ 測試通過!我們的搜尋邏輯正確無誤。

現在把邏輯整合進主程式:


src/main.rs

use std::env;

use std::fs;



use minigrep::search;



fn main() {

    // 讀取命令列參數

    let args: Vec<String> = env::args().collect();



    if args.len() != 3 {

        eprintln!("Usage: minigrep <query> <filename>");

        std::process::exit(1);

    }



    let query = &args[1];

    let filename = &args[2];



    let contents = fs::read_to_string(filename)

        .expect("Should have been able to read the file");



    for line in search(query, &contents) {

        println!("{line}");

    }

}

新增一首詩作測試檔:

echo "I'm nobody! Who are you?
Are you nobody, too?
How public, like a frog
To tell your name the livelong day
To an admiring bog!" > poem.txt

來試跑看看 🚀

搜尋 frog

raw-image

搜尋 body

raw-image

輸出多行,完全正確 ✅


🎯 我們剛完成了一個:

  • 有測試覆蓋的核心邏輯
  • 命令列工具
  • 清楚生命週期管理的 Rust 專案

最棒的是——我們是用 TDD 寫出來的!


這就是 Rust TDD 的節奏:

1️⃣ 寫失敗測試

2️⃣ 實作最小可行功能 3️⃣ 確認測試通過 4️⃣ 重構並保持綠燈 💚

重複這個循環,你的程式就會又乾淨又可靠。


12️⃣

完整專案結構:

minigrep/
├── Cargo.toml
├── poem.txt
└── src/
├── lib.rs
└── main.rs

測試與主程式各司其職,

讓你的程式易於維護、擴展、重構。



留言
avatar-img
留言分享你的想法!
avatar-img
于正龍(Ricky)的沙龍
51會員
78內容數
人工智能工作經驗跟研究
你可能也想看
Thumbnail
覺得黏在額頭上的"條碼瀏海"很阿雜嗎?日本熱銷的「KOIZUMI迷你瀏海梳」,不僅小巧便攜,更能快速加熱造型,無論是齊瀏海、空氣瀏海還是韓系碎蓋髮,都能輕鬆打理!瀏海順了,一整天心情就好了!
Thumbnail
覺得黏在額頭上的"條碼瀏海"很阿雜嗎?日本熱銷的「KOIZUMI迷你瀏海梳」,不僅小巧便攜,更能快速加熱造型,無論是齊瀏海、空氣瀏海還是韓系碎蓋髮,都能輕鬆打理!瀏海順了,一整天心情就好了!
Thumbnail
走完朝聖之路和TMB後,我發現真正能撐住長時間健行的,不只是腳力,而是那些讓生活更舒服的小物。這篇整理了我在TMB實測後覺得超好用的三樣登山神器——防水襪、肥皂袋、速乾毛巾,每一樣都讓旅程更輕鬆!
Thumbnail
走完朝聖之路和TMB後,我發現真正能撐住長時間健行的,不只是腳力,而是那些讓生活更舒服的小物。這篇整理了我在TMB實測後覺得超好用的三樣登山神器——防水襪、肥皂袋、速乾毛巾,每一樣都讓旅程更輕鬆!
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
網址:https://gadget.chienwen.net/x/text/articlecut 這個網頁裡面有許多小工具, 但感覺現在有很多被 AI 取代掉的東西, 推薦大家可以來用看看~
Thumbnail
網址:https://gadget.chienwen.net/x/text/articlecut 這個網頁裡面有許多小工具, 但感覺現在有很多被 AI 取代掉的東西, 推薦大家可以來用看看~
Thumbnail
本文介紹如何對 Telegram 憑證監控機器人的代碼進行優化,包括新增指令、讀取變數、提高可讀性和可維護性。
Thumbnail
本文介紹如何對 Telegram 憑證監控機器人的代碼進行優化,包括新增指令、讀取變數、提高可讀性和可維護性。
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
語法: grep '^<starting-character>.*<ending-character>$' <file> grep 指令可以使用特殊字元的組合: 星號 ( * )、( $ ) 和 ( ^ )來過濾搜尋的內容。在我們的範例中,要使用 grep搜尋以特定字元開頭和結尾的內容,例如
Thumbnail
語法: grep '^<starting-character>.*<ending-character>$' <file> grep 指令可以使用特殊字元的組合: 星號 ( * )、( $ ) 和 ( ^ )來過濾搜尋的內容。在我們的範例中,要使用 grep搜尋以特定字元開頭和結尾的內容,例如
Thumbnail
Semgrep 是一個功能強大的 SAST 工具,可以幫助開發人員早期發現程式碼中的安全問題,本文介紹如何將 Semgrep 整合到 GitLab Pipeline 以進行 SAST 掃描。
Thumbnail
Semgrep 是一個功能強大的 SAST 工具,可以幫助開發人員早期發現程式碼中的安全問題,本文介紹如何將 Semgrep 整合到 GitLab Pipeline 以進行 SAST 掃描。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News