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
于正龍(Ricky)的沙龍
55會員
86內容數
人工智能工作經驗跟研究
你可能也想看
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
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" }
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News