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
身為採購專家,當然不能錯過11/11購物節的超殺折扣!本文將帶你深入瞭解蝦皮11/11購物節的完整攻略,從必領的各種優惠券、商城折扣,到限時的搶購技巧,讓你買到手軟荷包也不哭泣。更重要的是,揭密蝦皮分潤計畫,教你如何零成本創業,透過分享商品連結,每月輕鬆加薪,開啟數位遊牧人生!
Thumbnail
身為採購專家,當然不能錯過11/11購物節的超殺折扣!本文將帶你深入瞭解蝦皮11/11購物節的完整攻略,從必領的各種優惠券、商城折扣,到限時的搶購技巧,讓你買到手軟荷包也不哭泣。更重要的是,揭密蝦皮分潤計畫,教你如何零成本創業,透過分享商品連結,每月輕鬆加薪,開啟數位遊牧人生!
Thumbnail
雙11購物節將近,這次分享一些蝦皮海外賣場購物的步驟與注意事項,並且介紹雙11蝦皮購物的相關優惠;另外蝦皮分潤計畫持續招募新血中,只要分享購物連結即可獲得分潤,是很適合創作者的額外收入管道喔!
Thumbnail
雙11購物節將近,這次分享一些蝦皮海外賣場購物的步驟與注意事項,並且介紹雙11蝦皮購物的相關優惠;另外蝦皮分潤計畫持續招募新血中,只要分享購物連結即可獲得分潤,是很適合創作者的額外收入管道喔!
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