Melaporkan metrik atau data dari pengujian Tradefed

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

Manfaat logging melalui pipeline Tradefed adalah untuk menemukan metrik Anda bersama dengan hasil fungsional Anda. Pencatatan metrik dapat dilakukan secara sangat alami dalam pengujian, sehingga memudahkan penulis pengujian untuk menambahkan lebih banyak instrumentasi.

DeviceTestCase - gaya JUnit3

Jika pengujian Anda memperluas DeviceTestCase dalam jenis pengujian gaya JUnit3, Anda dapat memanggil metode addTestMetric(String key, String value) dari dalam kasus pengujian apa pun untuk melaporkan metrik. Metode 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 memanggil metode addTestLog(String dataName, LogDataType dataType, InputStreamSource dataStream) dari dalam kasus pengujian mana pun untuk melaporkan file yang akan dicatat.

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 class TestCase JUnit3 biasa, class tersebut harus dikonversi menjadi MetricTestCase 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 akan 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 - Pengujian Tradefed murni

Jika Anda menulis class atau runner Pengujian Tradefed sendiri, Anda akan menerapkan IRemoteTest dan mendapatkan ITestInvocationListener melalui metode run(). Listener ini dapat digunakan untuk mencatat metrik sebagai berikut:

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

Pengumpul metrik Tradefed

Tradefed menyediakan objek metrics_collector khusus untuk mengumpulkan metrik secara paralel dengan pengujian.

Di sisi host

BaseDeviceMetricCollector dapat diterapkan untuk mengumpulkan metrik apa pun dari sisi host dan melaporkannya sebagai bagian dari pemanggilan pengujian. Sejumlah pengumpul generik sudah tersedia untuk berbagai kasus penggunaan, tetapi kami selalu menerima kontribusi baru.

Untuk menentukan pengumpul yang akan digunakan dalam pemanggilan Tradefed, Anda cukup menambahkan objek ke konfigurasi XML Tradefed:

Contoh:

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

Beberapa pengumpul yang ada saat ini: * TemperatureCollector yang mengumpulkan suhu secara berkala selama pengujian berjalan. * AtraceCollector yang mengumpulkan menggunakan 'atrace' untuk setiap kasus pengujian.

Di sisi perangkat

Saat menjalankan pengujian sisi perangkat (Pengujian Instrumentasi, UIAutomator, dll.), memiliki pengumpul di sisi host yang mengumpulkan secara asinkron mungkin tidak ideal. Misalnya, screenshot yang diambil secara asinkron kemungkinan besar tidak akan menampilkan layar yang diinginkan dan tidak berguna.

Untuk memenuhi kasus penggunaan ini, versi sisi perangkat dari pengumpul kami ada dan dapat digunakan dalam instrumentasi 'AndroidJUnitRunner' apa pun. BaseMetricListener dapat diterapkan untuk melaporkan metrik yang dikumpulkan secara otomatis dengan cara yang sepenuhnya kompatibel dengan pipeline pelaporan Tradefed.

Jika Anda menggunakan runner 'AndroidJUnitTest' dari Tradefed, Anda cukup menentukan opsi command line berikut agar pengumpul berjalan dengan pengujian Anda:

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

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

  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib

Kontribusi ke pengumpul sisi perangkat juga diterima.

Pertimbangan khusus untuk rangkaian

Untuk rangkaian pengujian seperti CTS yang memiliki konfigurasi tingkat teratas yang menjalankan beberapa konfigurasi modul, tidak perlu menentukan metrics_collector di setiap konfigurasi modul (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. Pengumpul ini akan diterapkan dan dijalankan terhadap setiap modul rangkaian produk.

Mengumpulkan file log perangkat dari modul

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

AndroidTest.xml dapat menentukan pengumpul yang akan mencari file di perangkat 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, pengumpul akan mencoba menarik dan mencatat file terkait jika melihat kunci tersebut.

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

  1. Tambahkan collector-device-lib ke APK pengujian Anda di file build:
  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
  1. Gunakan @rule yang kami berikan untuk mencatat 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 melaporkan file. Ini adalah nama yang harus Anda cocokkan di FilePullerDeviceMetricCollector agar ditarik secara otomatis. Nama ini harus unik.

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

Di mana saya dapat menemukan metrik?

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