Melaporkan metrik atau data dari uji Tradefed

Halaman ini menjelaskan cara melaporkan metrik beserta hasil pengujian saat menulis pengujian di Tradefed.

Manfaat pencatatan log melalui pipeline Tradefed adalah untuk menemukan metrik Anda sekaligus samping hasil fungsional Anda. Pencatatan metrik dapat dilakukan secara alami dalam pengujian, sehingga memudahkan penulis tes untuk menambahkan lebih banyak instrumentasi.

DeviceTestCase - Gaya JUnit3

Jika pengujian Anda memperluas DeviceTestCase dalam pengujian gaya JUnit3, Anda bisa memanggil metode addTestMetric(String key, String value) dari dalam kasus pengujian apa pun untuk dilaporkan metrik. Fungsi ini dapat dipanggil beberapa kali selama kuncinya unik.

Contoh:

    public static class TestMetricTestCase extends DeviceTestCase {

        public void testPass() {
            addTestMetric("key1", "metric1");
        }

        public void testPass2() {
            addTestMetric("key2", "metric2");
        }
    }

Jika ingin mencatat file agar tersedia di result_reporters, Anda dapat panggil metode addTestLog(String dataName, LogDataType dataType, InputStreamSource dataStream) dari dalam kasus pengujian apa pun untuk melaporkan file ke log.

Contoh:

    public static class TestLogTestCase extends DeviceTestCase {

        public void testPass() {
            try (InputStreamSource source = getDevice().getScreenshot()) {
                addTestLog("screenshot", LogDataType.PNG, source);
            }
        }
    }

TestCase - pengujian JUnit3 reguler

Jika Anda ingin melaporkan metrik di dalam Tradefed dari TestCase JUnit3 biasa , kode tersebut harus dikonversi menjadi MetricTestCase sebagai gantinya, yang merupakan class yang sama persis dengan metode tambahan: addTestMetric(String key, String value)

DeviceJUnit4ClassRunner - Gaya JUnit4

Jika pengujian gaya JUnit4 Anda berjalan dengan DeviceJUnit4ClassRunner, Anda juga dapat mencatat metrik dalam kasus pengujian (di dalam @Test) untuk dilaporkan oleh Tradefed. Anda harus menggunakan aturan TestMetrics untuk melaporkan metrik.

Contoh:

    @RunWith(DeviceJUnit4ClassRunner.class)
    public static class Junit4TestClass {

        @Rule
        public TestMetrics metrics = new TestMetrics();

        @Test
        public void testPass5() {
            // test log through the rule.
            metrics.addTestMetric("key", "value");
        }

        @Test
        public void testPass6() {
            metrics.addTestMetric("key2", "value2");
        }
    }

Untuk melaporkan file, Anda harus menggunakan aturan TestLogData untuk melaporkannya.

Contoh:

    @RunWith(DeviceJUnit4ClassRunner.class)
    public static class Junit4TestClass {

        @Rule
        public TestLogData logs = new TestLogData();

        @Test
        public void testPass5() {
            // test log through the rule.
            try (InputStreamSource source = getDevice().getScreenshot()) {
                logs.addTestLog("screenshot", LogDataType.PNG, source);
            }
        }
    }

IRemoteTest - Uji Tradefed murni

Jika Anda menulis kelas atau runner Test Tradefed Anda sendiri, Anda akan menerapkannya IRemoteTest dan dapatkan ITestInvocationListener melalui metode run(). Pemroses ini dapat digunakan untuk mencatat metrik sebagai berikut:

    listener.testLog(String dataName, LogDataType type of data, InputStreamSource data);

Pengumpul metrik yang diperdagangkan

Tradefed menyediakan objek metrics_collector khusus untuk mengumpulkan metrik dalam paralel dari pengujian.

Di sisi host

BaseDeviceMetricCollector dapat diterapkan untuk mengumpulkan metrik dari sisi host dan melaporkannya sebagai bagian dari pemanggilan pengujian. Sejumlah kolektor umum sudah tersedia untuk berbagai kasus penggunaan, tetapi kami selalu menyambut kontribusi baru.

Untuk menentukan kolektor yang akan digunakan dalam pemanggilan Tradefed, Anda hanya perlu menambahkan objek ke konfigurasi XML Tradefed Anda:

