Sharded IRemoteTest Test Çalıştırıcısı Yazma

Bir test çalıştırıcısı yazarken ölçeklenebilirlik hakkında düşünmek önemlidir. Kendinize şunu sorun: "Test yürütücüm 200 bin test senaryosu çalıştırmak zorunda olsaydı" bu ne kadar sürerdi?

Sharding, Trade Federation'da bulunan cevaplardan biridir. Koşucunun ihtiyaç duyduğu tüm testleri paralelleştirilebilecek birkaç parçaya bölmeyi gerektirir.

Bu sayfa, koşucunuzu Tradefed için nasıl parçalanabilir hale getirebileceğinizi açıklar.

Uygulamak için arayüz

Tek ve en önemli arayüz TF tarafından shardable dikkate alınması gereken uygulamaktır IShardableTest : iki yöntem içermektedir, split(int numShard) ve split() .

Senin Kırma işlemi talep kırık sayısını bağlı olacak ise, uygulamalıdır split(int numShard) . Aksi takdirde, uygulamak split() .

Bir TF test komutu parametreleri Kırma işleminde yürütüldüğünde --shard-count ve --shard-index tüm aracılığıyla, TF yineler IRemoteTest uygulayan olanlar aramaya IShardableTest . Eğer bulunursa, arayacak split yeni bir olsun IRemoteTest belirli kırığın test durumlarda bir alt kümesini çalıştırmak için nesneyi.

Bölünmüş uygulama hakkında ne bilmeliyim?

  • Koşucunuz yalnızca bazı koşullara bağlı olarak parçalayabilir; Bu durumda dönüş içinde null kırığından vermedi zaman.
  • Mantıklı olduğu kadar bölmeye çalışın: Koşucunuzu mantıklı olan yürütme birimine bölün. Bu gerçekten koşucunuza bağlı. Örneğin: HostTest Sınıf seviyesinde kanatlı bir edilir, her bir test sınıf ayrı kırıkta konur.
  • Mantıklıysa, parçalamayı biraz kontrol etmek için bazı seçenekler ekleyin. Örneğin: AndroidJUnitTest bir sahiptir ajur-max-shard bakılmaksızın istenen sayının bu bölünmüş olabilir kırıkların maksimum sayısını belirtmek için.

Ayrıntılı örnek uygulama

İşte uygulayan bir örnek kod parçacığı olduğunu IShardableTest başvurabileceğiniz. Kodun tamamı (https://android.googlesource.com/platform/tools/tradefederation/+/refs/heads/master/test_framework/com/android/tradefed/testtype/InstalledInstrumentationsTest.java) adresinde mevcuttur.

/**
 * 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;
    }
    ...
}

Bu örnek basitçe kendisinin yeni bir örneğini oluşturur ve ona parça parametreleri ayarlar. Ancak, bölme mantığı testten teste tamamen farklı olabilir; ve deterministik olduğu ve toplu olarak ayrıntılı alt kümeler sağladığı sürece sorun yok.

Bağımsızlık

Parçaların bağımsız olması gerekir! Uygulamanıza yarattığı İki kırıkları split sizin koşucu birbirlerine ya da paylaşmak kaynaklarına bağımlılığı olmamalıdır.

Parçaların bölünmesi deterministik olmalı! Bu, aynı koşullar göz önüne alındığında, aynı zamanda zorunludur, senin split yöntemi hep aynı sırayla kırıkların tam aynı liste dönmelidir.

NOT: kırıkların her biri farklı TF örneklerinde çalışabilir olduğundan, elde etmek için önemlidir split birbirini dışlayan ve deterministik bir şekilde topluca kapsamlı olan mantık verimleri alt kümelerini.

Yerel olarak bir test nasıl parçalanır

Yerel bir TF bir test shard için tek yapmanız gereken ekleyebilir --shard-count komut satırına seçeneği.

tf >run host --class com.android.tradefed.UnitTests --shard-count 3

Ardından TF, her parça için otomatik olarak komutlar oluşturacak ve bunları çalıştıracaktır.

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)

Test sonucu toplama

TF, parçalanmış çağrılar için herhangi bir test sonucu toplaması yapmadığından, raporlama hizmetinizin bunu desteklediğinden emin olmanız gerekir.