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)的沙龍
49會員
77內容數
人工智能工作經驗跟研究
你可能也想看
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
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