Questa pagina descrive come generare report sulle metriche insieme ai risultati dei test quando si scrive un test in Tradefed.
Il vantaggio della registrazione tramite la pipeline Tradefed è trovare le metriche insieme ai risultati funzionali. La registrazione delle metriche può essere eseguita in modo molto naturale all'interno dei test, il che consente agli autori di test di aggiungere più strumentazione.
DeviceTestCase - Stile JUnit3
Se il test estende DeviceTestCase
in un tipo di test in stile JUnit3, puoi chiamare il metodo
addTestMetric(String key, String value)
da qualsiasi test case per registrare
una metrica. Questo può essere chiamato più volte purché la chiave sia univoca.
Esempio:
public static class TestMetricTestCase extends DeviceTestCase {
public void testPass() {
addTestMetric("key1", "metric1");
}
public void testPass2() {
addTestMetric("key2", "metric2");
}
}
Se vuoi registrare un file affinché sia disponibile in result_reporters
, puoi chiamare il metodo addTestLog(String dataName, LogDataType dataType, InputStreamSource dataStream)
da qualsiasi scenario di test per segnalare un file da registrare.
Esempio:
public static class TestLogTestCase extends DeviceTestCase {
public void testPass() {
try (InputStreamSource source = getDevice().getScreenshot()) {
addTestLog("screenshot", LogDataType.PNG, source);
}
}
}
TestCase - test JUnit3 standard
Se vuoi generare report sulle metriche all'interno di TradeFed da una normale classe JUnit3 TestCase, devi convertirla in MetricTestCase
, che è la stessa classe con un metodo aggiuntivo: addTestMetric(String key, String value)
DeviceJUnit4ClassRunner - stile JUnit4
Se il test in stile JUnit4 viene eseguito con
DeviceJUnit4ClassRunner,
puoi anche registrare le metriche all'interno di uno scenario di test (all'interno di @Test) da registrare
da Tradefed. Per generare report sulle metriche, dovrai utilizzare le regole TestMetrics
.
Esempio:
@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");
}
}
Per segnalare file, devi utilizzare la regola TestLogData
.
Esempio:
@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 - Test Tradefed puro
Se stai scrivendo la tua classe o il tuo runner di test Tradefed, implementerai
IRemoteTest
e otterrai un ITestInvocationListener
tramite il metodo run()
. Questo ascoltatore può essere utilizzato per registrare le metriche come segue:
listener.testLog(String dataName, LogDataType type of data, InputStreamSource data);
Raccoglitori delle metriche scambiate
Tradefed fornisce un oggetto metrics_collector
dedicato per raccogliere le metriche in parallelo ai test.
Sul lato dell'organizzatore
BaseDeviceMetricCollector può essere implementato per raccogliere le metriche lato host e generare report su di esse nel contesto dell'invocazione del test. È già disponibile un certo numero di collezionisti generici per diversi casi d'uso, ma accogliamo sempre con entusiasmo nuovi contributi.
Per specificare il raccoglitore da utilizzare nella chiamata Tradefed, devi semplicemente aggiungere l'oggetto alla tua configurazione XML Tradefed:
Esempio:
<metrics_collector class="com.android.tradefed.device.metric.AtraceCollector">
<option name="categories" value="freq"/>
</metrics_collector>
Alcuni collezionisti attualmente esistenti: * TemperatureCollector che raccoglie la temperatura periodicamente durante l'esecuzione del test. * AtraceCollector che raccoglie i dati utilizzando "atrace" per ogni test case.
Sul lato del dispositivo
Quando esegui test lato dispositivo (strumentazioni, test UIAutomator e così via), avere un raccoglitore lato host che raccoglie i dati in modo asincrono potrebbe non essere ideale. Ad esempio, uno screenshot acquisito in modo asincrono molto probabilmente non conterrà la schermata che ti interessa e sarà inutile.
Per soddisfare questi casi d'uso, esiste una versione lato dispositivo dei nostri collector che può essere utilizzata in qualsiasi strumentazione "AndroidJUnitRunner". BaseMetricListener può essere implementato per generare report automaticamente sulle metriche raccolte in modo completamente compatibile con la pipeline di reporting Tradefed.
Se utilizzi il programma di esecuzione "AndroidJUnitTest" di Tradefed, puoi semplicemente specificare la seguente opzione a riga di comando per eseguire il tuo collector con i test:
--device-listeners android.device.collectors.ScreenshotListener
ATTENZIONE: affinché le classi del raccoglitore vengano risolte in fase di runtime, è molto probabile che l'APK di ispezione debba includerle in modo statico aggiungendo al file make quanto segue:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
Sono ben accetti anche contributi ai raccoglitori lato dispositivo.
Considerazione speciale per le suite
Per suite come CTS che hanno una configurazione di primo livello che esegue alcune configurazioni di moduli, non è necessario specificare metrics_collector
in ogni configurazione del modulo (AndroidTest.xml
). In realtà è vietato.
Per garantire che la raccolta delle metriche venga applicata in modo uniforme a ogni modulo, solo la configurazione di primo livello (ad esempio cts.xml
) può specificare metrics_collector
come spiegato in precedenza. Questi raccoglitori verranno applicati ed eseguiti
su ciascun modulo della suite.
Raccogliere i file di log del dispositivo da un modulo
È disponibile una configurazione per consentire a un test lato dispositivo di segnalare che alcuni file devono essere raccolti.
AndroidTest.xml
può specificare un raccoglitore che cercherà i file sul
dispositivo e li estrarrà.
<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>
Se il raccoglitore rileva la chiave, specificando questi pattern e la chiave, tenterà di estrarre e registrare il file associato.
Affinché queste chiavi vengano generate, un test lato dispositivo (strumentazione) deve specificare il file da registrare. Viene eseguita in modo simile al lato host (descritto sopra).
- Aggiungi
collector-device-lib
all'APK di test nei file make:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
- Utilizza la @rule che forniamo per registrare i 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);
}
}
Il nome KEY
nell'esempio riportato sopra è il nome con cui verrà segnalato il file. Questo è il nome che devi associare in FilePullerDeviceMetricCollector
per estrarlo automaticamente. Deve essere un nome univoco.
NOTA: una volta estratto, FilePullerDeviceMetricCollector
lo cancella automaticamente dal dispositivo.
Dove si trovano le metriche?
Dipende dal valore result_reporter
specificato nella configurazione XML.