當測試語料庫很大或執行時間變長時,我們提供了將測試拆分到多個設備的可能性:分片。
分片具有測試運行器支持分片的先決條件。
大多數主要測試運行程序已經支持分片,因此不需要額外的工作。這些已經支持分片:儀器測試、主機端驅動測試、GTest。
我們在 Tradefed 中支持兩種類型的分片:本地和分佈式。它們有一些相似之處,所以我們將描述共同的屬性,然後是每個屬性的細節。
共同屬性
兩種形式的分片都假設測試運行者的相同屬性:分片需要是獨立的和確定性的。兩個分片的第一步是構建測試的完整有序列表,然後將它們分成不同的組/分片。
分片形式的主要區別在於它們執行測試的方式。更多詳細信息請參見以下部分。
本地分片
本地分片意味著執行分片調用所涉及的所有設備都連接到同一物理主機。
執行
本地分片通過創建一個需要執行的測試池並讓每個設備在空閒時輪詢測試(即使用前一個測試完成)來利用連接到同一主機的所有設備。這導致優化的設備利用率。我們也稱之為動態分片。
選項
--shard-count XX
分佈式分片
分佈式分片意味著執行分片調用所涉及的所有設備都可以存在於任何地方並連接到不同的物理主機。
執行
分佈式分片在構建測試列表時發生,每個分片的內容將繼續執行僅當前請求的分片。所以所有分佈式分片首先構建相同的列表,然後執行它的互斥子集,這導致所有測試都被執行。
這種形式的主要屬性是分片完全不知道彼此,並且可以獨立失敗。
主要缺點是分片長度不一定是平衡的,因為我們無法提前預測每個分片中每個測試的運行時間。使分佈在每個分片中具有大致相同數量的測試用例。
選項
--shard-count XX --shard-index XX
令牌分片
令牌分片只能與本地分片一起使用。該標誌在非本地分片用例中將不起作用。有時,參與分片的設備之一擁有其他設備沒有的特殊資源,例如 SIM 卡。某些測試可能僅在該特殊資源可用時才有效,否則會失敗。
令牌分片是我們對此類用例的解決方案。測試模塊能夠在其AndroidTest.xml
中聲明他們需要哪些特殊資源,Tradefed 會將測試路由到具有該資源的設備。
XML 配置
<option name="config-descriptor:metadata" key="token" value="SIM_CARD" />
令牌的value
與 Tradefed 的TokenProperty匹配,並與TokenProviderHelper中的處理程序相關聯。
這允許針對可以正確執行測試的設備運行測試模塊。
如果沒有設備可以運行測試怎麼辦?
如果沒有可用的設備具有與測試模塊匹配的資源,則測試模塊將失敗並跳過,因為它無法正確執行。
例如,如果測試模塊請求 SIM 卡運行,但沒有設備具有 SIM 卡,則測試模塊失敗。
執行
將此功能標誌傳遞到 Tradefed 主命令行:
--enable-token-sharding