本節將概略介紹測試對應關係,並說明如何在 Android 開放原始碼計畫 (AOSP) 中輕鬆開始設定測試。
關於測試對應
測試對應是一種以 Gerrit 為基礎的方法,可讓開發人員直接在 Android 來源樹狀結構中建立提交前後的測試規則,並將分支和裝置的決定交由測試基礎架構自行測試。測試對應定義是名為 TEST_MAPPING 的 JSON 檔案,可放在任何來源目錄中。
Atest 可使用 TEST_MAPPING 檔案在相關目錄中執行預先提交測試。使用測試對應時,您只需要調整 Android 來源樹狀結構中的簡單變更,就能新增同一組測試,預先提交檢查。
範例如下:
在 TEST_MAPPING 的 services.core 新增預先提交測試
使用匯入功能在 TEST_MAPPING 中新增預先提交測試
測試對應是以貿易聯盟 (TF) 測試工具執行測試和回報結果。
定義測試群組
透過測試群組測試對應群組測試。測試群組的名稱可以是任何字串。例如,presubmit 可以是在驗證變更時執行一組測試。變更合併後,可使用 postsubmit 測試來驗證建構。
套件建構指令碼規則
為了讓貿易聯盟測試技術針對特定版本執行測試對應的測試模組,這些模組必須針對 Soong 或 LOCAL_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"
}
]
}
設定屬性
在上述範例中,presubmit
和 postsubmit
是每個測試群組的名稱。如要進一步瞭解測試群組,請參閱「定義測試群組」。
您可以在 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 執行測試
如何在本機執行預先提交測試規則:
- 前往包含 TEST_MAPPING 檔案的目錄。
- 執行下列指令:
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"
}
]
}