在編寫測試運行程序時,考慮可伸縮性很重要。問問自己,“如果我的測試運行程序必須運行 200K 測試用例”,需要多長時間?
分片是 Trade Federation 中可用的答案之一。它需要將運行器需要的所有測試分成幾個可以並行化的塊。
本頁介紹如何使您的跑步者可用於 Tradefed。
實現接口
要實現被 TF 視為可分片的最重要的接口是IShardableTest ,它包含兩個方法: split(int numShard)
和split()
。
如果您的分片將取決於請求的分片數量,您應該實現split(int numShard)
。否則,執行split()
。
當使用分片參數--shard-count
和--shard-index
執行 TF 測試命令時,TF 會遍歷所有IRemoteTest
以查找實現IShardableTest
的那些。如果找到,它將調用split
來獲取一個新的IRemoteTest
對象來運行特定分片的測試用例子集。
關於拆分實現,我應該知道什麼?
- 您的跑步者只能在某些條件下進行分片;在這種情況下,當您沒有分片時返回
null
。 - 嘗試盡可能多地拆分:將您的跑步者拆分為對它有意義的執行單元。這真的取決於你的跑步者。例如: HostTest在 Class 級別進行分片,每個測試類都放在一個單獨的分片中。
- 如果有意義,請添加一些選項來稍微控制分片。例如: AndroidJUnitTest有一個
ajur-max-shard
來指定它可以拆分的最大分片數,無論請求的數量是多少。
詳細示例實現
這是一個實現IShardableTest
的示例代碼片段,您可以參考。完整代碼可在 (https://android.googlesource.com/platform/tools/tradefederation/+/refs/heads/master/test_framework/com/android/tradefed/testtype/InstalledInstrumentationsTest.java)
/**
* Runs all instrumentation found on current device.
*/
@OptionClass(alias = "installed-instrumentation")
public class InstalledInstrumentationsTest
implements IDeviceTest, IResumableTest, IShardableTest {
...
/** {@inheritDoc} */
@Override
public Collection<IRemoteTest> split(int shardCountHint) {
if (shardCountHint > 1) {
Collection<IRemoteTest> shards = new ArrayList<>(shardCountHint);
for (int index = 0; index < shardCountHint; index++) {
shards.add(getTestShard(shardCountHint, index));
}
return shards;
}
// Nothing to shard
return null;
}
private IRemoteTest getTestShard(int shardCount, int shardIndex) {
InstalledInstrumentationsTest shard = new InstalledInstrumentationsTest();
try {
OptionCopier.copyOptions(this, shard);
} catch (ConfigurationException e) {
CLog.e("failed to copy instrumentation options: %s", e.getMessage());
}
shard.mShardIndex = shardIndex;
shard.mTotalShards = shardCount;
return shard;
}
...
}
這個例子簡單地創建了一個自己的新實例並為其設置分片參數。但是,拆分邏輯可能因測試而異;並且只要它是確定性的並且產生集體詳盡的子集,就可以了。
獨立
分片需要獨立!您在運行器中實現split
創建的兩個分片不應相互依賴或共享資源。
分片分裂需要是確定性的!這也是強制性的,在相同的條件下,您的split
方法應始終以相同的順序返回完全相同的分片列表。
注意:由於每個分片可以在不同的 TF 實例上運行,因此確保split
邏輯產生的子集是互斥的,並且以一種確定性的方式共同窮舉,這一點至關重要。
如何在本地分片測試
要在本地 TF 上對測試進行分片,您只需將--shard-count
選項添加到命令行即可。
tf >run host --class com.android.tradefed.UnitTests --shard-count 3
然後 TF 會自動為每個分片生成命令並運行它們。
tf >l i
Command Id Exec Time Device State
3 0m:03 [null-device-2] running stub on build 0 (shard 1 of 3)
3 0m:03 [null-device-1] running stub on build 0 (shard 0 of 3)
3 0m:03 [null-device-3] running stub on build 0 (shard 2 of 3)
測試結果匯總
由於 TF 不會對分片調用進行任何測試結果聚合,因此您需要確保您的報告服務支持它。