Bir Tradefed testinden alınan rapor metrikleri veya verileri

Bu sayfada, Tradefed'te bir test yazarken metriklerin ve test sonuçlarının nasıl raporlanacağı açıklanmaktadır.

Tradefed ardışık düzeni üzerinden günlük kaydetmenin avantajı, işlevsel sonuçlarınızın yanı sıra metriklerinizi de bulabilmenizdir. Metriklerin günlük kaydı, testler içinde son derece doğal bir şekilde gerçekleştirilebilir. Bu, test yazarlarının daha fazla araç eklemelerini kolaylaştırır.

DeviceTestCase - JUnit3 stili

Testiniz JUnit3 tarzında bir testte DeviceTestCase'yi genişletiyorsa bir metriği bildirmek için herhangi bir testin içinden addTestMetric(String key, String value) yöntemini çağırabilirsiniz. Anahtar benzersiz olduğu sürece birden fazla kez çağrılabilir.

Örnek:

    public static class TestMetricTestCase extends DeviceTestCase {

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

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

Bir dosyanın result_reporters içinde kullanılabilmesini sağlamak isterseniz günlüğe bir dosyayı bildirmek için herhangi bir test durumunda addTestLog(String dataName, LogDataType dataType, InputStreamSource dataStream) yöntemini çağırabilirsiniz.

Örnek:

    public static class TestLogTestCase extends DeviceTestCase {

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

TestCase - normal JUnit3 testi

Tradefed'deki metrikleri normal bir JUnit3 TestCase sınıfından bildirmek istiyorsanız bu sınıfın, ek bir yöntem içeren aynı sınıf olan MetricTestCase sınıfına dönüştürülmesi gerekir: addTestMetric(String key, String value)

DeviceJUnit4ClassRunner - JUnit4 stili

JUnit4 stilindeki testiniz DeviceJUnit4ClassRunner ile çalışıyorsa Tradefed tarafından raporlanacak metrikleri bir test durumunda (@Test içinde) da günlüğe kaydedebilirsiniz. Metriklerinizi bildirmek için TestMetrics kurallarını kullanmanız gerekir.

Örnek:

    @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 TestLogData kuralını kullanırsınız.

Örnek:

    @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 - pure Tradefed Test

Kendi Tradefed Test sınıfınızı veya koşucunuzu yazıyorsanız IRemoteTest'i uygular ve run() yöntemiyle ITestInvocationListener alırsınız. Bu işleyici, metrikleri aşağıdaki şekilde günlüğe kaydetmek için kullanılabilir:

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

Tradefed metrik toplayıcıları

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

Düzenleyen tarafında

BaseDeviceMetricCollector, ana makine tarafındaki tüm metrikleri toplamak ve test çağrısının bir parçası olarak bildirmek için uygulanabilir. Çeşitli kullanım alanları için halihazırda birçok genel toplayıcı mevcuttur ancak yeni katkıları her zaman memnuniyetle karşılarız.

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

Örnek:

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

Şu anda mevcut olan bazı toplayıcılar: * Test çalışması sırasında sıcaklığı düzenli olarak toplayan TemperatureCollector. * Her test durumu için "atrace" kullanarak toplayan AtraceCollector.

Cihaz tarafında

Cihaz tarafında testler (Enstrümasyonlar, UIAutomator testleri vb.) çalıştırırken ana tarafta eşzamansız olarak veri toplayan bir toplayıcı kullanmak ideal olmayabilir. Örneğin, eşzamanlı olmayan bir şekilde alınan ekran görüntüsü büyük olasılıkla istenen ekranı yakalamaz ve işe yaramaz.

Bu kullanım alanlarını karşılamak için toplayıcılarımızın cihaz tarafında bir sürümü mevcuttur ve herhangi bir "AndroidJUnitRunner" enstrümasyonunda kullanılabilir. Tradefed raporlama ardışık düzeniyle tamamen uyumlu bir şekilde toplanan metriklerin otomatik olarak raporlanması için BaseMetricListener uygulanabilir.

Tradefed'deki "AndroidJUnitTest" çalıştırıcısını kullanıyorsanız toplayıcınızı testlerinizle birlikte çalıştırmak 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ülmesi için enstrümantasyon APK'nızın büyük olasılıkla makefile'inize aşağıdakileri ekleyerek bunları statik olarak dahil etmesi gerekir:

  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib

Cihaz tarafı toplayıcılara da katkıda bulunmak mümkündür.

Süitler için özellikle dikkat edilmesi gereken noktalar

CTS gibi, bazı modül yapılandırmalarını çalıştıran üst düzey bir yapılandırmaya sahip paketlerde her modül yapılandırmasında metrics_collector belirtmenize (AndroidTest.xml) gerek yoktur. Bu aslında yasaktır.

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

Bir modülden cihaz günlük dosyalarını toplama

Cihaz tarafında yapılan bir testin bazı dosyaların toplanmasını bildirmesi için bir kurulum mevcuttur.

AndroidTest.xml, cihazda dosyaları arayacak ve alacak 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 ilişkili dosyayı alıp günlüğe kaydetmeyi dener.

Bu anahtarların oluşturulabilmesi için cihaz tarafında bir test (enstrümantasyon) tarafından günlük kaydının tutulacağı dosya belirtilmelidir. Bu işlem, ana makine tarafıyla (yukarıda açıklandığı şekilde) benzer bir şekilde yapılır.

  1. collector-device-lib öğesini, oluşturma dosyalarında test APK'nıza ekleyin:
  LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
  1. Dosyaları günlüğe kaydetmek için sağladığımız @rule kuralını 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 örnekte bulunan KEY adı, dosyanın bildirileceği addır. Bu ad, otomatik olarak alınması için FilePullerDeviceMetricCollector içinde eşleştirmeniz gereken addır. Benzersiz bir ad olmalıdır.

NOT: Dosya çekildikten sonra FilePullerDeviceMetricCollector, dosyayı cihazdan otomatik olarak temizler.

Metrikleri nerede bulabilirim?

Bu, XML yapılandırmanızda belirtilen result_reporter değerine bağlıdır.