Questa pagina descrive come generare report sulle metriche insieme ai risultati dei test durante la scrittura un test in Tradefed.
Il vantaggio del logging tramite la pipeline Tradefed è trovare le metriche insieme i risultati funzionali. La registrazione delle metriche può essere eseguita in modo molto naturale all'interno dei test, consentendo agli autori di test di aggiungere la strumentazione di lavoro.
DeviceTestCase - Stile JUnit3
Se il test estende DeviceTestCase
in un tipo di test di tipo JUnit3, puoi chiamare il metodo
addTestMetric(String key, String value)
da qualsiasi scenario di test da segnalare
di 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 nell'result_reporters
, puoi
chiama il metodo addTestLog(String dataName, LogDataType dataType, InputStreamSource dataStream)
all'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 - test JUnit3 standard
Se vuoi generare report sulle metriche all'interno di Tradefed da un normale testCase JUnit3
, dovrà essere convertita in MetricTestCase
, ovvero
la stessa classe con un metodo aggiuntivo: addTestMetric(String key, String value)
DeviceJUnit4ClassRunner - stile JUnit4
Se il test dello stile JUnit4 è in esecuzione con
DeviceJUnit4ClassRunner,
puoi anche registrare le metriche in uno scenario di test (all'interno di @Test)
di 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 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 puro Tradefed
Se stai scrivendo la tua classe o il tuo runner Tradefed Test, utilizzerai
Testa remota
e ottieni un ITestInvocationListener
tramite il metodo run()
. Questo listener
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 dei test.
Sul lato host
BaseDeviceMetricCollector possono essere implementate per raccogliere metriche dal lato host e segnalarle come parte della chiamata di test. Un certo numero di raccoglitori generici disponibili per diversi casi d'uso, ma accogliamo con favore nuovi contributi.
Per specificare il raccoglitore da utilizzare nella chiamata Tradefed, devi devi solo 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 raccoglitori attualmente esistenti: * TemperatureCollector che raccoglie la temperatura periodicamente durante l'esecuzione del test. * AtraceCollector che raccoglie mediante "atrace" per ogni scenario di test.
Lato dispositivo
Durante l'esecuzione di test lato dispositivo (strumentazioni, test UIAutomator e così via), un raccoglitore sul lato host che raccoglie in modo asincrono potrebbe ideale. Ad esempio, uno screenshot acquisito in modo asincrono probabilmente non includerà il parametro uno schermo e diventare inutile.
Per soddisfare questi casi d'uso, esiste una versione lato dispositivo dei nostri raccoglitori e può essere utilizzato in qualsiasi "AndroidJUnitRunner" la strumentazione di lavoro. BaseMetricListener può essere implementata per generare report automatici sulle metriche raccolte in modo del tutto compatibile con la pipeline di reporting di Tradefed.
Se usi il metodo "AndroidJUnitTest" runner di Tradefed, puoi semplicemente specificare la seguente opzione della riga di comando per eseguire i test sul raccoglitore:
--device-listeners android.device.collectors.ScreenshotListener
ATTENZIONE: per poter risolvere le classi raccoglitore in fase di runtime, il tuo instrumentation, molto probabilmente dovrà includerli in modo statico aggiungendo al makefile quanto segue:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
Sono ben accetti anche contributi ai raccoglitori lato dispositivo.
Considerazione speciale per le suite
Per le suite come CTS con una configurazione di primo livello che esegue alcuni moduli
non è necessario specificare metrics_collector
in ogni modulo
automatica (AndroidTest.xml
). In realtà è vietato.
Per assicurarti 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 eseguiranno
rispetto a 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à il file nella
dispositivo ed eseguire il pull.
<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 pattern e la chiave, il raccoglitore, se vede la chiave, di eseguire il pull e il log del file associato.
Affinché queste chiavi vengano generate, è necessario eseguire un test (strumentazione) lato dispositivo deve specificare il file da registrare. Viene fatto in modo simile lato host (descritto sopra).
- Aggiungi
collector-device-lib
al tuo APK di test nei file di creazione:
LOCAL_STATIC_JAVA_LIBRARIES += collector-device-lib
- Utilizza la @regola fornita per i 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 il file verrà
segnalato. Questo è il nome che devi trovare nella
FilePullerDeviceMetricCollector
per eseguire l'estrazione automatica. dovrebbe essere
un nome univoco.
NOTA: una volta estratto il file, FilePullerDeviceMetricCollector
automaticamente
lo rimuove dal dispositivo.
Dove si trovano le metriche?
Dipende dal valore result_reporter
specificato nella configurazione XML.