這是測試映射的簡要介紹以及如何開始在 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"
}
]
}
設定屬性
在上面的例子中, presubmit
和postsubmit
是每個測試組的名稱。有關測試組的更多信息,請參閱定義測試組。
測試模組的名稱或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 運行測試
若要在本機執行預提交測試規則:
- 前往包含 TEST_MAPPING 檔案的目錄。
- 運行命令:
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"
}
]
}