歡迎您在這裡新增自己的問題 (和答案)!
問:如何定義新的單元測試?
答:請使用適合語言的結構,例如 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 set
、fx 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 gen
或 fx 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.gn
:tests = [ { name = "scenic_unittests", disabled = true } ]
。因此,scenic_unittests
會放入 /pkgfs/packages/<package_name>/0/test
的 disabled
子目錄,且不會由 CQ 系統執行。
註解測試
如要停用大型測試可執行檔中的特定測試,您可以將定義該測試的程式碼註解掉。
問:如何自動執行一連串測試?如何確保已測試所有依附元件?
答:fx test
的主要功能是批次執行。請參閱「執行 Fuchsia 測試」,瞭解如何同時執行多個測試或測試套件。
此外,您隨時可以將修補程式上傳至 Gerrit,並執行 CQ 模擬測試。
問:如何在 CQ 模擬執行中執行這個單元測試?
答:點選 CQ 模擬執行 (又稱 +1) 後,系統會將變更的單元測試正確定義,並在多個機器人上執行,每個建構目標各一個 (x86-64 與 arm64、release 與 debug)。每個工作都會有輸出頁面,顯示所有執行的測試。
問:如何在單元測試中使用一些建構時間構件?
答:最簡單的構件只是來源目錄中的檔案。您只需將其新增至單元測試套件定義的 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
陣列。但我還沒試過。請在您嘗試時更新此部分 :)