測試範本

AOSP 包含測試模組的測試範本,這些模組不是 VTS 執行器 BaseTest 的主機端 Python 子類別。

圖 1. 測試範本架構。

開發人員可以使用這些範本,盡可能減少整合這類測試的作業量。本節將說明如何設定及使用測試範本 (位於 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-sourcebinary-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:: 前置字串。結尾為 32bit64bit 的標記會自動將測試標示為可供使用某個 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 會執行以下動作:

  1. 檢查裝置連線。
  2. 判斷來源檔案的絕對路徑。
  3. 使用 adb push 指令推送檔案。
  4. 在測試完成後刪除檔案。

或者,您也可以使用主機端 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。

圖 2. 非批次模式。

使用非批次模式的好處包括:

  • 測試案例隔離。單一測試案例的當機或無回應情形不會影響其他測試案例。
  • 精細程度:更輕鬆取得個別測試案例的剖析/涵蓋率評估、systrace、bugreport、logcat 等。測試結果和記錄會在每個測試案例完成後立即擷取。

使用非批次模式的缺點包括:

  • 重複載入。每次呼叫 GTest 二進位檔時,系統都會載入相關程式庫並執行初始類別設定。
  • 通訊額外負擔。測試完成後,主機和目標裝置會進行通訊,以便剖析結果和下達指令 (未來可能的最佳化)。

批次模式

在 GTest 批次模式中,系統只會呼叫一次測試二進位檔,並使用長測試篩選器值,其中包含由主機端設定篩選的所有測試案例 (這樣可避免在非批次模式中出現不必要的載入問題)。您可以使用 output.xml 或終端機輸出內容,剖析 GTest 的測試結果。

使用 output.xml (預設) 時:

圖 3. 批次模式,output.xml。

如同在非批次模式中,系統會透過 GTest 輸出 XML 檔案剖析測試結果。不過,由於輸出 XML 會在所有測試完成後產生,因此如果測試案例導致二進位檔或裝置當機,就不會產生結果 XML 檔案。

使用終端機輸出時:

圖 4. 批次模式,終端機輸出。

在 GTest 執行期間,它會以可供測試狀態、結果和記錄解析的格式,將測試記錄和進度列印到終端機。

使用批次模式的好處包括:

  • 測試案例隔離。如果架構在發生當機後,以減少的測試篩選器 (不含已完成和當機的測試案例) 重新啟動二進位檔/裝置,則可提供與非批次模式相同的測試案例隔離層級。
  • 精細程度:提供與非批次模式相同的測試案例精細度。

使用批次模式的缺點包括:

  • 維護費用。如果 GTest 記錄格式有所變更,所有測試都會中斷。
  • 混淆。測試案例可能會輸出類似 GTest 進度格式的內容,這可能會造成格式混淆。

基於這些缺點,我們暫時移除了使用指令列輸出的選項。我們日後會重新審視這個選項,以改善這項功能的可靠性。

HostBinaryTest 範本

HostBinaryTest 範本包含主機端可執行檔,這些檔案不存在於其他目錄或 Python 指令碼中。這些測試包括:

  • 可在主機上執行的編譯測試二進位檔
  • 可執行的 shell、Python 或其他語言指令碼

例如 VTS 安全性 SELinux 政策主機端測試

<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 存放區中的範本具有下列擴充功能:

圖 5. 擴充 VTS 存放區中的現有範本。

建議開發人員針對任何特定測試需求擴充現有範本。常見的擴充範本原因包括:

  • 特殊測試設定程序,例如使用特殊指令準備裝置。
  • 產生不同的測試案例和測試名稱。
  • 透過讀取指令輸出內容或使用其他條件來剖析結果。

為了讓您更輕鬆地擴充現有範本,這些範本包含專屬於各項功能的方法。如果您已改善現有範本的設計,建議您為 VTS 程式碼集做出貢獻。