Bu sayfada, Tradefed'de test yazarken metriklerin test sonuçlarıyla birlikte nasıl raporlanacağı açıklanmaktadır.
Tradefed işlem hattı üzerinden günlük kaydı oluşturmanın avantajı, metriklerinizi işlevsel sonuçlarınızla birlikte bulabilmektir. 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 testte DeviceTestCase'i genişletiyorsa bir metriği bildirmek için addTestMetric(String key, String value)
yöntemini herhangi bir test durumu içinden çağırabilirsiniz. Anahtar benzersiz olduğu sürece bu işlev birden çok kez çağrılabilir.
Örnek:
public static class TestMetricTestCase extends DeviceTestCase {
public void testPass() {
addTestMetric("key1", "metric1");
}
public void testPass2() {
addTestMetric("key2", "metric2");
}
}
result_reporters
içinde kullanılabilir olması için bir dosyayı günlüğe kaydetmek istiyorsanız
günlüğe kaydedilecek bir dosyayı bildirmek üzere herhangi bir test senaryosunun içinden 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, MetricTestCase
sınıfına dönüştürülmesi gerekir. Bu sınıf, ek bir yönteme sahip olan aynı sınıftır: addTestMetric(String key, String value)
DeviceJUnit4ClassRunner - JUnit4 stili
JUnit4 tarzı testiniz DeviceJUnit4ClassRunner ile çalışıyorsa Tradefed tarafından raporlanacak metrikleri bir test durumu içinde (yani @Test içinde) de günlüğe kaydedebilirsiniz. Metriklerinizi raporlamak 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 uygulayacak ve run()
yöntemiyle ITestInvocationListener
alacaksınız. Bu dinleyici, metrikleri aşağıdaki gibi kaydetmek için kullanılabilir:
listener.testLog(String dataName, LogDataType type of data, InputStreamSource data);
Tradefed metrik toplayıcıları
Tradefed, testlerle paralel olarak metrik toplamak için özel bir metrics_collector
nesnesi sağlar.
Düzenleyen tarafında
BaseDeviceMetricCollector, ana makine tarafındaki tüm metrikleri toplamak ve bunları test çağrısının bir parçası olarak bildirmek için uygulanabilir. Farklı kullanım alanları için halihazırda çeşitli genel toplayıcılar 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 senaryosu için "atrace" kullanarak veri toplayan AtraceCollector.
Cihaz tarafında
Cihaz tarafı testleri (enstrümantasyonlar, UIAutomator testleri vb.) çalıştırırken ana tarafta eşzamansız olarak veri toplayan bir toplayıcıya sahip olmak ideal olmayabilir. Örneğin, eşzamansız olarak alınan bir ekran görüntüsünde istenen ekranın olmaması ve bu ekran görüntüsünün işe yaramaması büyük bir olasılıktır.
Bu kullanım alanlarını karşılamak için toplayıcılarımızın cihaz tarafı sürümü mevcuttur ve herhangi bir "AndroidJUnitRunner" enstrümantasyonunda kullanılabilir. BaseMetricListener, Tradefed raporlama hattıyla tamamen uyumlu bir şekilde toplanan metrikleri otomatik olarak raporlamak için uygulanabilir.
Tradefed'deki "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 bunları statik olarak içermesi gerekir. Bunun için derleme dosyanıza aşağıdakileri ekleyin:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
Cihaz tarafındaki toplayıcılara yapılan katkılar da kabul edilir.
Süitlerle ilgili özel dikkat edilmesi gereken noktalar
Bazı modül yapılandırmalarını çalıştıran üst düzey yapılandırmaya sahip CTS gibi paketlerde, her modül yapılandırmasında metrics_collector
belirtmenize gerek yoktur (AndroidTest.xml
). Hatta bu yasaktır.
Metrik toplama işleminin her modüle eşit şekilde uygulanmasını sağlamak için yukarıda açıklandığı gibi yalnızca üst düzey yapılandırma (ör. cts.xml
) metrics_collector
belirtebilir. Bu toplayıcılar, paketin her modülüne uygulanır ve bu modüllerde çalıştırılır.
Bir modülden cihaz günlük dosyalarını toplama
Bir cihaz tarafı testinin bazı dosyaların toplanması gerektiğini bildirmesi için bir kurulum mevcuttur.
AndroidTest.xml
, cihazdaki dosyaları arayıp çekecek bir toplayıcı belirleyebilir.
<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, anahtarı gören toplayıcı, ilişkili dosyayı çekip günlüğe kaydetmeye çalışır.
Bu anahtarların oluşturulabilmesi için cihaz tarafı testinde (enstrümantasyon) kaydedilmesi gereken dosya belirtilmelidir. Bu işlem, ana tarafında yapılan işleme benzer şekilde gerçekleştirilir (yukarıda açıklanmıştır).
- Yapım dosyalarındaki test APK'nıza
collector-device-lib
öğesini ekleyin:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
- Dosyaları günlüğe kaydetmek için sağladığımız @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 KEY
adı, dosyanın bildirileceği addır. Bu, otomatik olarak çekilmesi 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.