Questa pagina descrive come riportare le metriche insieme ai risultati del test quando si scrive un test in Tradefed.
Il vantaggio di accedere tramite la pipeline Tradefed è quello di trovare le tue metriche insieme ai risultati funzionali. La registrazione delle metriche può essere eseguita in modo molto naturale all'interno dei test, il che rende conveniente per gli autori dei test aggiungere ulteriore 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)
dall'interno di qualsiasi test case per segnalare 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 si desidera registrare un file affinché sia disponibile in result_reporters
, è possibile chiamare il metodo addTestLog(String dataName, LogDataType dataType, InputStreamSource dataStream)
dall'interno di qualsiasi test case 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 regolare di JUnit3
Se desideri riportare le metriche all'interno di Tradefed da una normale classe JUnit3 TestCase, dovrà invece essere convertita in MetricTestCase
che è esattamente la stessa classe con un metodo aggiuntivo: addTestMetric(String key, String value)
DeviceJUnit4ClassRunner: stile JUnit4
Se il tuo test di stile JUnit4 è in esecuzione con DeviceJUnit4ClassRunner , puoi anche registrare i parametri all'interno di un test case (all'interno di @Test) per essere segnalati da Tradefed. Dovrai utilizzare le regole TestMetrics
per segnalare le tue metriche.
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 i file, utilizzerai la regola TestLogData
per segnalarlo.
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: puro test Tradefed
Se stai scrivendo la tua classe o runner Tradefed Test, implementerai IRemoteTest e otterrai un ITestInvocationListener
tramite il metodo run()
. Questo listener può essere utilizzato per registrare i parametri come segue:
listener.testLog(String dataName, LogDataType type of data, InputStreamSource data);
Raccoglitori di metriche Tradefed
Tradefed fornisce un oggetto metrics_collector
dedicato per raccogliere parametri in parallelo ai test.
Dalla parte dell'ospite
BaseDeviceMetricCollector può essere implementato per raccogliere eventuali parametri dal lato host e segnalarli come parte dell'invocazione del test. Sono già disponibili numerosi raccoglitori generici per diversi casi d'uso, ma siamo sempre benvenuti a nuovi contributi.
Per specificare il collector da utilizzare nella tua invocazione 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 collettori attualmente esistenti: * TemperatureCollector che raccoglie periodicamente la temperatura durante il test. * AtraceCollector che raccoglie utilizzando 'atrace' per ogni caso di test.
Lato dispositivo
Quando si eseguono test lato dispositivo (strumentazioni, test UIAutomator e così via), avere un raccoglitore sul lato host che raccoglie in modo asincrono potrebbe non essere l'ideale. Ad esempio, uno screenshot acquisito in modo asincrono molto probabilmente mancherà la schermata desiderata e sarà inutile.
Per soddisfare questi casi d'uso, esiste una versione lato dispositivo dei nostri raccoglitori che può essere utilizzata in qualsiasi strumentazione "AndroidJUnitRunner". BaseMetricListener può essere implementato per segnalare automaticamente le metriche raccolte in modo pienamente compatibile con la pipeline di reporting di Tradefed.
Se stai utilizzando il runner " AndroidJUnitTest " di Tradefed, puoi semplicemente specificare la seguente opzione della riga di comando per far funzionare il tuo raccoglitore con i tuoi test:
--device-listeners android.device.collectors.ScreenshotListener
ATTENZIONE: affinché le classi di raccolta vengano risolte in fase di esecuzione, molto probabilmente l'APK di strumentazione dovrà includerle staticamente aggiungendo al makefile quanto segue:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
Sono benvenuti anche i contributi ai collezionisti lato dispositivo.
Considerazione speciale per le suite
Per le suite come CTS che dispongono di una configurazione di primo livello che esegue alcune configurazioni del modulo, non è necessario specificare metrics_collector
in ogni configurazione del modulo ( AndroidTest.xml
). In realtà è vietato.
Per garantire che la raccolta di parametri venga applicata equamente a ciascun modulo, solo la configurazione di livello superiore (ad esempio, cts.xml
) può specificare metrics_collector
come spiegato sopra. Questi raccoglitori verranno applicati ed eseguiti su ciascun modulo della suite.
Raccogli i file di registro del dispositivo da un modulo
È disponibile una configurazione affinché un test lato dispositivo possa notificare 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>
Specificando questi modelli e chiave, il raccoglitore se vede la chiave tenterà di estrarre e registrare il file associato.
Affinché queste chiavi possano essere generate, un test lato dispositivo (strumentazione) dovrebbe specificare il file che dovrebbe essere registrato. Viene eseguito in modo simile al lato host (descritto sopra).
- Aggiungi
collector-device-lib
al tuo APK di prova 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 sopra è il nome con cui verrà riportato il file. Questo è il nome che dovresti abbinare in FilePullerDeviceMetricCollector
per farlo estrarre automaticamente. dovrebbe essere un nome univoco.
NOTA: una volta estratto il file, FilePullerDeviceMetricCollector
lo pulisce automaticamente dal dispositivo.
Dove trovo le metriche?
Dipende dal result_reporter
specificato nella configurazione XML.