測試模板

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 模板支持以下配置選項:

選項名稱值類型描述
二進制測試源字符串相對於主機上的 vts 測試用例目錄的二進制測試源路徑。
示例: DATA/nativetest/test
二進制測試工作目錄字符串工作目錄(設備端路徑)。
示例: /data/local/tmp/testing/
二進制測試環境字符串二進制環境變量。
示例: PATH=/new:$PATH
二進制測試參數字符串測試參數或標誌。
示例:-- --gtest_filter=test1
二進制測試 ld 庫路徑字符串LD_LIBRARY_PATH環境變量。
示例: /data/local/tmp/lib
二進制測試禁用框架布爾值運行adb stop以在測試前關閉 Android 框架。示例: 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、錯誤報告、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 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 代碼庫做出貢獻。