AOSP 包含測試模組的測試範本,這些模組不是 VTS 執行器 BaseTest 的主機端 Python 子類別。
開發人員可以使用這些範本,盡可能減少整合這類測試的作業量。本節將說明如何設定及使用測試範本 (位於 VTS 的 testcases/template 目錄中),並提供常用範本的範例。
BinaryTest 範本
使用 BinaryTest 範本,在 VTS 中整合在目標裝置上執行的測試。目標端測試包括:
- 以 C++ 為基礎的測試編譯並推送至裝置
- 以二進位檔編譯的目標端 Python 測試
- 可在裝置上執行的Shell 指令碼
無論是否使用 BinaryTest 範本,這些測試都可以整合至 VTS。
將目標測試與 BinaryTest 範本整合
BinaryTest 範本可協助開發人員輕鬆整合目標端測試。在大多數情況下,您可以在 AndroidTest.xml
中新增幾行簡單的設定。VtsDeviceTreeEarlyMountTest 的設定範例:
<configuration description="Config for VTS VtsDeviceTreeEarlyMountTest."> ... <test class="com.android.tradefed.testtype.VtsMultiDeviceTest"> <option name="test-module-name" value="VtsDeviceTreeEarlyMountTest"/> <option name="binary-test-source" value="_32bit::DATA/nativetest/dt_early_mount_test/dt_early_mount_test" /> <option name="binary-test-source" value="_64bit::DATA/nativetest64/dt_early_mount_test/dt_early_mount_test" /> <option name="test-timeout" value="5m"/> </test> </configuration>
在這個配置中:
binary-test-source
和binary-test-type
是特定範本。- 指定測試二進位檔來源的相對主機路徑,可讓範本處理準備、檔案推送、測試執行、結果剖析和清理作業。
- 這個範本包含子類別可覆寫的測試案例建立相關方法。
- 這個範本假設每個測試二進位模組都有一個測試案例,且預設使用二進位來源檔案名稱做為測試案例名稱。
設定選項
BinaryTest 範本支援下列設定選項:
選項名稱 | 值類型 | 說明 |
---|---|---|
binary-test-source | 字串 | 相對於主機上 vts 測試案例目錄的二進位測試來源路徑。 範例: DATA/nativetest/test |
binary-test-working-directory | 字串 | 工作目錄 (裝置端路徑)。 範例: /data/local/tmp/testing/ |
binary-test-envp | 字串 | 二進位檔案的環境變數。 範例: PATH=/new:$PATH |
binary-test-args | 字串 | 測試引數或標記。 範例: --gtest_filter=test1 |
binary-test-ld-library-path | 字串 | LD_LIBRARY_PATH 環境變數。範例: /data/local/tmp/lib |
binary-test-disable-framework | 布林值 | 執行 adb stop ,在測試前關閉 Android 架構。示例:true |
binary-test-stop-native-servers | 布林值 | 在測試期間停止所有已正確設定的原生伺服器。示例:
true |
binary-test-type | string | 範本類型。其他範本類型會從這個範本延伸,但您已指定 binary-test-source ,因此不必為這個範本指定這個選項。 |
如果選項的值類型為 strings
,您可以在設定中重複選項,藉此新增多個值。例如,將 binary-test-source
設定兩次 (如 VtsDeviceTreeEarlyMountTest
範例所示)。
測試代碼
您可以新增測試標記,方法是將標記前置於含有 strings
值的選項,並使用 ::
做為分隔符號。當您要納入名稱相同但位元數或父目錄不同的二進位來源時,測試標記就特別實用。舉例來說,如果來源來自不同來源目錄,且名稱相同,您可以為這些來源指定不同的標記,以免發生檔案推送或結果名稱衝突的情況。
如 VtsDeviceTreeEarlyMountTest
範例所示,其中包含兩個 dt_early_mount_test
來源,測試標記是 binary-test-source
上的 _32bit::
和 _64bit::
前置字串。結尾為 32bit
或 64bit
的標記會自動將測試標示為可供使用某個 ABI 位元數的測試,也就是說,標記為 _32bit
的測試不會在 64 位元 ABI 上執行。不指定標記等同於使用空白字串做為標記。
同一個標記的選項會分組,並與其他標記分開。舉例來說,具有 _32bit
標記的 binary-test-args
只會套用至具有相同標記的 binary-test-source
,並在具有相同標記的 binary-test-working-directory
中執行。對於二進位測試,binary-test-working-directory
選項為選用,可讓您為標記指定單一工作目錄。如未指定 binary-test-working-directory
選項,系統會為每個代碼使用預設目錄。
標記名稱會直接附加至結果報表中的測試案例名稱。舉例來說,標記為 _32bit
的測試案例 testcase1
會在結果報表中顯示為 testcase1_32bit
。
不使用 BinaryTest 範本整合目標端測試
在 VTS 中,預設的測試格式是主機端 Python 測試,從 VTS 執行器的 BaseTest 延伸而來。如要整合目標端測試,您必須先將測試檔案推送至裝置,使用 Shell 指令執行測試,然後使用主機端 Python 指令碼剖析結果。
推送測試二進位檔
建議您使用 VtsFilePusher
目標準備工具推送檔案。例子:
<target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher"> <option name="push" value="DATA/test->/data/local/tmp/test"/> </target_preparer>
VtsFilePusher
會執行以下動作:
- 檢查裝置連線。
- 判斷來源檔案的絕對路徑。
- 使用
adb push
指令推送檔案。 - 在測試完成後刪除檔案。
或者,您也可以使用主機端 Python 測試指令碼手動推送檔案,這個指令碼會遵循類似的程序。
執行測試
將檔案推送至裝置後,請在主機端 Python 測試指令碼中使用 Shell 指令執行測試。例子:
device = self.android_devices[0] res = device.shell.Execute(["chmod a+x /data/local/tmp/test", "/data/local/tmp/test"]) asserts.AssertFalse(any(res[return_codes]))
GtestBinaryTest 範本
GtestBinaryTest 範本會代管 GTest 測試二進位檔,每個測試二進位檔通常都包含多個測試案例。這個範本會覆寫設定、建立測試案例和解析結果的方法,進而擴充 BinaryTest 範本,因此會繼承所有 BinaryTest 設定。
GtestBinaryTest 會新增 gtest-batch-mode
選項:
選項名稱 | 值類型 | 說明 |
---|---|---|
binary-test-type | string | 範本類型。使用 gtest 值。 |
gtest-batch-mode | 布林值 | 以批次模式執行 Gtest 二進位檔。範例:true |
一般來說,將 gtest-batch-mode
設為 true
可提高效能,但可靠性會稍微降低。在 VTS 法規遵循測試中,許多模組都會使用批次模式來提升效能。不過,為了確保可靠性,如果未指定模式,系統會預設為非批次模式。
非批次模式
非批次模式會針對每個測試案例個別呼叫 GTest 二進位檔。舉例來說,如果 GTest 二進位檔包含 10 個測試案例 (經過主機端設定篩選後),則系統會在裝置殼層上以不同的測試篩選器呼叫二進位檔 10 次。針對每個測試案例,範本會產生並剖析不重複的 GTest 結果輸出 XML。
使用非批次模式的好處包括:
- 測試案例隔離。單一測試案例的當機或無回應情形不會影響其他測試案例。
- 精細程度:更輕鬆取得個別測試案例的剖析/涵蓋率評估、systrace、bugreport、logcat 等。測試結果和記錄會在每個測試案例完成後立即擷取。
使用非批次模式的缺點包括:
- 重複載入。每次呼叫 GTest 二進位檔時,系統都會載入相關程式庫並執行初始類別設定。
- 通訊額外負擔。測試完成後,主機和目標裝置會進行通訊,以便剖析結果和下達指令 (未來可能的最佳化)。
批次模式
在 GTest 批次模式中,系統只會呼叫一次測試二進位檔,並使用長測試篩選器值,其中包含由主機端設定篩選的所有測試案例 (這樣可避免在非批次模式中出現不必要的載入問題)。您可以使用 output.xml 或終端機輸出內容,剖析 GTest 的測試結果。
使用 output.xml (預設) 時:
如同在非批次模式中,系統會透過 GTest 輸出 XML 檔案剖析測試結果。不過,由於輸出 XML 會在所有測試完成後產生,因此如果測試案例導致二進位檔或裝置當機,就不會產生結果 XML 檔案。
使用終端機輸出時:
在 GTest 執行期間,它會以可供測試狀態、結果和記錄解析的格式,將測試記錄和進度列印到終端機。
使用批次模式的好處包括:
- 測試案例隔離。如果架構在發生當機後,以減少的測試篩選器 (不含已完成和當機的測試案例) 重新啟動二進位檔/裝置,則可提供與非批次模式相同的測試案例隔離層級。
- 精細程度:提供與非批次模式相同的測試案例精細度。
使用批次模式的缺點包括:
- 維護費用。如果 GTest 記錄格式有所變更,所有測試都會中斷。
- 混淆。測試案例可能會輸出類似 GTest 進度格式的內容,這可能會造成格式混淆。
基於這些缺點,我們暫時移除了使用指令列輸出的選項。我們日後會重新審視這個選項,以改善這項功能的可靠性。
HostBinaryTest 範本
HostBinaryTest 範本包含主機端可執行檔,這些檔案不存在於其他目錄或 Python 指令碼中。這些測試包括:
- 可在主機上執行的編譯測試二進位檔
- 可執行的 shell、Python 或其他語言指令碼
<configuration description="Config for VTS Security SELinux policy host-side test cases"> ... <test class="com.android.tradefed.testtype.VtsMultiDeviceTest"> <option name="test-module-name" value="VtsSecuritySelinuxPolicyHost"/> <option name="binary-test-source" value="out/host/linux-x86/bin/VtsSecuritySelinuxPolicyHostTest" /> <option name="binary-test-type" value="host_binary_test"/> </test> </configuration>
HostBinaryTest 不會擴充 BinaryTest 範本,但會使用類似的測試設定。在上述範例中,binary-test-source
選項會指定測試執行檔的代管端相對路徑,而 binary-test-type
則為 host_binary_test
。與 BinaryTest 範本類似,二進位檔案名稱預設會用於測試案例名稱。
擴充現有範本
您可以在測試設定中直接使用範本,納入非 Python 測試,或是在子類別中擴充測試,以便處理特定測試需求。VTS 存放區中的範本具有下列擴充功能:
建議開發人員針對任何特定測試需求擴充現有範本。常見的擴充範本原因包括:
- 特殊測試設定程序,例如使用特殊指令準備裝置。
- 產生不同的測試案例和測試名稱。
- 透過讀取指令輸出內容或使用其他條件來剖析結果。
為了讓您更輕鬆地擴充現有範本,這些範本包含專屬於各項功能的方法。如果您已改善現有範本的設計,建議您為 VTS 程式碼集做出貢獻。