測試測繪

這是測試映射的簡要介紹以及如何開始在 Android 開源專案 (AOSP) 中輕鬆配置測試的說明。

關於測試映射

測試映射是一種基於 Gerrit 的方法,允許開發人員直接在 Android 原始碼樹中建立提交前和提交後測試規則,並將要測試的分支和裝置的決策留給測試基礎設施本身。測試映射定義是名為 TEST_MAPPING 的 JSON 文件,可以放置在任何來源目錄中。

Atest可以使用 TEST_MAPPING 檔案在關聯目錄中執行預提交測試。透過測試映射,您可以透過在 Android 原始碼樹中進行簡單的變更來新增相同的測試集以進行預提交檢查。

請參閱這些範例:

將預提交測試新增至 services.core 的 TEST_MAPPING

使用導入將預先提交測試新增至工具/dexter 的 TEST_MAPPING

測試映射依賴Trade Federation (TF) 測試工具來執行測試和報告結果。

定義測試組

測試映射透過測試組將測試分組。測試組的名稱可以是任何字串。例如,預提交可以用於在驗證變更時執行一組測試。提交後測試可用於在合併變更後驗證建置。

套件建置腳本規則

為了讓Trade Federation Test Harness為給定的建置執行測試映射的測試模組,這些模組必須為Soong設定test_suite或為 Make 設定LOCAL_COMPATIBILITY_SUITE到這兩個套件之一:

  • 常規測試- 不依賴特定於設備的功能的測試(例如大多數設備不具備的特定於供應商的硬體)。大多數測試應該在通用測試套件中,即使它們特定於一種 ABI 或位數或硬體功能,例如 HWASan(每個 ABI 都有一個單獨的 test_suites 目標),即使它們必須在裝置上運行。
  • 設備測試- 依賴設備特定功能的測試。通常這些測試可以在vendor/下找到。因為「特定於裝置」並不是指其他裝置可能具有或不具有的 ABI 或 SoC 功能,而僅指裝置獨有的功能,因此這適用於 JUnit 測試,就像 GTest 本機測試一樣(通常應該如此)是general-tests即使它們是特定於 ABI 的)。

例子:

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

配置測試以在測試套件中執行

對於在測試套件內運行的測試,測試:

  • 不得有任何建置提供者。
  • 完成後必須進行清理,例如,刪除測試期間產生的任何臨時檔案。
  • 將系統設定變更為預設值或原始值。
  • 不應假定裝置處於某種狀態,例如 root 就緒。大多數測試不需要 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是每個測試組的名稱。有關測試組的更多信息,請參閱定義測試組

測試模組名稱Trade Federation 整合測試名稱(測試 XML 檔案的資源路徑,例如uiautomator/uiautomator-demo )可以在name屬性的值中設定。請注意,名稱欄位不能使用類別name或測試方法name 。若要縮小要執行的測試範圍,您可以在此處使用include-filter等選項。請參閱(包含過濾器範例用法)。

測試的主機設定指示測試是否是在主機上執行的無設備測試。預設值為false ,這表示測試需要設備才能運作。支援的測試類型是用於 GTest 二進位檔案的HostGTest和用於 JUnit 測試的HostTest

file_patterns屬性可讓您設定正規表示式字串列表,用於匹配任何原始程式碼檔案的相對路徑(相對於包含 TEST_MAPPING 檔案的目錄)。在上面的範例中,只有當存在於 TEST_MAPPING 檔案或其任何子目錄的相同目錄中的任何以 Window 或 Activity 開頭的 java 檔案發生變更時,測試CtsWindowManagerDeviceTestCases才會在預先提交中執行。反斜線 \ 需要轉義,因為它們在 JSON 檔案中。

匯入屬性可讓您將測試包含在其他 TEST_MAPPING 檔案中,而無需複製內容。請注意,導入路徑的父目錄中的 TEST_MAPPING 檔案也將包含在內。測試映射允許嵌套導入;這意味著兩個 TEST_MAPPING 檔案可以相互匯入,並且測試映射能夠正確合併包含的測試。

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

要獲取給定測試的可用選項的完整列表,請執行:

tradefed.sh run commandAndExit [test_module] --help

有關期權如何運作的更多詳細信息,請參閱TradeFed 期權處理

使用 Atest 運行測試

若要在本機執行預提交測試規則:

  1. 前往包含 TEST_MAPPING 檔案的目錄。
  2. 運行命令:
atest

執行目前目錄及其父目錄的 TEST_MAPPING 檔案中配置的所有預提交測試。 Atest 將尋找並執行兩個預提交測試(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 命令中指定測試組。以下命令將執行與目錄 src/project_1 中的檔案相關的所有提交後測試,該目錄僅包含一個測試 (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和 Trade Federation 將把 TEST_MAPPING 預處理為有效的 JSON 格式,不含註解。為了保持 JSON 檔案乾淨且易於閱讀,僅支援行級// - 格式註解。

例子:

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