Fuchsia 的建構系統會將建構作業中包含的所有測試相關結構化資訊,匯出至建構輸出目錄 (例如 $FUCHSIA_DIR/out/default/tests.json) 中的 tests.json 檔案。
Fuchsia 的持續整合基礎架構會使用 tests.json 判斷要執行的測試,而 fx test 則會使用這項資訊判斷可在本機執行的測試。tests.json 和其結構定義是平台建構和測試的實作詳細資料,不屬於 SDK。
本文說明檔案內容和檔案產生方式。
正在生成 tests.json
tests.json 檔案會在 regenerator.py 中執行 gn-gen 後立即產生。
系統會使用 GN 中繼資料機制,收集 tests.json 項目適用的欄位。tests.json 項目是透過 test_spec GN 範本從 GN 檔案註冊。
tests.json是由 fx set 自動產生。tests.json 格式受限於可從 GN 輕鬆產生的內容,因為 GN 的中繼資料機制相對有限。為解決這些限制,Fuchsia 建構作業也會產生名為 test-list.json 的檔案,這是透過後續處理 tests.json 所產生,詳情如下。
tests.json 消費者
各種工具和指令碼都會擷取 tests.json 檔案,因為這是特定 Fuchsia 建構版本可用測試的標準清單。本節將介紹格式最主要的消費者。
test_list_tool
test_list_tool 會處理 tests.json。
使用標準測試清單,並透過內含的套件資訊清單資訊載入建構套件,以及為每個測試加上註解,說明測試的執行方式和額外的分類標記。舉例來說,它可以判斷測試元件是否以密封方式執行,並使用 "hermetic":
true 標記測試。
test_list_tool 會將這項資訊輸出至 tests.json 旁邊的 test-list.json 檔案,並在建構所有套件後,做為最後的建構步驟之一執行。這項功能會使用與 tests.json 相同的專屬 name 鍵,以便比對項目。
fx search-tests
fx search-tests 指令碼會對測試名稱進行模糊比對,協助開發人員找出可執行的測試。除了透過來源樹狀結構搜尋未納入的測試外,這個工具還會使用 tests.json 中的值做為模糊比對的鍵。
fx test
fx test 指令是面向開發人員的進入點,用於測試 Fuchsia 來源樹狀結構中的執行作業。它會使用 tests.json 判斷標準測試集,然後在 test-list.json 和 test_components.json 中找出相關聯的資料,判斷測試的執行方式。
botanist / testsharder
在基礎架構中,testsharder 依附於 tests.json,可根據環境維度將測試項目分片。該程序的輸出內容是另一個包含衍生自 tests.json 的欄位,然後傳遞至 botanist (在執行測試的機器人上)。
tests.json 結構
tests.json 是由單一陣列組成的 JSON 檔案。陣列中的每個元素都會對應至建構版本中的單一測試目標項目。
「測試目標」項目有兩個頂層欄位,分別是 environments 和 test,對應「測試環境」和「測試資訊」。
欄位
環境欄位
environments 欄位是測試環境項目的陣列。每個「測試環境」項目都指定測試可執行的單一環境,而 testsharder 會使用這個欄位,在裝置設定之間分片測試。
每個「測試環境」項目都有單一欄位 dimensions,其中包含任意數量的任意維度。不過,最常見的欄位通常有兩組:
device_type- 指定測試所需的裝置類型。 例如:"environments": [ { "dimensions": { "device_type": "QEMU" } } ]這表示可在 QEMU 裝置設定上執行的測試。注意:這不代表測試會在任何 QEMU 裝置上執行,而是指測試會在以
botanist所用設定為基礎的 QEMU 執行個體上執行。cpu和os:指定主機測試所需的 CPU 架構和作業系統。例如:"environments": [ { "dimensions": { "cpu": "x64", "os": "Linux" } } ]這會指定可在 x64 Linux 系統上執行的測試。
tags- 指定資料分割的其他屬性。例如:"environments": [ { "tags": [ "e2e-isolated" ] } ]這會指定標記為「e2e-isolated」的測試。
除非建構設定特別選擇執行含有環境標記的測試,否則在持續整合建構作業中,不會執行含有環境標記的測試。如果選擇執行,則只會執行含有該標記的測試。
測試欄位
test 欄位提供有關如何分類、執行及設定測試的資訊。fx test 和 botanist 等測試執行器會使用這項資料,判斷要執行測試的正確二進位檔和指令列。此外,這項資訊也適用於其他工具整合,例如在測試呼叫之間重建測試目標。
測試通常分為兩種:主機和裝置。主機測試是指主機系統上的二進位路徑,用於執行測試。裝置測試是指使用 Test Manager 在目標系統上執行的元件網址。
部分主機測試需要 Fuchsia 裝置,部分則不需要。端對端測試 (E2E) 具有非「紫紅色」的 os,但仍有在 environments 中指定的 device_type。
test 物件包含下列欄位,依測試類型劃分:
所有測試
name- 測試名稱。這個值在tests.json中不得重複。通常包含裝置測試的測試元件 URL,以及主機測試輸出目錄的測試二進位檔路徑。cpu- 執行這項測試的 CPU 架構。與主機測試的environments項目重複,但這是裝置測試的唯一資訊來源。os- 執行這項測試的 OS。與主機測試的environments項目重複,但這是裝置測試的唯一資訊來源。botanist會使用這個欄位判斷是否應在主機上以子程序形式執行測試,或透過 SSH 在目標裝置上執行測試。label- 產生這項測試記錄的 GN 標籤。用於瞭解從fx test執行測試時要重建的目標,但僅適用於實際輸出真實測試二進位的標籤主機測試。其他類型的測試會使用不同的標籤欄位,例如package_label。source_label- 與測試對應的建構系統無關 (GN 或 Bazel) 標籤。用於判斷測試原始碼的位置,以判斷擁有權和其他中繼資料。
僅限主機測試
path- 測試二進位檔的路徑 (相對於輸出目錄)。僅適用於主機測試。runtime_deps- 包含檔案路徑清單的 JSON 檔案路徑 (相對於輸出目錄),這些檔案路徑 (相對於輸出目錄) 應放在主機測試已知的位置,供執行階段使用。檔案格式為檔案路徑字串的 JSON 陣列。list_cases_argument- (選用) 用於列出測試套件中個別測試案例的指令列引數。fx test --list會使用這項資訊,找出要回報和選取的特定測試案例。目前僅支援主機測試,具體來說,就是 Mobly 測試和 Python 單元測試。
僅限裝置測試
has_generated_manifest- 如果這是測試元件,且資訊清單是由 GN 規則產生,則為 True;如果測試是主機測試,則省略;否則為 False。用於測試分類,以及使用自訂資訊清單追蹤測試。build_rule- Generated by the build for further test categorization. 舉例來說,瞭解測試是由fuchsia_unittest_package還是fuchsia_test_package規則建立,就很有意義。log_settings- 字典,可能包含下列欄位:max_severity- 這個欄位會覆寫測試的預設最高記錄嚴重程度。依預設,發出 ERROR 記錄的測試會失敗,但這個欄位會指示測試執行器以不同記錄層級導致失敗的模式執行。min_severity- 用於指示測試元件在這個層級而非預設層級發出記錄。根據預設,測試會自行選擇記錄嚴重性下限。
package_label:產生這個測試所屬套件的 GN 標籤。僅適用於裝置測試。fx test會使用這項功能重建包含測試的套件,然後再執行測試。component_label- 產生這項測試的測試元件的 GN 標籤。如果fx search-tests中找不到相符的測試 (以及所有其他標籤欄位),系統會使用這個欄位進行模糊比對。僅適用於裝置測試。package_manifests- 參與建構測試套件的每個套件資訊清單路徑 (相對於輸出目錄)。用於判斷在fx test中建構測試後,要重新發布哪些套件。僅適用於裝置測試。package_url- 與這項測試相應的測試元件網址。 這是要求 Test Manager 執行的網址,用於裝置測試。parallel- 覆寫預設測試執行元件並行 (以整數表示)。通常用於指示測試執行人員,告知ffx test不要平行執行有串音的測試案例。將這個值設為1會停用平行執行測試案例,而設為數字> 1則會強制平行執行測試案例 (如果個別測試執行元件支援的話)。
範例
主機測試
[
{
"environments": [
{
// This test runs on the infra shard for Linux x64.
"dimensions": {
"cpu": "x64",
"os": "Linux"
}
}
],
"test": {
"cpu": "x64",
"label": "//src/performance/trace2json:trace2json_tests(//build/toolchain:host_x64)",
"source_label": "//src/performance/trace2json:trace2json_tests",
"name": "host_x64/trace2json_tests",
"os": "linux",
// This is the path to execute the test both locally and in infra.
"path": "host_x64/trace2json_tests",
// The deps listed in this file must be placed in a known
// location for the test.
"runtime_deps": "host_x64/gen/src/performance/trace2json/trace2json_tests.deps.json"
}
}
]
裝置測試
[
{
"environments": [
// This test runs on the AEMU shard in infra.
{
"dimensions": {
"device_type": "AEMU"
}
}
],
"test": {
// This test was created using fuchsia_unittest_package
"build_rule": "fuchsia_unittest_package",
"component_label": "//src/diagnostics/lib/sampler-config:sampler-config-tests_component(//build/toolchain/fuchsia:x64)",
"cpu": "x64",
// This test specified its own manifest.
"has_generated_manifest": false,
"label": "//src/diagnostics/lib/sampler-config:sampler-config-tests_test_sampler-config-tests_component(//build/toolchain/fuchsia:x64)",
"source_label": "//src/diagnostics/lib/sampler-config:sampler-config-tests_test_sampler-config-tests_component",
"log_settings": {
// Any ERROR or FATAL logs will force this test to fail.
"max_severity": "WARN"
},
"name": "fuchsia-pkg://fuchsia.com/sampler-config-tests#meta/sampler-config-tests.cm",
"os": "fuchsia",
"package_label": "//src/diagnostics/lib/sampler-config:sampler-config-tests(//build/toolchain/fuchsia:x64)",
// These manifests can be used for deep inspection of the
// contents of this test.
"package_manifests": [
"obj/src/diagnostics/lib/sampler-config/sampler-config-tests/package_manifest.json"
],
"package_url": "fuchsia-pkg://fuchsia.com/sampler-config-tests#meta/sampler-config-tests.cm"
}
}
]