Questa categoria di test di strumentazione non è poi così diversa da quelle che hanno come target le normali applicazioni per Android. Vale la pena notare che l'applicazione di test la strumentazione deve essere firmata con lo stesso certificato, come applicazione a cui è indirizzato.
Tieni presente che questa guida presuppone che tu abbia già alcuna conoscenza del del flusso di lavoro della struttura di origine della piattaforma. In caso contrario, consulta i Requisiti. L'esempio illustrato qui è la scrittura di un nuovo test di strumentazione con target nel proprio pacchetto di applicazioni di test. Se non hai familiarità con il concetto, leggi la Introduzione ai test della piattaforma.
Questa guida utilizza il seguente test come esempio:
- frameworks/base/packages/Shell/test
Ti consigliamo di esaminare prima il codice per ottenere un'impressione approssimativa prima di procedere.
Decidi la località di origine
Poiché il test di strumentazione prenderà di mira un'applicazione, la convenzione
devi inserire il codice sorgente di test in una directory tests
sotto la radice del file
della directory di origine dei componenti
nell'albero delle origini della piattaforma.
Leggi altre discussioni sulla posizione di origine nell'esempio end-to-end per di auto-strumentazione.
File manifest
Proprio come un'applicazione normale, ogni modulo di test della strumentazione richiede un
manifest. Se assegni al file il nome AndroidManifest.xml
e lo fornisci successivamente
a Android.mk
per il modulo di test, verrà incluso automaticamente dal
Makefile principale: BUILD_PACKAGE
.
Prima di procedere, consigliamo vivamente di esaminare Panoramica del file manifest dell'app per prima cosa.
Qui trovi una panoramica dei componenti di base di un file manifest e delle relative le funzionalità di machine learning.
È possibile accedere alla versione più recente del file manifest per la modifica di esempio Gerrit alle ore: https://android.googlesource.com/platform/frameworks/base/+/main/packages/Shell/tests/AndroidManifest.xml
Per praticità viene incluso qui un'istantanea:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.shell.tests">
<application>
<uses-library android:name="android.test.runner" />
<activity
android:name="com.android.shell.ActionSendMultipleConsumerActivity"
android:label="ActionSendMultipleConsumer"
android:theme="@android:style/Theme.NoDisplay"
android:noHistory="true"
android:excludeFromRecents="true">
<intent-filter>
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
</activity>
</application>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.shell"
android:label="Tests for Shell" />
</manifest>
Alcune osservazioni specifiche sul file manifest:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.shell.tests">
L'attributo package
è il nome del pacchetto dell'applicazione, ovvero l'attributo
utilizzato dal framework delle applicazioni Android per identificare un
(o, in questo contesto, la tua applicazione di test). Ogni utente nel sistema
può installare una sola applicazione con quel nome pacchetto.
Poiché si tratta di un pacchetto di applicazioni di test, indipendente dall'applicazione
pacchetto sottoposto a test, deve essere utilizzato un nome di pacchetto diverso: una convenzione comune
consiste nell'aggiungere il suffisso .test
.
Inoltre, questo attributo package
è lo stesso restituito da ComponentName#getPackageName()
e anche quello che utilizzeresti per interagire con vari comandi secondari pm
tramite adb shell
.
Nota anche che, sebbene il nome del pacchetto abbia in genere lo stesso stile come nome di pacchetto Java, in realtà ha pochissime cose a che fare con questo. In altre il pacchetto dell'applicazione (o di test) può contenere classi con qualsiasi pacchetto personalizzati, anche se d'altra parte, potresti optare per la semplicità e avere livello del pacchetto Java nella tua applicazione o esegui un test identico all'applicazione il nome del pacchetto.
<uses-library android:name="android.test.runner" />
Questo passaggio è obbligatorio per tutti i test di strumentazione poiché le classi correlate sono pacchettizzati in un file di libreria jar separato, pertanto richiede Voci classpath quando il pacchetto di test viene richiamato dal framework dell'applicazione.
android:targetPackage="com.android.shell"
Il pacchetto target della strumentazione viene impostato su com.android.shell
.
Quando la strumentazione viene richiamata tramite il comando am instrument
, il framework
riavvia il processo com.android.shell
e inserisce il codice di strumentazione nella
il processo per l'esecuzione del test. Ciò significa anche che il codice di test avrà
l'accesso a tutte le istanze di classe in esecuzione nell'applicazione sottoposta a test e può
la possibilità di manipolare lo stato dipende dagli hook di test esposti.
File di configurazione semplice
Ogni nuovo modulo di test deve avere un file di configurazione per indirizzare il sistema di compilazione con metadati dei moduli, dipendenze del tempo di compilazione e pacchetti istruzioni. Nella maggior parte dei casi, l'opzione File Blueprint basato su Presto è sufficienti. Per maggiori dettagli, vedi Configurazione di test semplice.
File di configurazione complesso
Per test più complessi, devi anche scrivere un file di configurazione del test per Trade Federation, l'ambiente di test di Android.
La configurazione di test può specificare opzioni speciali di configurazione del dispositivo e impostazioni predefinite per fornire la classe di test.
È possibile accedere alla versione più recente del file di configurazione per la modifica di Gerrit di esempio alle ore: frameworks/base/packages/Shell/tests/AndroidTest.xml
Per comodità, è incluso uno snapshot:
<configuration description="Runs Tests for Shell.">
<target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
<option name="test-file-name" value="ShellTests.apk" />
</target_preparer>
<option name="test-suite-tag" value="apct" />
<option name="test-tag" value="ShellTests" />
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="com.android.shell.tests" />
<option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
</test>
</configuration>
Alcune osservazioni specifiche sul file di configurazione del test:
<target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup">
<option name="test-file-name" value="ShellTests.apk"/>
</target_preparer>
Questo indica a Trade Federation di installare ShellTests.apk sul target dispositivo utilizzando un valore target_preparer specificato. Ci sono molti preparativi del target disponibili per gli sviluppatori della Federazione commerciale e possono essere usate per garantire che il dispositivo sia configurato correttamente prima dell'esecuzione del test.
<test class="com.android.tradefed.testtype.AndroidJUnitTest">
<option name="package" value="com.android.shell.tests"/>
<option name="runner" value="android.support.test.runner.AndroidJUnitRunner"/>
</test>
Specifica la classe di test della Trade Federation da utilizzare per eseguire il test. passa nel pacchetto sul dispositivo da eseguire e il runner del test che in questo caso è JUnit.
Consulta questa pagina per ulteriori informazioni sulle configurazioni dei moduli di test
Funzionalità JUnit4
L'utilizzo della libreria android-support-test
come test runner consente l'adozione di nuovi
classi di test in stile JUnit4 e il cambio di gerrit di esempio contiene
l'uso delle sue funzionalità.
È possibile accedere al codice sorgente più recente per la modifica gerrit di esempio all'indirizzo: frameworks/base/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java
Sebbene i pattern di test siano in genere specifici dei team dei componenti, ci sono alcune modelli di utilizzo generalmente utili.
@SmallTest
@RunWith(AndroidJUnit4.class)
public final class FeatureFactoryImplTest {
Una differenza significativa in JUnit4 è che i test non sono più necessari eredita da una classe di test di base comune; Scrivi i test in Java semplice e usano l'annotazione per indicare determinati vincoli e configurazione di test. In questo esempio, dichiariamo che questa classe deve essere eseguita come test JUnit4 Android.
L'annotazione @SmallTest
specificava una dimensione del test per l'intera classe di test: tutte
i metodi di test aggiunti a questa classe di test ereditano questa annotazione sulle dimensioni del test.
configurazione pre-testazione, rimozione post-test e rimozione post-test:
simili ai metodi setUp
e tearDown
in JUnit4.
L'annotazione Test
viene utilizzata per annotare il test effettivo.
@Before
public void setup() {
...
@Test
public void testGetProvider_shouldCacheProvider() {
...
L'annotazione @Before
viene utilizzata sui metodi di JUnit4 per eseguire la configurazione pre-test.
Sebbene non venga utilizzato in questo esempio, è disponibile anche @After
per l'eliminazione post-test.
Analogamente, le annotazioni @BeforeClass
e @AfterClass
possono essere utilizzate
metodi di JUnit4 per eseguire la configurazione prima di eseguire tutti i test in una classe di test,
per poi procedere all'eliminazione. Nota che la configurazione dell'ambito delle classi
e i metodi di eliminazione
devono essere statici.
Per quanto riguarda i metodi di test, a differenza della versione precedente di JUnit, non devono più
per iniziare il nome del metodo con test
, ogni metodo deve essere annotato
con @Test
. Come al solito, i metodi di test devono essere pubblici, dichiarare nessun valore restituito
non accettano parametri e possono generare eccezioni.
Context context = InstrumentationRegistry.getTargetContext();
Poiché i test JUnit4 non richiedono più una classe base comune,
necessario per ottenere le istanze Context
tramite getContext()
o
getTargetContext()
tramite metodi della classe base; il nuovo test runner
le gestisce tramite InstrumentationRegistry
in cui la configurazione contestuale e ambientale creata dal framework di strumentazione è
archiviati. Tramite questo corso, puoi anche chiamare:
getInstrumentation()
: l'istanza alla classeInstrumentation
getArguments()
: gli argomenti della riga di comando passati aam instrument
tramite-e <key> <value>
Creazione e test in locale
Per i casi d'uso più comuni, utilizza Conferma.
Per casi più complessi che richiedono una maggiore personalizzazione, segui le istruzioni di strumentazione.