測試 Rust 程式碼

本文件說明為 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_binaryrustc_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",
  ]
}