測試對應

本節將概略介紹測試對應關係,並說明如何在 Android 開放原始碼計畫 (AOSP) 中輕鬆開始設定測試。

關於測試對應

測試對應是一種以 Gerrit 為基礎的方法,可讓開發人員直接在 Android 來源樹狀結構中建立提交前後的測試規則,並將分支和裝置的決定交由測試基礎架構自行測試。測試對應定義是名為 TEST_MAPPING 的 JSON 檔案,可放在任何來源目錄中。

Atest 可使用 TEST_MAPPING 檔案在相關目錄中執行預先提交測試。使用測試對應時,您只需要調整 Android 來源樹狀結構中的簡單變更,就能新增同一組測試,預先提交檢查。

範例如下:

在 TEST_MAPPING 的 services.core 新增預先提交測試

使用匯入功能在 TEST_MAPPING 中新增預先提交測試

測試對應是以貿易聯盟 (TF) 測試工具執行測試和回報結果。

定義測試群組

透過測試群組測試對應群組測試。測試群組的名稱可以是任何字串。例如,presubmit 可以是在驗證變更時執行一組測試。變更合併後,可使用 postsubmit 測試來驗證建構。

套件建構指令碼規則

為了讓貿易聯盟測試技術針對特定版本執行測試對應的測試模組,這些模組必須針對 SoongLOCAL_COMPATIBILITY_SUITE 選擇以下其中一個套件之一:設定 test_suites

  • 一般測試:不依附裝置專屬功能的測試,例如大多數裝置沒有的供應商專用硬體。大部分測試都應納入一般測試套件,即使它們只特定的 ABI、位元性或如 HWASan 等硬體功能 (每個 ABI 都有獨立的 test_suites 目標),甚至是必須在裝置上執行。
  • device-tests:依裝置特有功能的測試。一般來說,這些測試位於 vendor/ 底下。由於「裝置專屬」不涉及其他裝置可能或沒有的 ABI 或 SoC 功能,而是只涉及「a」裝置特有的功能,因此這項測試對 JUnit 測試的每單位大小都與 GTest 原生測試相同 (即使 ABI 專用,也通常為 general-tests)。

例如:

Android.bp: test_suites: ["general-tests"],
Android.mk: LOCAL_COMPATIBILITY_SUITE := general-tests

設定要在測試套件中執行測試

如需在測試套件中執行測試,該測試:

  • 沒有任何建構供應器
  • 例如在結束後清除所用資源,例如刪除測試期間產生的任何暫存檔案。
  • 將系統設定變更為預設值或原始值
  • 不應假設裝置處於特定狀態,例如已啟用 Root 權限。大部分測試不需要 Root 權限即可執行。如果測試必須要求根層級,則應在 AndroidTest.xml 中使用 RootTargetPreparer 指定,如以下範例所示:
<target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"/>

建立測試對應檔

針對需要測試涵蓋範圍的目錄,只需新增類似下例的 TEST_MAPPING JSON 檔案即可。這些規則可確保當任何檔案出現在該目錄或其子目錄時,這些規則可確保在提交前執行測試。

請參考範例

以下是 TEST_MAPPING 範例檔案 (採用 JSON 格式,但支援註解):

{
  "presubmit": [
    // JUnit test with options and file patterns.
    {
      "name": "CtsWindowManagerDeviceTestCases",
      "options": [
        {
          "include-annotation": "android.platform.test.annotations.RequiresDevice"
        }
      ],
      "file_patterns": ["(/|^)Window[^/]*\\.java", "(/|^)Activity[^/]*\\.java"]
    },
    // Device-side GTest with options.
    {
      "name" : "hello_world_test",
      "options": [
        {
          "native-test-flag": "\"servicename1 servicename2\""
        },
        {
          "native-test-timeout": "6000"
        }
      ]
    }
    // Host-side GTest.
    {
      "name" : "net_test_avrcp",
      "host" : true
    }
  ],
  "postsubmit": [
    {
      "name": "CtsWindowManagerDeviceTestCases"
    }
  ],
  "imports": [
    {
      "path": "frameworks/base/services/core/java/com/android/server/am"
    }
  ]
}

設定屬性

在上述範例中,presubmitpostsubmit 是每個測試群組的名稱。如要進一步瞭解測試群組,請參閱「定義測試群組」。

您可以在 name 屬性的值中設定測試模組貿易聯盟整合測試名稱 (測試 XML 檔案的資源路徑,例如 uiautomator/uiautomator-demo),請注意,name 欄位無法使用 name 類別或測試方法 name。如要縮小測試範圍,您可以使用此處的 include-filter 等選項。請參閱 include-filter 使用範例

測試的 host 設定會指出測試是否在主機上執行無裝置測試。預設值為 false,表示測試需要裝置才能執行。支援的測試類型為 GTest 二進位檔的 HostGTest,以及 JUnit 測試的 HostTest

