測試模板

AOSP 包含測試模組的測試模板,這些測試模組不是 VTS 運行程式的 BaseTest 的主機端 Python 子類別。

圖 1.測試模板架構。

開發人員可以使用這些範本來最大限度地減少整合此類測試所需的工作量。本節介紹配置和使用測試模板(位於 VTS testcases/template目錄中)並提供常用模板的範例。

二進位測試模板

使用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 範本支援以下配置選項:

選項名稱值類型描述
二進位測試源字串相對於主機上 vts 測試案例目錄的二進位測試來源路徑。
範例: DATA/nativetest/test
二進位測試工作目錄字串工作目錄(設備端路徑)。
範例: /data/local/tmp/testing/
二進位測試 envp字串二進制的環境變數。
範例: PATH=/new:$PATH
二進位測試參數字串測試參數或標誌。
範例: --gtest_filter=test1
二進位測試 ld 庫路徑字串LD_LIBRARY_PATH環境變數。
範例: /data/local/tmp/lib
二進位測試禁用框架布林值測試前執行adb stop關閉 Android Framework。範例: true
二進位測試停止本機伺服器布林值在測試期間停止所有正確配置的本機伺服器。範例: true
二進位測試類型細繩模板類型。其他範本類型從此範本擴展,但您不必為此範本指定此選項,因為您已經指定了binary-test-source

對於值類型為strings的選項,您可以透過重複配置中的選項來新增多個值。例如,設定binary-test-source兩次(如VtsDeviceTreeEarlyMountTest範例所示)。

測試標籤

您可以透過將測試標籤新增至具有strings值的選項前面並使用::作為分隔符號來新增測試標籤。當包含具有相同名稱但具有不同位數或父目錄的二進位來源時,測試標記特別有用。例如,為了避免來自不同來源目錄的同名來源的檔案推送或結果名稱衝突,您可以為這些來源指定不同的標籤。

如具有兩個dt_early_mount_test來源的VtsDeviceTreeEarlyMountTest範例所示,測試標記是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 中,預設測試格式是從 VTS 運行程式中的 BaseTest 擴展的主機端 Python 測試。若要整合目標端測試,必須先將測試檔案推送到設備,使用 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

選項名稱值類型描述
二進位測試類型細繩模板類型。使用值gtest
gtest 批次模式布林值以批次模式執行 Gtest 二進位。範例: true

一般來說,將gtest-batch-mode設為true會提高效能,但會稍微降低可靠性。在VTS合規性測試中,許多模組使用批次模式來提高效能。然而,為了可靠性,如果未指定模式,則預設為非批次處理。

非批次模式

非批次模式為每個測試案例單獨呼叫 GTest 二進位。例如,如果 GTest 二進位檔案包含 10 個測試案例(透過主機端配置過濾後),則每次使用不同的測試過濾器在裝置 shell 上呼叫該二進位檔案 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 範本包含其他目錄或 Python 腳本中不存在的主機端執行檔。這些測試包括:

  • 在主機上編譯可執行的測試二進位文件
  • shell、Python 或其他語言的可執行腳本

一個例子是VTS Security 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-typehost_binary_test 。與 BinaryTest 範本類似,預設使用二進位檔案名稱作為測試案例名稱。

擴充現有模板

您可以直接在測試配置中使用範本來包含非 Python 測試,或在子類別中擴展它們來處理特定的測試要求。 VTS 儲存庫中的範本具有以下副檔名:

圖 5.擴充 VTS 儲存庫中的現有範本。

我們鼓勵開發人員擴展任何現有模板以滿足任何特定的測試要求。擴充模板的常見原因包括:

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

為了更輕鬆地擴展現有模板,模板包含專門針對每個功能的方法。如果您改進了現有範本的設計,我們鼓勵您為 VTS 程式碼庫做出貢獻。