本文件說明為 Rust 程式碼編寫測試的最佳做法。 另請參閱元件測試指南 定義及執行測試套件和元件的操作說明。
本文件的目標讀者是 fuchsia.git
內部工作的開發人員,
上述工作流程不適用於 IDK 消費者
本教學課程的原始碼位於
//examples/hello_world/rust
。
單元測試
在程式碼中加入測試
新增 Rust 單元測試的慣用方法,同樣適用於 Fuchsia 與戶外相同,只要把 請將下列程式碼片段插入您要撰寫的任何測試底部:
#[cfg(test)]
mod tests {
#[fuchsia::test]
fn it_works() {
assert_eq!(true, true);
}
}
這將導致建立名為「tests
」的新模組,且這個功能模組僅
。任何加上註解的函式
#[fuchsia::test]
將做為測試執行,如果函式成功執行
會傳回測試通過
#[fuchsia::test]
也支援執行非同步程式碼的測試。
#[fuchsia::test]
async fn my_test() {
let some_future = async { 4 };
assert_eq!(some_future.await, 4);
}
一般 #[test]
註解也可以正常運作,但不支援非同步測試
或登出帳戶如果認為 #[test]
Crate 可能會在 Fuchsia 程式碼集外使用。
建立測試
單元測試可透過 Rust 目標 (即
rustc_binary
或 rustc_library
)。相關做法在許多方面都相似。
為 Rust 二進位檔建構測試
如果您要測試的是信任「二進位檔」(
main.rs
)。如果您有程式庫,請參閱下一節。
您的 BUILD.gn
檔案必須先提供「rustc_binary
」範本
方法如下:
import("//build/rust/rustc_binary.gni")
單元測試只有在設定時才是由 rustc_binary
GN 範本建立
已新增 with_unit_tests = true
:
rustc_binary("bin") {
name = "hello_world_rust"
# Generates the "bin_test" build target
with_unit_tests = true
edition = "2021"
deps = []
test_deps = [ "//src/lib/fuchsia" ]
sources = [ "src/main.rs" ]
}
設定 with_unit_tests = true
會導致這項建構規則產生兩個
不同的執行檔,一個有提供的執行檔,另一個有附加 _bin_test
的執行檔
不符合系統提供的名稱
在本範例中,建立的執行檔名稱稱為:
hello_world_rust
;和hello_world_rust_bin_test
。
為 Rust 程式庫建構測試
您的 BUILD.gn
檔案必須先提供「rustc_library
」範本
方法如下:
import("//build/rust/rustc_library.gni")
單元測試只有在設定時才是由 rustc_library
GN 範本建立
新增了 with_unit_tests = true
,其執行方式類似
(共 rustc_binary
個)。
但在此範例中,系統會建立「名稱不同」的測試二進位檔:
hello_world_rust_lib_test
。請注意,二進位檔名稱 與資料庫產生的名稱相對應
二進位檔名稱非常重要,因為後續步驟將用到這些名稱。
封裝及執行測試
如要執行先前目標產生的測試,套件為 測試元件測試元件包含 元件資訊清單 宣告的是 測試所需的程式碼您可以使用下列建構規則套件測試:
fuchsia_test_package()
:收集多項測試的套件範本 將元件及其依附元件整合到單一套件中 測試套件通常用於整合測試。fuchsia_unittest_package()
:適用於包含 單元測試單元測試套件可以產生最低的元件資訊清單 不需要功能。
以 Hello World 二進位範例來說,單元測試套件會參照
產生的目標,bin_test
(以目標名稱「bin
」和隱含
後置字串 _test
) 和 hello_world_rust_bin_test
(根據 name
的值)
。
fuchsia_unittest_package("hello-world-rust-tests") {
deps = [ ":bin_test" ]
}
如何執行測試:
fx test hello-world-rust-tests
實用的 Crate
下列樹狀結構內第三方 Crate 可協助您編寫測試:
assert_matches
:提供assert_matches!
巨集,製作模式 確保斷言符合人體工學pretty_assertions
:提供替代的assert_eq!
巨集, 在斷言失敗時,會顯示顏色的差異。
可以加到 BUILD.gn
的「test_deps
」底下。
rustc_binary("bin") {
name = "my_test"
with_unit_tests = true
edition = "2021"
test_deps = [
"//third_party/rust_crates:matches",
"//third_party/rust_crates:pretty_assertions",
]
}