測試:問與答

歡迎您在這裡新增自己的問題 (和答案)!

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

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

(在 BUILD.gn 檔案中)

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

問:如何確保執行?

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

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

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

測試也可能會在特定產品或變化版本設定中停用。如果 fx test 在使用 fx set 新增標籤後找不到測試,請確認測試並未遭到建構規則排除。舉例來說,測試可能會在涵蓋率變化版本中遭到排除。這可能會在測試的 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,請按下 power 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 機器人收集自動執行測試輸出內容的方式。

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

答:有幾種方法可以達成這個目的。在執行上述任何操作時,請務必提出錯誤,並在停用測試的程式碼中註解中參照該錯誤。

將測試標記為不穩定

方法是在測試環境中,將「flaky」新增至 tags 欄位。這會在整個測試目標 (對應至可執行檔) 上運作。這麼做可避免這個目標在提交佇列的建構工具上執行,並在持續整合中繼續執行測試的特殊不穩定建構工具上啟用目標。請務必在 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 的形式提供。

TODO:如果您希望產生的構件是建構程序的一部分,建議您將產生構件的規則新增至 test_package 規則的 data_deps 陣列。但我還沒試過。請在您嘗試時更新此部分 :)