Bölünmüş IRemoteTest test çalıştırıcı yazma

Test çalıştırıcı yazarken ölçeklenebilirlik konusunu göz önünde bulundurmak önemlidir. Kendinize "Test çalıştırıcım 200.000 test durumu çalıştırmak zorunda kalsaydı ne kadar sürerdi?" diye sorun.

Parçalama, Ticaret Federasyonu'nda sunulan yanıtlardan biridir. Bu, çalıştırıcının ihtiyaç duyduğu tüm testlerin paralelleştirilebilecek birkaç parçaya bölünmesini gerektirir.

Bu sayfada, koşucunuzu Tradefed için nasıl parçalanabilir hale getireceğiniz açıklanmaktadır.

Uygulanacak arayüz

TF tarafından parçalanabilir olarak kabul edilmek için uygulanması gereken en önemli arayüz IShardableTest'tir. Bu arayüzde iki yöntem bulunur: split(int numShard) ve split().

Parçalama işleminiz istenen parça sayısına bağlı olacaksa split(int numShard) işlevini uygulamanız gerekir. Aksi takdirde split() öğesini uygulayın.

Parçalama parametreleri --shard-count ve --shard-index ile bir TF testi komutu yürütüldüğünde TF, IShardableTest'ü uygulayanları bulmak için tüm IRemoteTest'leri yineler. Bulunursa belirli bir parça için test durumlarının bir alt kümesini çalıştırmak üzere yeni bir IRemoteTest nesnesi almak için split işlevini çağırır.

Bölünmüş uygulama hakkında bilmem gerekenler nelerdir?

  • Çalıştırıcınız yalnızca belirli koşullarda parçalama yapabilir. Bu durumda, parçalama yapmadığınızda null değerini döndürün.
  • Mümkün olduğunca fazla bölmeye çalışın: Çalıştırıcınızı, kendisi için mantıklı olan yürütme birimlerine bölün. Bu, koşucunuza bağlıdır. Örneğin: HostTest sınıf düzeyinde parçalanır ve her test sınıfı ayrı bir parçaya yerleştirilir.
  • Mantıklıysa parçalama işlemini biraz kontrol etmek için bazı seçenekler ekleyin. Örneğin: AndroidJUnitTest, istenen sayıdan bağımsız olarak bölünebileceği maksimum parça sayısını belirtmek için ajur-max-shard içerir.

Ayrıntılı örnek uygulama

Aşağıda, IShardableTest'yı uygulayan bir örnek kod snippet'i verilmiştir. Tam kod şu adreste mevcuttur: (https://android.googlesource.com/platform/tools/tradefederation/+/refs/heads/android16-release/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;
    }
    ...
}

Bu örnek, yalnızca kendisinin yeni bir örneğini oluşturur ve parçalama parametrelerini ayarlar. Ancak bölme mantığı testten teste tamamen farklı olabilir. Belirleyici olduğu ve toplu olarak kapsamlı alt kümeler sağladığı sürece sorun yoktur.

Independence

Parçalar birbirinden bağımsız olmalıdır. Çalıştırıcınızda split uygulamanızla oluşturulan iki parça birbirine bağımlı olmamalı veya kaynakları paylaşmamalıdır.

Parçaların bölünmesi deterministik olmalıdır. Aynı koşullar göz önüne alındığında, split yönteminizin her zaman aynı parçalar listesini aynı sırada döndürmesi de zorunludur.

NOT: Her parça farklı TF örneklerinde çalışabileceğinden, split mantığının, karşılıklı olarak hariç tutulan ve toplu olarak kapsamlı alt kümeler oluşturduğundan emin olmak çok önemlidir.

Bir testi yerel olarak parçalama

Yerel bir TF'de testi parçalamak için komut satırına --shard-count seçeneğini eklemeniz yeterlidir.

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

Ardından TF, her parça için otomatik olarak komutlar oluşturur ve bunları çalıştırı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ğırmalar için herhangi bir test sonucu toplama işlemi yapmadığından raporlama hizmetinizin bunu desteklediğinden emin olmanız gerekir.