Bir Tradefed testinden alınan metrikler veya veriler nasıl raporlanır?

Bu sayfada, Tradefed'de bir test yazarken test sonuçlarıyla birlikte metriklerin nasıl raporlanacağı açıklanmaktadır.

Tradefed ardışık düzeni üzerinden oturum açmanın yararı, işlevsel sonuçlarınızın yanında metriklerinizi bulmaktır. Metriklerin günlüğe kaydedilmesi testler içinde çok doğal bir şekilde yapılabilir, bu da test yazarlarının daha fazla enstrümantasyon eklemesini kolaylaştırır.

DeviceTestCase - JUnit3 stili

Testiniz JUnit3 tarzı bir test türünde DeviceTestCase'i genişletiyorsa, bir metriği bildirmek için herhangi bir test addTestMetric(String key, String value) yöntemini çağırabilirsiniz. Anahtar benzersiz olduğu sürece bu, birden çok kez çağrılabilir.

Örnek vermek:

    public static class TestMetricTestCase extends DeviceTestCase {

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

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

Sonuç_reporters içinde mevcut olacak bir dosyayı günlüğe kaydetmek istiyorsanız, günlüğe bir dosya bildirmek için herhangi bir test senaryosunun içinden addTestLog(String dataName, LogDataType result_reporters addTestLog(String dataName, LogDataType dataType, InputStreamSource dataStream) yöntemini çağırabilirsiniz.

Örnek vermek:

    public static class TestLogTestCase extends DeviceTestCase {

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

TestCase - normal JUnit3 testi

Normal bir JUnit3 TestCase sınıfından Tradefed içindeki metrikleri raporlamak istiyorsanız, bunun yerine ekstra bir yöntemle tam olarak aynı sınıf olan bir MetricTestCase dönüştürülmesi gerekir: addTestMetric(String key, String value)

DeviceJUnit4ClassRunner - JUnit4 stili

JUnit4 stili testiniz DeviceJUnit4ClassRunner ile çalışıyorsa, Tradefed tarafından rapor edilecek bir test senaryosu içinde (@Test içinde) ölçümleri de kaydedebilirsiniz. Metriklerinizi raporlamak için TestMetrics kurallarını kullanmanız gerekecektir.

Örnek vermek:

    @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");
        }
    }

Dosyaları bildirmek için, bunu bildirmek için TestLogData kuralını kullanacaksınız.

Örnek vermek:

    @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 - saf Tradefed Testi

Kendi Tradefed Test sınıfınızı veya koşucunuzu yazıyorsanız, IRemoteTest'i uygulayacak ve run() yöntemi aracılığıyla bir ITestInvocationListener alacaksınız. Bu dinleyici, metrikleri aşağıdaki gibi günlüğe kaydetmek için kullanılabilir:

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

Tradefed metrik toplayıcıları

Tradefed, testlere paralel olarak metrikleri toplamak için özel bir metrics_collector nesnesi sağlar.

ev sahibi tarafında

BaseDeviceMetricCollector , ana bilgisayar tarafından herhangi bir metrik toplamak ve bunları test çağırmanın bir parçası olarak raporlamak için uygulanabilir. Farklı kullanım durumları için bir dizi genel koleksiyoncu zaten mevcuttur, ancak her zaman yeni katkıları memnuniyetle karşılıyoruz.

Tradefed çağrınızda kullanılacak toplayıcıyı belirtmek için, nesneyi Tradefed XML yapılandırmanıza eklemeniz yeterlidir:

Örnek vermek:

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

Halihazırda mevcut olan bazı toplayıcılar: * Test çalıştırması sırasında sıcaklığı periyodik olarak toplayan Sıcaklık Kollektörü. * Her test durumu için ' atrace ' kullanarak toplayan AtraceCollector.

Cihaz tarafında

Cihaz tarafı testleri (Instrumentations, UIAutomator testleri, vb.) çalıştırırken, ana bilgisayar tarafında asenkron olarak toplama yapan bir toplayıcıya sahip olmak ideal olmayabilir. Örneğin, eşzamansız olarak alınan bir ekran görüntüsü, büyük olasılıkla istenen ekranı kaçıracak ve işe yaramaz.

Bu kullanım durumlarını karşılamak için, koleksiyoncularımızın bir cihaz tarafı sürümü mevcuttur ve herhangi bir 'AndroidJUnitRunner' enstrümantasyonunda kullanılabilir. BaseMetricListener , Tradefed raporlama hattıyla tam uyumlu bir şekilde toplanan metrikleri otomatik olarak raporlamak için uygulanabilir.

Tradefed'den ' AndroidJUnitTest ' çalıştırıcısını kullanıyorsanız, toplayıcınızın testlerinizle birlikte çalışmasını sağlamak için aşağıdaki komut satırı seçeneğini belirtmeniz yeterlidir:

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

DİKKAT: Toplayıcı sınıflarının çalışma zamanında çözümlenmesi için, enstrümantasyon APK'nızın büyük olasılıkla makefile'nize aşağıdakileri ekleyerek bunları statik olarak dahil etmesi gerekir:

  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib

Cihaz tarafı toplayıcılara katkılar da memnuniyetle karşılanmaktadır.

Süitler için özel değerlendirme

Bazı modül konfigürasyonlarını çalıştıran üst düzey konfigürasyona sahip CTS gibi süitler için, her modül konfigürasyonunda ( AndroidTest.xml ) metrics_collector belirtmeye gerek yoktur. Aslında yasaktır.

Metrik toplamanın her modüle eşit olarak uygulanmasını sağlamak için, yukarıda açıklandığı gibi yalnızca üst düzey yapılandırma (örneğin, cts.xml ) metrics_collector belirtebilir. Bu toplayıcılar, paketin her modülüne karşı uygulanacak ve çalıştırılacaktır.

Bir modülden cihaz günlük dosyaları nasıl toplanır?

Cihaz tarafı testinin bazı dosyaların toplanması gerektiğini bildirmesi için bir kurulum mevcuttur.

AndroidTest.xml , cihazda dosya arayacak ve onları çekecek bir toplayıcı belirtebilir.

  <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>

Bu kalıpları ve anahtarı belirterek, toplayıcı anahtarı görürse ilgili dosyayı çekip kaydetmeye çalışacaktır.

Bu anahtarların oluşturulabilmesi için cihaz tarafında bir test (enstrümantasyon) loglanması gereken dosyayı belirtmelidir. Ana bilgisayar tarafında olduğu gibi yapılır (yukarıda açıklanmıştır).

  1. collector-device-lib make dosyalarındaki test APK'nıza ekleyin:
  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
  1. Dosyaları günlüğe kaydetmek için sağladığımız @kuralı kullanın:
    @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);
        }
    }

Yukarıdaki örnekteki KEY adı, dosyanın altında raporlanacağı addır. Bu, otomatik olarak çekilmesini sağlamak için FilePullerDeviceMetricCollector eşleştirmeniz gereken addır. benzersiz bir ad olmalıdır.

NOT: Dosya çekildiğinde, FilePullerDeviceMetricCollector dosyayı otomatik olarak cihazdan temizler.

Metrikleri nerede bulabilirim?

XML yapılandırmanızda belirtilen result_reporter bağlıdır.