測試:問與答

建議您在此加入自己的問題和答案!

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

答:使用適當的程式語言結構,例如 C++ 適用的 GTest。您可以視需要定義新檔案,例如:

(在 BUILD.gn 檔案中)

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

問:確切運作原理為何?

答:測試會以項目表示,由 GN 根據 fx set 引數產生的 FUCHSIA_BUILD_DIR/tests.json 檔案中的項目表示。建立或更新 tests.json 的步驟稱為建構的產生器階段,由 fx setfx buildfx gen 明確觸發。

如果 fx test 找不到您的測試,請先檢查 FUCHSIA_BUILD_DIR/tests.json。在大多數情況下,直接或間接缺少產品設定和 fx set 指令的 --with 引數,也就是您正嘗試執行的測試。如果是這種情況,請直接在 fx set 指令中加入測試 GN 標籤或 GN 標籤,該標籤會間接將測試做為 --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 套件中的所有測試執行檔。

(無網路):啟動 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.gntests = [ { name = "scenic_unittests", disabled = true } ]。因此,scenic_unittests 會位於 /pkgfs/packages/<package_name>/0/testdisabled 子目錄中,且不會由 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 的形式使用。

待辦事項:如果您想在建構程序中產生的成果,建議您將產生成果的規則新增至 test_package 規則的 data_deps 陣列中。但我還沒試過。請在嘗試時更新本節內容 :)