file_patterns 屬性可讓您設定一份規則運算式字串清單,以比對任何原始碼檔案的相對路徑 (相對於包含 TEST_MAPPING 檔案的目錄)。在上述範例中,只有在任何 Java 檔案以 Window 或 Activity 開頭 (位於 TEST_MAPPING 檔案或其子目錄中相同目錄的情況下),測試 CtsWindowManagerDeviceTestCases 才會在預先提交中執行。反斜線 \必須在 JSON 檔案中逸出反斜線。

imports 屬性可讓您在不複製內容的情況下,將測試納入其他 TEST_MAPPING 檔案。請注意,匯入路徑的父項目錄中的 TEST_MAPPING 檔案也會包含在內。測試對應可讓您使用巢狀匯入功能;也就是說,兩個 TEST_MAPPING 檔案可以相互匯入,且測試對應能夠正確合併內含的測試。

options 屬性包含其他 TradeFed 指令列選項。

如要取得特定測試的完整可用選項清單,請執行:

tradefed.sh run commandAndExit [test_module] --help

如要進一步瞭解選項的運作方式,請參閱交易選項選項處理

使用 Atest 執行測試

如何在本機執行預先提交測試規則:

  1. 前往包含 TEST_MAPPING 檔案的目錄。
  2. 執行下列指令:
atest

系統會執行目前目錄及其父項目錄中 TEST_MAPPING 檔案中設定的預先提交測試。A 測試會找出並執行兩個預先提交測試 (A 和 B)。

這是在目前工作目錄 (CWD) 和父項目錄中的 TEST_MAPPING 檔案中,執行預先提交測試的最簡單方法。Atest 會在 CWD 及其所有父項目錄中找出並使用 TEST_MAPPING 檔案。

建構原始碼

以下範例說明如何跨來源樹狀結構設定 TEST_MAPPING 檔案。

src
├── project_1
│   └── TEST_MAPPING
├── project_2
│   └── TEST_MAPPING
└── TEST_MAPPING

src/TEST_MAPPING的內容:

{
  "presubmit": [
    {
      "name": "A"
    }
  ]
}

src/project_1/TEST_MAPPING的內容:

{
  "presubmit": [
    {
      "name": "B"
    }
  ],
  "postsubmit": [
    {
      "name": "C"
    }
  ],
  "other_group": [
    {
      "name": "X"
    }
  ]}

src/project_2/TEST_MAPPING的內容:

{
  "presubmit": [
    {
      "name": "D"
    }
  ],
  "import": [
    {
      "path": "src/project_1"
    }
  ]}

指定目標目錄

您可以指定要在該目錄中的 TEST_MAPPING 檔案中執行測試的目標目錄。下列指令將執行兩項測試 (A、B)。

atest --test-mapping src/project_1

執行提交後測試規則

您也可以使用這個指令,執行在 src_path (預設為 CWD) 及其父項目錄中的 TEST_MAPPING 中定義的後提交測試規則:

atest [--test-mapping] [src_path]:postsubmit

僅執行不需要裝置的測試

您可以對 Atest 使用 --host 選項,只執行針對不需要裝置的主機設定的測試。如果不使用此選項,Atest 會執行兩個測試,也就是需要裝置和在主機上執行的測試,而且不需要裝置。測試會在兩個不同的套件中執行。

atest [--test-mapping] --host

找出測試群組

您可以在 Atest 指令中指定測試群組。下列指令會執行與 Directory/project_1 中檔案相關的所有 postsubmit 測試,其中只包含一項測試 (C)。

或者,您也可以使用 :all 執行所有測試,無論群組為何。下列指令會執行四個測試 (A、B、C、X):

atest --test-mapping src/project_1:all

包含子目錄

根據預設,使用 Atest 的 TEST_MAPPING 執行測試,只會執行 CWD (或特定目錄) 及其父項目錄中 TEST_MAPPING 檔案中設定的預先提交測試。如要在子目錄中的所有 TEST_MAPPING 檔案中執行測試,請使用 --include-subdir 選項,一併強制 Atest 納入這些測試。

atest --include-subdir

如果沒有 --include-subdir 選項,Atest 將只會執行測試 A。使用 --include-subdir 選項時,Atest 會執行兩個測試 (A、B)。

支援行層級註解

您可以新增行層級的 // 格式註解來納入 TEST_MAPPING 檔案,並在其中說明下方的設定。ATest 和貿易聯盟會將 TEST_MAPPING 預先處理為有效的 JSON 格式,且不含任何註解。為確保 JSON 檔案簡潔且易讀,僅支援行層級的 // 格式註解。

例子:

{
  // For presubmit test group.
  "presubmit": [
    {
      // Run test on module A.
      "name": "A"
    }
  ]
}