這個簡單介紹測試對應,並說明如何取得 已開始在 Android 開放原始碼計畫 (AOSP) 中設定測試。
關於測試對應
測試對應是一種以 Gerrit 為基礎的方法,可讓開發人員
以及提交後的測試規則
要測試至測試基礎架構的分支和裝置。
測試對應定義是名稱為 TEST_MAPPING
的 JSON 檔案,您可以
放在任何來源目錄中
Atest 可使用 TEST_MAPPING
檔案,在
或是相關聯的目錄您可以運用測試對應,將同一組測試新增至
以盡量減少 Android 原始碼樹狀結構中的變更進行預先提交檢查。
範例如下:
測試對應必須使用 貿易聯盟 (TF) 測試控管工具 測試執行和結果報告
定義測試群組
使用測試群組測試對應群組測試。測試群組的名稱可以是 任何字串。舉例來說,presubmit 可以是測試群組的名稱 會在驗證變更時執行postsubmit 可用來測試 變更合併後的建構作業
套件建構指令碼規則
如何取得貿易聯盟測試工具
才能針對特定建構執行測試模組,這些模組必須具備
已設為Soong 或 LOCAL_COMPATIBILITY_SUITE
屬性的 test_suites
,例如 到 兩個套房之一
general-tests
適用於不依附裝置個別情況的測試 的功能 (例如大多數裝置沒有的廠商專屬硬體) 。大部分測試都應該位於general-tests
套件中, 一個特定的 ABI、位元性或硬體功能,例如 HWASan (有 請為每個 ABI 建立獨立的test_suites
目標),即使需要執行 應用程式。device-tests
適用於依附裝置專屬功能的測試。 通常這些測試會顯示在vendor/
下方。特定裝置 只有「裝置」專屬的功能,因此適用 測試 JUnit 測試以及 GTest (通常應標示為general-tests
)。
例如:
Android.bp: test_suites: ["general-tests"],
Android.mk: LOCAL_COMPATIBILITY_SUITE := general-tests
設定要在測試套件中執行測試
如要在測試套件中執行測試,測試必須符合下列條件:
- 沒有任何建構提供者。
- 作業完成後就必須進行清理,例如刪除 測試期間產生的檔案
- 必須將系統設定變更為預設值或原始值。
不應假設裝置處於特定狀態,例如 Root 權限就緒。 大多數測試不需要 Root 權限即可執行。如果測試必須 根層級,應該在其中加入
RootTargetPreparer
AndroidTest.xml
, 如以下範例所示:<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": "CtsDeqpTestCases",
"options": [
{
// Use regex in include-filter which is supported in AndroidJUnitTest
"include-filter": "dEQP-EGL.functional.color_clears.*"
}
]
}
],
"imports": [
{
"path": "frameworks/base/services/core/java/com/android/server/am"
}
]
}
設定屬性
在範例中,presubmit
和 postsubmit
是各個字詞的名稱
測試群組。詳情請參閱「定義測試群組」一文
測試群組
您可以設定測試模組或貿易聯盟整合測試的名稱
名稱 (測試 XML 檔案的資源路徑,例如
uiautomator/uiautomator-demo
)
name
屬性值中。請注意,name
欄位無法
請使用 name
類別或測試方法 name
。想要縮小測試範圍
使用 include-filter
等選項。詳情請見
(include-filter
使用範例)。
測試的 host
設定會指出測試是否為無裝置測試
無論是否在主機上運作預設值為 false
,表示測試
需要裝置才能執行支援的測試類型為
HostGTest
:
GTest 二進位檔和 JUnit 適用的 HostTest
測試。
file_patterns
屬性可讓您設定規則運算式字串清單,用於比對任何來源程式碼檔案的相對路徑 (相對於包含 TEST_MAPPING
檔案的目錄)。在範例中,
測試 CtsWindowManagerDeviceTestCases
僅在 Java 檔案時在預先提交中執行
Window
或 Activity
開頭,也就是與
TEST_MAPPING
檔案或其子目錄有所變更。
反斜線 `` 在 JSON 檔案中需要逸出。
imports
屬性可讓您在其他 TEST_MAPPING
檔案中加入測試,而無須複製內容。父項中的 TEST_MAPPING
檔案
以及匯入路徑的目錄。測試對應可允許巢狀匯入,也就是說兩個 TEST_MAPPING
檔案可以互相匯入,且測試對應可合併所包含的測試。
options
屬性包含其他交易指令列選項。
如要取得特定測試的完整可用選項清單,請執行:
tradefed.sh run commandAndExit [test_module] --help
詳情請參閱 換購商品選項處理方式 ,進一步瞭解選項的運作方式。
使用 Atest 執行測試
如何在本機執行預先提交測試規則:
- 前往包含
TEST_MAPPING
檔案的目錄。 執行下列指令:
atest
目前 TEST_MAPPING
檔案中設定的所有預先提交測試
會執行其父項目錄Atest 會找出並執行兩項預提交測試 (A 和 B)。
這是在 TEST_MAPPING
中執行預先提交測試最直接的方法
目前工作目錄 (CWD) 和父項目錄中的檔案。測試
找出及使用 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
中的 TEST_MAPPING
(預設為 CWD) 及其父項目錄:
atest [--test-mapping] [src_path]:postsubmit
僅執行不需要裝置的測試
您可以使用 --host
選項,讓 Atest 僅執行已設定的測試
無需任何裝置的主機。如果沒有這個選項,Atest 會同時執行兩項測試
要求裝置以及在主機上執行,且不需要裝置。
測試是在兩個獨立套件中執行:
atest [--test-mapping] --host
找出測試群組
您可以在 Atest 指令中指定測試群組。下列指令會執行
與 src/project_1
目錄中檔案相關的所有 postsubmit
測試,
只包含一個測試 (C)。
您也可以使用 :all
執行所有測試,不受群組影響。下列
指令會執行四個測試 (A、B、C、X):
atest --test-mapping src/project_1:all
包含子目錄
根據預設,在 TEST_MAPPING
中使用 Atest 執行測試只會執行預先提交作業
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"
}
]
}