測試:問與答

建議你在這裡新增問題 (和答案)!

問:如何定義新的單元測試?

答:使用適用語言的結構,例如 C++ 的 GTest。您可以定義新的 ,例如:

(在 BUILD.gn 檔案內)

executable("unittests") {
  output_name = "scenic_unittests"
  testonly = true
  sources = ["some_test.cc"],
  deps = [":some_dep"],
}

問:如何確保運作順利?

答:測試會以 FUCHSIA_BUILD_DIR/tests.json 檔案中的項目表示 這是根據 fx set 的引數所產生。建立或更新的步驟 tests.json 稱為建構的生成式階段, fx setfx build 或由 fx gen 明確指定。

如果 fx test 找不到測試,請先查看 FUCHSIA_BUILD_DIR/tests.json。 在大多數情況下,產品設定加上您的 --with 引數 缺少 fx set 指令,或間接執行的狀態測試 嘗試執行如果是這種情況,只要新增測試用的 GN 標籤或 GN 該標籤會間接將測試做為 fx set--with 引數 例如:

fx set ... --with //src/sys:tests

此外,您也可能會為特定產品或變化版本設定停用測試功能。如果 使用 fx set 新增標籤後,fx test 找不到測試。請進行驗證 ,建構規則不會將測試排除。舉例來說 不在涵蓋範圍變化版本中。這可能如下所示: BUILD.gn 檔案:

group("tests") {
  if (!is_coverage) {
    deps = [ ":my-test" ]
  }
}

如果新增的測試位於 fx set 定義的產品設定中,但 仍未顯示在 tests.json 中,您可能需要執行 fx genfx build 更新 tests.json,讓 fx test 知道如何執行。

問:如何在 QEMU 執行個體上執行這個單元測試?

如果您的 QEMU 有網路,連結起來也很簡單 但實際上並非如此

A (使用網路):在一個終端機中,使用 fx qemu -N 啟動 QEMU 執行個體。 接著在另一個終端機上輸入 fx test escher_tests

這個叫用會執行 escher_tests 套件中的所有測試執行檔。

A (沒有網路):啟動 QEMU 執行個體 (fx qemu),然後手動叫用 run-test-suite 指令。

在 QEMU 殼層中輸入 run-test-suite <test_url>

注意!如未連上網路,檔案會載入至 QEMU 執行個體: 啟動。重新建構測試後,您需要關閉並重新啟動 查看重建測試的 QEMU 執行個體。

如要退出 QEMU,請dm shutdown

問:如何在開發裝置上執行單元測試?

答:手動叫用 (例如在 QEMU 中),「或」fx test 至執行中的 裝置。

請注意,啟動的裝置可能不會包含二進位檔,但 fx test 會建構測試二進位檔,提供給裝置並執行。 ,同時將輸出內容傳遞回工作站終端機。輕快!

確認裝置正在執行 (按下 Ctrl-D 鍵即可啟動現有映像檔),並 可連線至工作站

在工作站中,fx test escher_tests 會依序執行所有 測試執行檔。escher_tests

如果只要執行一個測試執行檔,請使用下列指令:

fx test <executable-name>

您可以針對每個來源檔案自動重新建構、安裝及執行測試 fx -i變更。例如:fx -i test escher_tests

問:測試結果會在哪裡擷取?

答:系統會將輸出內容導向至終端機。

有一項方法可將測試輸出內容寫入檔案,包括摘要 JSON 檔案),CQ 漫遊器則是如何收集用於自動化執行的測試輸出內容。

問:如何停用測試?如何尋找並執行停用的測試?

答:方法有幾種。執行上述任一操作時,請務必 回報錯誤,並在程式碼註解中參照該錯誤,該錯誤會停用 測試。

將測試標記為不穩定

方法是在網址末端對應至 tags 欄位的 測試環境。這個做法可以 整個測試目標 (對應至執行檔)。以避免這個目標發生 於修訂佇列中的建構工具執行,並在特殊當機時啟用目標 持續在 CI 中執行測試的建構工具。請務必記下 BUILD.gn 的註解。 變更範例

如果只想停用較大測試目標中的部分測試, 必須將目標分成兩個 GN 目標,並將一個目標標記為「不穩定的」。

僅限 C++ googletest:在名稱前面加上 DISABLED

如要停用大型測試執行檔中的特定測試, 就可以標示為已停用停用測試的依據是名稱 前置字串為 DISABLED_。因此,其中一種找出方法就是 git grep DISABLED_

如要強制執行已停用的測試:fx test escher_tests --also-run-disabled-tests

僅限 Rust:套用 #[ignore] 屬性

如要停用大型 Rust 測試執行檔中的特定測試,您可以 並加上 #[ignore] 標記。應在 #[test] 屬性下方套用。

範例:

#[test]
#[ignore] // TODO(https://fxbug.dev/NNNNN) re-enable this test when de-flaked
fn flaky_test_we_need_to_fix() { ... }

已停用標示為測試

或者,您也可以在 ,內含多個測試執行檔方法是將 BUILD.gn 修改為 如下所示:tests = [ { name = "scenic_unittests", disabled = true } ]。身為 「scenic_unittests」結果會放在以下目錄的 disabled 子目錄中: /pkgfs/packages/<package_name>/0/test,而且不會由 CQ 系統執行。

對測試發表留言

如要停用大型測試執行檔中的特定測試,您可以 。

問:如何自動執行多組測試?如何確保所有依附元件都經過測試?

答:fx test 的主要功能是批次執行。詳情請見 執行 Fuchsia 測試,參考相關範例,瞭解如何執行多個 一次測試或測試套件

此外,您隨時可以將修補程式上傳至 Gerrit 並執行 CQ 模擬測試。

問:如何在 CQ 模擬測試中執行這個單元測試?

答:按一下 CQ 模擬測試 (又稱 +1),則會將變更定義的單位 並在多個機器人上進行測試,每個建構目標各一個 (x86-64arm64releasedebug)。每項工作的輸出頁面都會顯示 所有執行過的測試

問:如何在單元測試中使用一些建構時間構件?

答:最簡單的成果只是來源目錄中的檔案。適用對象 只需要在套件定義的 resources 屬性中加入該屬性即可 單元測試例如,您在 BUILD.gn:

rustc_binary("my-great-app") {
  with_unit_tests = true

  ...
}

test_package("my-great-app-tests") {
  deps = [
    ":my-great-app_test",
  ]

  resources = [
    {
      path = "source.zip"
      dest = "testing.zip"
    }
  ]

這個檔案會在環境中以 /pkg/data/testing.zip 的形式提供 測試二進位檔。

任務:如要取得在建構程序中產生的構件, 您應該將產生構件的規則新增至 data_deps test_package 規則陣列。但我還沒試過。更新這項設定 部分嘗試這樣做 :)