Questa pagina descrive come segnalare le metriche insieme ai risultati dei test quando scrivi un test in Tradefed.
Il vantaggio di accedere tramite la pipeline Tradefed è quello di trovare le metriche insieme ai risultati funzionali. La registrazione delle metriche può essere eseguita in modo molto naturale all'interno dei test, il che rende più comodo per gli autori dei test aggiungere strumentazione.
DeviceTestCase - JUnit3 style
Se il test estende DeviceTestCase
in un test in stile JUnit3, puoi chiamare il metodo
addTestMetric(String key, String value) dall'interno di qualsiasi caso di test per segnalare
una metrica. 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 in modo che sia disponibile in result_reporters, puoi
chiamare il metodo addTestLog(String dataName, LogDataType dataType, InputStreamSource dataStream)
dall'interno di 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 - regular JUnit3 test
Se vuoi generare report sulle metriche all'interno di Tradefed da una normale classe JUnit3 TestCase,
dovrai convertirla in un 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 segnalare
a Tradefed. Per generare report sulle metriche, devi 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 i file, utilizzerai 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 - pure Tradefed Test
Se stai scrivendo la tua classe o il tuo runner di test Tradefed, implementerai
IRemoteTest
e otterrai un ITestInvocationListener tramite il metodo run(). Questo listener
può essere utilizzato per registrare le metriche nel seguente modo:
listener.testLog(String dataName, LogDataType type of data, InputStreamSource data);
Raccolta di metriche Tradefed
Tradefed fornisce un oggetto metrics_collector dedicato per raccogliere le metriche in parallelo ai test.
Per quanto riguarda l'organizzatore
BaseDeviceMetricCollector può essere implementato per raccogliere qualsiasi metrica dal lato host e segnalarla come parte della chiamata di test. Sono già disponibili diversi raccoglitori generici per vari casi d'uso, ma accogliamo sempre nuovi contributi.
Per specificare il raccoglitore da utilizzare nell'invocazione di Tradefed, devi semplicemente aggiungere l'oggetto alla configurazione XML di Tradefed:
Esempio:
<metrics_collector class="com.android.tradefed.device.metric.AtraceCollector">
<option name="categories" value="freq"/>
</metrics_collector>
Alcuni raccoglitori attualmente esistenti: * TemperatureCollector che raccoglie la temperatura periodicamente durante l'esecuzione del test. * AtraceCollector che raccoglie i dati utilizzando "atrace" per ogni scenario di test.
Sul lato del dispositivo
Quando esegui test lato dispositivo (strumentazioni, test UIAutomator e così via), avere un raccoglitore lato host che raccoglie in modo asincrono potrebbe non essere l'ideale. Ad esempio, uno screenshot acquisito in modo asincrono molto probabilmente non mostrerà 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 generare automaticamente report sulle metriche raccolte in modo completamente compatibile con la pipeline di generazione dei report di Tradefed.
Se utilizzi il runner "AndroidJUnitTest" di Tradefed, puoi semplicemente specificare la seguente opzione della riga di comando per eseguire il raccoglitore con i test:
--device-listeners android.device.collectors.ScreenshotListener
ATTENZIONE: affinché le classi di raccolta vengano risolte in fase di runtime, l'APK di strumentazione dovrà probabilmente includerle staticamente aggiungendo quanto segue al makefile:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
Sono ben accetti anche i contributi ai raccoglitori lato dispositivo.
Considerazione speciale per le suite
Per le suite come CTS che hanno una configurazione di primo livello che esegue alcune configurazioni di moduli, non è necessario specificare metrics_collector in ogni configurazione di moduli (AndroidTest.xml). È effettivamente 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 sopra. Questi raccoglitori verranno applicati ed eseguiti
su ogni modulo della suite.
Raccogliere i file di log del dispositivo da un modulo
È disponibile una configurazione per consentire a un test lato dispositivo di 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>
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. L'operazione viene eseguita in modo simile a quella lato host (descritta sopra).
- Aggiungi
collector-device-liball'APK di test nei file make:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
- Utilizza la regola @che forniamo ai file di log:
@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 precedente è il nome con cui verrà
segnalato il file. Questo è il nome che devi abbinare in
FilePullerDeviceMetricCollector per recuperarlo automaticamente. Deve essere
un nome univoco.
NOTA: una volta estratto il file, FilePullerDeviceMetricCollector lo
cancella automaticamente dal dispositivo.
Dove si trovano le metriche?
Dipende dal result_reporter specificato nella configurazione XML.