Contoh:

  <metrics_collector class="com.android.tradefed.device.metric.AtraceCollector">
      <option name="categories" value="freq"/>
  </metrics_collector>

Beberapa kolektor yang sudah ada saat ini: * Pengumpul Suhu yang mengumpulkan suhu secara berkala selama pengujian. * AtraceCollector yang mengumpulkan menggunakan 'atrace' untuk setiap kasus pengujian.

Di sisi perangkat

Saat menjalankan pengujian sisi perangkat (Instrumentasi, pengujian UIAutomator, dll.), memiliki kolektor pada pengumpulan sisi host secara asinkron mungkin tidak ideal. Misalnya, screenshot yang diambil secara asinkron kemungkinan besar akan melewatkan menginginkan layar dan tidak berguna.

Untuk memenuhi kasus penggunaan ini, versi sisi perangkat kolektor kami dibuat dan dapat digunakan di semua 'AndroidJUnitRunner' instrumentasi. BaseMetricListener dapat diterapkan untuk otomatis melaporkan metrik yang dikumpulkan dengan cara yang sepenuhnya kompatibel dengan pipeline pelaporan Tradefed.

Jika Anda menggunakan 'AndroidJUnitTest' runner dari Tradefed, Anda cukup menentukan opsi baris perintah berikut agar kolektor Anda dapat berjalan dengan pengujian:

  --device-listeners android.device.collectors.ScreenshotListener

PERHATIAN: Agar class kolektor dapat diselesaikan saat runtime, APK instrumentasi kemungkinan besar harus menyertakannya secara statis dengan menambahkan pada makefile Anda seperti berikut:

  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib

Kontribusi ke kolektor sisi perangkat juga diperbolehkan.

Pertimbangan khusus untuk suite

Untuk suite seperti CTS yang memiliki konfigurasi tingkat atas yang menjalankan beberapa modul tidak perlu menentukan metrics_collector di setiap modul konfigurasi (AndroidTest.xml). Hal ini sebenarnya dilarang.

Untuk memastikan pengumpulan metrik diterapkan secara merata ke setiap modul, hanya konfigurasi tingkat teratas (misalnya, cts.xml) yang dapat menentukan metrics_collector seperti yang dijelaskan di atas. Kolektor ini akan diterapkan dan dijalankan pada setiap modul suite.

Mengumpulkan file log perangkat dari modul

Pengaturan tersedia agar pengujian sisi perangkat memberi tahu bahwa beberapa file harus dikumpulkan.

AndroidTest.xml dapat menentukan kolektor yang akan mencari file di perangkat Anda dan menariknya.

  <metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector">
      <!-- repeatable: Pattern of key of a FILE we listen on that should be pulled -->
      <option name = "pull-pattern-keys" value = "ScreenshotListener_.*" />

      <!-- repeatable: The key of the DIRECTORY to pull -->
      <option name = "directory-keys" value = "<example-key: /sdcard/atrace_logs>" />
  </metrics_collector>

Dengan menentukan pola dan kunci ini, kolektor jika melihat kunci tersebut akan mencoba menarik dan mencatat file terkait.

Agar kunci ini dapat dibuat, pengujian sisi perangkat (instrumentasi) harus menentukan file yang harus dicatat. Hal ini dilakukan dengan cara sama dengan sisi host (dijelaskan di atas).

  1. Tambahkan collector-device-lib ke APK pengujian Anda di file make:
  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
  1. Gunakan @rule yang kami berikan untuk membuat log file:
    @RunWith(AndroidJUnit4.class)
    public static class Junit4TestClass {

        @Rule
        public TestLogData logs = new TestLogData();

        @Test
        public void testPass5() {
            // test log through the rule.
            File logFile = new File("whatever");
            logs.addTestLog("KEY", logFile);
        }
    }

Nama KEY dalam contoh di atas adalah nama yang akan digunakan untuk file dilaporkan. Ini adalah nama yang harus Anda cocokkan di FilePullerDeviceMetricCollector untuk otomatis ditarik. seharusnya nama yang unik.

CATATAN: Setelah file ditarik, FilePullerDeviceMetricCollector akan otomatis membersihkannya dari perangkat.

Di mana saya dapat menemukan metrik?

Class ini bergantung pada result_reporter yang ditentukan dalam konfigurasi XML Anda.