Fuchsia test.json 檔案格式

Fuchsia 的建構系統會匯出所有 在建構輸出內容的 tests.json 檔案中,建構包含的測試 目錄中 (例如 $FUCHSIA_DIR/out/default/tests.json)。

Fuchsia 的持續整合基礎架構採用 tests.json 決定要執行的測試,fx test 則用它來確定 就能在本機執行測試tests.json 及其結構定義如下 平台建構和測試的實作細節,而非 的一部分

本文件說明檔案內容,以及檔案產生方式。

產生 test.json 結果

tests.json 檔案是由「tests」產生的API 模組 位於原始碼樹狀結構的根目錄

系統會使用 GN 收集 tests.json 項目的欄位 中繼資料 機制 tests.json 個項目是使用 test_spec GN 範本

tests.json」是由「fx set」自動產生。tests.json 格式受到 GN 使用 GN 的中繼資料機制相對有限。在這之前 Fuchsia 版本也會產生名為 test-list.json 的檔案, 這項資訊是由後續處理 tests.json 所產生,如下所示。

test.json 使用者

許多工具和指令碼會擷取 tests.json 檔案,因為該檔案 指定 Fuchsia 版本的可用測試標準清單。 本節會調查此廣告格式中最重要的消費者。

test_list_tool

test_list_tool 會處理 tests.json。 系統會使用測試的標準清單,使用內含的套件 載入建構套件並加上註解的資訊清單 為您測試了執行方式,以及 其他分類。舉例來說,此功能可以判斷 元件執行模式,並使用 "hermetic": true 標記測試。

test_list_tool 會將這項資訊輸出至 test-list.json 位在 tests.json 旁邊,且是最後一種執行 建構步驟也使用相同的 將 name 鍵當做 tests.json 使用,以便比對項目。

外匯搜尋測試

fx search-tests 指令碼可針對測試名稱提供模糊比對功能 ,協助開發人員找出可供執行的測試。使用 tests.json 中的值做為模糊比對的鍵 ,透過來源樹狀結構搜尋非包含的測試。

FX 測試

fx test 指令是開發人員要測試的進入點 就會在 Fuchsia 來源樹狀結構中執行。此函式會使用 tests.json 執行下列操作: 判斷一組標準測試,然後找出 「test-list.json」和「test_components.json」中的資料 如何執行測試

植物學家 / 檢測員

在基礎架構中,testsharder 依附於 tests.json:根據環境維度分割測試項目。 這項程序會輸出另一個含有欄位的檔案 衍生自 tests.json,接著會傳遞給 botanist 執行測試

test.json 結構

tests.json 是由單一陣列組成的 JSON 檔案。每項 陣列元素對應至 建構過程

測試目標項目有兩個頂層欄位:environments 和 分別對應至測試環境和測試資訊的 test

欄位

環境欄位

environments 欄位是測試環境項目的陣列。 每個「測試環境」項目會指定一個測試環境 可能會在 裝置設定

每個測試環境項目都有一個 dimensions 欄位,其中包含 任意數量的任意維度不過,一般而言 最常見的欄位組合:

  • device_type:指定測試的必要裝置類型。 例如:

    "environments": [
        {
            "dimensions": {
                "device_type": "QEMU"
            }
        }
    ]
    

    這表示測試可在 QEMU 裝置設定中執行。 注意:這不代表測試會在「任何」 QEMU 上執行 而是在 QEMU 執行個體上執行 視 botanist 使用的設定而定

  • cpuos - 指定所需的 CPU 架構與 進行主機測試的作業系統例如:

    "environments": [
        {
            "dimensions": {
                "cpu": "x64",
                "os": "Linux"
            }
        }
    ]
    

    這會指定可在 x64 Linux 系統上執行的測試。

  • tags - 指定資料分割的其他屬性。例如:

    "environments": [
      {
        "tags": [ "e2e-isolated" ]
      }
    ]
    

    這會指定含有「e2e-隔離」標記的測試。

    如果測試含有環境標記,就無法持續執行 除非特別建構設定 選擇使用該代碼執行測試,在此情況下只有測試 該代碼就能執行

測試欄位

test 欄位提供分類、執行、 並設定測試。測試執行器,例如 fx testbotanist 使用這項資料來決定正確的二進位和命令列 執行測試這個介面也包含 其他工具整合 (例如重新建構測試目標) 測試叫用之間的間隔

測試一般分為兩種類型:主機和裝置。主機測試 指的是在要執行的主機系統上 進行測試。裝置測試是指在 目標系統

有些主機測試需要使用 Fuchsia 裝置,有些則不需要。一個 端對端測試 (E2E) 的 os 不是「fuchsia」但保持 的 environments 中指定了 device_type

test 物件包含下列欄位,並會按照測試類型分割:

所有測試

  • name - 測試的名稱。這個值在 tests.json 中是獨一無二的。 通常包含裝置測試和 相對於主機輸出目錄的測試二進位檔路徑 測試。
  • cpu:執行這項測試的 CPU 架構。有備援機制 用於主機測試的 environments 項目,但是 以便用於裝置測試
  • os:執行這項測試的作業系統。與 environments 有重複項目 執行主機測試的項目,但這些資訊是 裝置測試botanist 會使用這個欄位來判斷 測試應該以子程序的形式執行,或是在主機上執行 透過 SSH 連線至目標裝置。
  • label - 產生這個測試項目的 GN 標籤。用於 透過 fx test 執行測試時,知道要重新建構哪些目標。 但僅適用於此標籤實際輸出此標籤的主機測試 用於實際工作環境的測試二進位資料其他類型的測試使用不同的標籤欄位 例如 package_label

僅限主機測試

  • path:測試二進位檔的路徑相對於輸出 目錄。僅針對主機測試顯示。
  • runtime_deps - 到輸出目錄的路徑 (相對於輸出目錄) 包含檔案路徑清單 (相對於輸出) 的 JSON 檔案 目錄),因此應該放在主機已知位置 進行測試檔案格式為 JSON 陣列 檔案路徑字串

僅限裝置測試

  • has_generated_manifest - 如果這是測試元件,則為 True 資訊清單是由 GN 規則所產生,如果測試是主機,系統會省略。 測試,否則傳回 false。用於測試分類和追蹤 自訂資訊清單
  • build_rule:由版本產生,用於進一步測試分類。 舉例來說,判斷測試是否由 fuchsia_unittest_packagefuchsia_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:與這項測試相對應的測試元件網址。 這是測試管理員為裝置執行的網址 測試。
  • 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)",
      "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)",
      "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"
    }
  }
]