在 Rusts build-toolcargo中,我可以簡單地為測驗用例定義一個函式:
#[test]
fn test_something() {
assert_eq!(true, true);
}
運行cargo test輸出:
Running unittests src/lib.rs (target/debug/deps/example-14178b7a1a1c9c8c)
running 1 test
test test::test_something ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
到目前為止,一切都很好。現在我有一個特殊情況,我的專案中的測驗用例是在檔案中定義的。它們可以使用執行所有步驟以運行測驗并執行特定呼叫的特殊testcase()函式來執行。assert_eq!()
現在我想實作以下目標:
tests/從檔案夾中讀取所有檔案testcase()在每個檔案上運行- 將每個檔案作為一個測驗用例
cargo test
后一個是問題。testcase()這是使用-function從檔案夾運行所有測驗的函式(作為測驗) 。
#[test]
// Run all tests in the tests/-folder
fn tests() {
let cases = std::fs::read_dir("tests").unwrap();
for case in cases {
testcase(case.unwrap().path().to_str().unwrap());
}
}
給定測驗用例,運行cargo test應該列印以下內容,并且:a.testb.testc.test
Running unittests src/lib.rs (target/debug/deps/example-14178b7a1a1c9c8c)
running 3 test
test test::tests::tests/a.test ... ok
test test::tests::tests/b.test ... ok
test test::tests::tests/c.test ... ok
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
這有可能嗎?
uj5u.com熱心網友回復:
使用 Rust 的內置測驗工具,除了使用屬性之外,沒有其他方法可以宣告單個測驗用例。#[test]為了獲得您想要的結果,您需要撰寫一個 proc-macro 來讀取您的測驗目錄并#[test]為每個測驗生成一個函式。
相反,撰寫一個使用您自己的工具代碼的測驗可能會更實用。在您的Cargo.toml中,定義一個禁用它的測驗目標:
[[test]]
name = "lang_tests"
harness = false
然后在tests/lang_tests.rs(tests/目錄位于 Cargo 旁邊src/并且已經知道 Cargomain() )中,撰寫一個運行測驗的普通程式:
fn main() {
let cases = std::fs::read_dir("tests").unwrap();
let mut passed = 0;
let mut failed = 0;
for case in cases {
if testcase(case.unwrap().path().to_str().unwrap()) {
eprintln!("...");
passed = 1;
} else {
eprintln!("...");
failed = 1;
}
}
eprintln!("{passed} passed, {failed} failed");
if failed > 0 {
std::process::exit(1);
}
}
當然,這里還有很多細節要實作——但我希望這能說明如何撰寫一個自定義測驗工具來做你想做的事情。同樣,您不能使用默認測驗工具來執行此操作,除非使用宏生成的代碼,這在這種情況下可能不值得。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/530682.html
標籤:单元测试锈锈货
上一篇:python:從父檔案夾中的不同子檔案夾匯入類(測驗)
下一篇:原子設計模式的反應鉤子單元測驗
