Android 9包括基於運行供應商測試套件(VTS)測試的設備獲取給定HAL實例的服務名稱的支持。運行支持服務名稱的VTS HAL測試,使開發人員可以在目標端和主機端VTS測試運行中自動測試供應商擴展,多個HAL和多個HAL實例。
關於服務名稱
正在運行的HAL服務的每個實例都使用服務名稱進行註冊。
在早期版本的Android中,要求運行VTS HAL測試的開發人員在getService()
為測試客戶端設置正確的服務名稱,或者將該名稱保留為空並回退為默認服務名稱。這種方法的缺點包括:
- 依靠測試開發人員的知識來設置正確的服務名稱。
- 默認情況下僅限於針對單個服務實例進行測試。
- 手動維護服務名稱(即,由於名稱是硬編碼的,因此如果服務名稱更改,則必須手動更新它們)。
在Android 9中,開發人員可以根據被測設備自動獲取給定HAL實例的服務名稱。這種方法的優點包括支持測試:
- 供應商HAL擴展。例如,當供應商具有在具有自定義服務名稱的供應商設備上運行的camera.provider HAL的實現時,VTS可以識別供應商實例並對其進行測試。
- 多個HAL實例。例如,當
graphics.composer
HAL具有兩個實例(一個服務名稱為“ default”,一個服務名稱為“ vr”)時,VTS可以識別兩個實例並針對每個實例運行測試。 - 多HAL測試。在測試具有多個實例的多個HAL時使用例如,在運行VTS測試以驗證密鑰主控和網守HAL如何協同工作時,VTS可以測試這些HAL的所有服務實例組合。
目標端測試
為了在目標端測試中啟用服務名稱識別,Android 9包括一個可自定義的測試環境( VtsHalHidlTargetTestEnvBase
),該環境提供以下接口:
- 在測試中註冊目標HAL。
- 列出所有已註冊的HAL。
- 獲取由VTS框架提供的已註冊HAL的服務名稱。
此外,VTS框架還提供以下運行時支持:
- 預處理測試二進製文件以獲得所有已註冊的測試HAL。
- 標識所有正在運行的服務實例,並獲取每個實例的服務名稱(根據
vendor/manifest.xml
檢索)。 - 計算所有實例組合(以支持多個HAL測試)。
- 為每個服務實例(組合)生成一個新測試。
例:
設置服務名稱感知目標端測試
要為目標端服務名稱感知測試設置測試環境,請執行以下操作:
- 定義
testEnvironment
基於VtsHalHidlTargetTestEnvBase
和註冊檢驗的HAL:#include <VtsHalHidlTargetTestEnvBase.h> class testEnvironment : public::testing::VtsHalHidlTargetTestEnvBase { virtual void registerTestServices() override { registerTestService<IFoo>(); } };
- 使用測試環境提供的
getServiceName()
來傳遞服務名稱:::testing::VtsHalHidlTargetTestBase::getService<IFoo>(testEnv->getServiceName<IFoo>("default")); // "default" is the default service name you want to use.
- 在
main()
和initTest
註冊測試環境:int main(int argc, char** argv) { testEnv = new testEnvironment(); ::testing::AddGlobalTestEnvironment(testEnv); ::testing::InitGoogleTest(&argc, argv); testEnv->init(argc, argv); return RUN_ALL_TESTS(); }
有關其他示例,請參考VtsHalCameraProviderV2_4TargetTest.cpp
。
VTS主機端測試
VTS主機端測試在主機端運行測試腳本,而不是在目標設備上運行測試二進製文件。要為這些測試啟用服務名稱意識,您可以使用主機端模板針對不同的參數多次運行相同的測試腳本(類似於gtest參數化測試)。
- hal測試腳本指定測試中的目標HAL服務。
- 所述
hal_hidl_host_test
(子類param_test
)開出註冊從測試腳本的測試HAL(S),標識對應的服務名(多個)用於測試HAL,然後生成服務名稱的組合(用於多HAL測試)作為測試參數。它還提供了一種方法getHalServiceName()
,該方法根據傳遞給當前測試用例的參數返回相應的服務名稱。 - param_test模板支持邏輯以接受參數列表並針對每個參數運行所有給定的測試用例。即,對於每個測試用例,它將生成N個新的參數化測試用例(N =參數的大小),每個參數都有給定的參數。
設置可識別服務名稱的主機端測試
要為主機端服務名稱感知測試設置測試環境,請執行以下操作:
- 在測試腳本中指定目標HAL服務:
TEST_HAL_SERVICES = { "android.hardware.foo@1.0::IFoo" }
- 調用
getHalServiceName()
並將名稱傳遞給init hal:self.dut.hal.InitHidlHal( target_type='foo', target_basepaths=self.dut.libPaths, target_version=1.0, target_package='android.hardware.foo', target_component_name='IFoo', hw_binder_service_name =self.getHalServiceName("android.hardware.foo@1.0::IFoo"), bits=int(self.abi_bitness))
有關其他示例,請參考VtsHalMediaOmxStoreV1_0HostTest.py
。
註冊測試HAL
Android中的先前版本中,VTS識別的測試HAL使用<precondition-lshal>
在配置選項AndroidTest.xml
。這種方法難以維護(因為它依賴於開發人員正確配置測試並相應地更新配置)且不准確(因為它僅包含軟件包和版本信息,而不包含接口信息)。
在Android 9中,VTS使用服務名稱識別來識別測試HAL。註冊的測試HAL還可用於:
- 前提條件檢查。在運行HAL測試之前,VTS可以確認測試HAL在目標設備上可用,如果沒有,請跳過測試(請參閱VTS可測試性檢查)。
- 覆蓋率測量。 VTS通過有關要測量的測試HAL服務的知識來支持跨進程代碼覆蓋率的度量(即,刷新hal服務過程的覆蓋率)。