Google is committed to advancing racial equity for Black communities. See how.
Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Tulis Sharded IRemoteTest Test Runner

Saat menulis runner pengujian, penting untuk memikirkan tentang skalabilitas. Tanyakan pada diri Anda, "jika pelari pengujian saya harus menjalankan 200K kasus pengujian" berapa lama waktu yang dibutuhkan?

Sharding adalah salah satu jawaban yang tersedia di Federasi Perdagangan. Ini membutuhkan pemisahan semua tes yang dibutuhkan pelari menjadi beberapa bagian yang dapat diparalelkan.

Halaman ini menjelaskan cara membuat runner shardable Anda untuk Tradefed.

Antarmuka untuk diterapkan

Satu-satunya antarmuka terpenting untuk diterapkan agar dianggap dapat dipecah oleh TF adalah IShardableTest , yang berisi dua metode: split(int numShard) dan split() .

Jika sharding Anda bergantung pada jumlah shard yang diminta, Anda harus menerapkan split(int numShard) . Jika tidak, terapkan split() .

Ketika perintah uji TF dijalankan dengan parameter sharding --shard-count dan --shard-index , TF melakukan iterasi melalui semua IRemoteTest untuk mencari yang mengimplementasikan IShardableTest . Jika ditemukan, itu akan memanggil split untuk mendapatkan objek IRemoteTest baru untuk menjalankan subset kasus uji untuk IRemoteTest tertentu.

Apa yang harus saya ketahui tentang implementasi split?

  • Anda pelari mungkin beling pada beberapa kondisi saja; dalam hal ini, kembalikan null jika Anda tidak melakukan shard.
  • Cobalah untuk membagi sebanyak yang masuk akal: bagi pelari Anda menjadi unit eksekusi yang masuk akal untuk itu. Itu sangat tergantung dari pelari Anda. Misalnya: HostTest di - shard di tingkat Kelas, setiap kelas pengujian diletakkan di pecahan terpisah.
  • Jika masuk akal, tambahkan beberapa opsi untuk sedikit mengontrol sharding. Misalnya: AndroidJUnitTest memiliki ajur-max-shard untuk menentukan jumlah maksimum pecahan yang dapat dipisahkan, berapa pun jumlah yang diminta.

Penerapan contoh terperinci

Berikut ini contoh cuplikan kode yang menerapkan IShardableTest yang dapat Anda rujuk. Kode lengkapnya tersedia di (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;
    }
    ...
}

Contoh ini hanya membuat instance baru dari dirinya sendiri dan menetapkan parameter shard padanya. Namun, logika pemisahan bisa sangat berbeda dari satu pengujian ke pengujian lainnya; dan selama itu deterministik dan menghasilkan himpunan bagian yang lengkap secara kolektif, tidak apa-apa.

Kemerdekaan

Pecahan harus independen! Dua pecahan yang dibuat oleh penerapan split di runner Anda tidak boleh saling bergantung atau berbagi sumber daya.

Pemisahan pecahan harus deterministik! Ini juga wajib, mengingat ketentuan yang sama, metode split Anda harus selalu mengembalikan daftar pecahan yang sama persis dalam urutan yang sama.

CATATAN: Karena setiap pecahan dapat berjalan pada instans TF yang berbeda, sangat penting untuk memastikan logika split menghasilkan subset yang saling eksklusif dan secara kolektif lengkap secara deterministik.

Cara membagi pengujian secara lokal

Untuk membagi pengujian pada TF lokal, Anda cukup menambahkan opsi --shard-count ke baris perintah.

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

Kemudian TF akan secara otomatis mengeluarkan perintah untuk setiap pecahan dan menjalankannya.

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)

Agregasi hasil tes

Karena TF tidak melakukan agregasi hasil tes untuk pemanggilan sharded, Anda perlu memastikan layanan pelaporan Anda mendukungnya.