Come posso creare test in Android Studio?


109

Ho appena scaricato Android Studio che si basa su Intellij Idea.

Come creare dei test?

Ho notato che esiste un'opzione per creare un modulo di test ma questo non sembra fare nulla, crea solo un nuovo progetto con src

Ho anche provato a premere il tasto di scelta rapida CTRL + AlT + T che permette di creare unit test su una classe esistente ma sembra volerlo inserire nel progetto corrente. Ovviamente questo non aiuta con TDD

Qualcuno ha esperienza qui?


2
Ho anche provato a creare un progetto di prova. Se lo fai con lo strumento della riga di comando di Android come faresti con un progetto Eclipse, ricevi un errore perché non riesce a trovare il file AndroidManifest.xml. Sembra che Google abbia bisogno di aggiornare il proprio strumento Android per gestire i progetti Grundle. Tuttavia, sono nuovo nei test su Android, quindi non posso aiutarti = (
Kage

Risposte:


56

Questa risposta è per le persone che hanno appena iniziato a testare Android. Fornirò due semplici esempi per aiutarti a vedere come funzionano i test. Se segui per i prossimi 10 minuti, sarai pronto per iniziare ad aggiungere i tuoi test alla tua app. Penso che sarai sorpreso di quanto sia facile. Certamente lo ero.

Introduzione ai test Android

Ci sono due diversi tipi di test che farai.

  • Test unitari locali. Questi vengono eseguiti localmente sulla JVM (Java Virtual Machine). Dato che sono locali, sono veloci. Puoi usarli per testare le parti del tuo codice che richiedono solo Java e non le API Android. (A volte puoi creare un falso oggetto API per testare più cose a livello locale. Questo è chiamato mocking . Un mock Contextè un esempio.)
  • Test strumentati. Questi test vengono eseguiti su un dispositivo reale o nell'emulatore. Ciò li rende più lenti dei test locali. Tuttavia, sono più flessibili perché hai a disposizione l'API Android completa.

Crea un nuovo progetto e vedrai le seguenti cartelle predefinite.

inserisci qui la descrizione dell'immagine

Tutto è già lì e ti aspetta per creare i tuoi test. È già tutto pronto!

Come creare test unitari locali

Apri il ExampleUnitTestfile mostrato nell'immagine sopra. Dovrebbe assomigliare a qualcosa di simile a questo:

public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

Premere la doppia freccia verde per eseguire tutti i test o la singola freccia verde per eseguirne solo uno. (In questo caso c'è solo un test quindi entrambi fanno la stessa cosa.)

inserisci qui la descrizione dell'immagine

Dovrebbe passare (a patto che 2 + 2sia fermo 4quando stai leggendo questa risposta). Congratulazioni, hai appena eseguito il tuo primo test!

Fare il tuo test

Scriviamo il nostro test. Per prima cosa aggiungi questa classe al progetto dell'app principale in modo da avere qualcosa da testare:

public class MyClass {
    public int add(int a, int b) {
        return a + b;
    }
}

Ora cambia il addition_isCorrect()metodo nella classe di test in modo che sia come il codice seguente (o aggiungi semplicemente un altro metodo con un nome diverso):

public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        MyClass myClass = new MyClass();
        int result = myClass.add(2, 2);
        int expected = 4;
        assertEquals(expected, result);
    }
}

Eseguilo di nuovo e dovresti vederlo passare. Congratulazioni, hai appena creato il tuo primo test! (Beh, immagino che tecnicamente fosse mio, ma, ehi, abbastanza vicino. Ciò che è mio è tuo.)

Come creare test strumentati

Apri il ExampleInstrumentedTestfile. Dovrebbe assomigliare a qualcosa di simile a questo:

@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.example.myapp", appContext.getPackageName());
    }
}

Premi di nuovo uno di quei pulsanti verdi.

inserisci qui la descrizione dell'immagine

Finché hai un dispositivo reale connesso o l'emulatore configurato, dovrebbe averlo avviato ed eseguire la tua app. Congratulazioni, hai appena eseguito il tuo primo test strumentale!

Fare il tuo test

I test strumentati utilizzano Espresso per eseguire i test. È un po 'come il tuo piccolo utente robot che puoi fare testare la tua app. Puoi dirgli di fare qualcosa come premere un pulsante o leggere le proprietà di un TextView.

Puoi scrivere le istruzioni su come eseguire il test a mano, ma poiché siamo solo agli inizi, usiamo la funzione di registrazione automatica . È semplicissimo.

Per prima cosa aggiungi un pulsante alla tua interfaccia utente in modo da avere qualcosa con cui lavorare. L'ho fatto:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.myapp.MainActivity">

    <Button
        android:id="@+id/myButton"
        android:text="Click me"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</android.support.constraint.ConstraintLayout> 

Quindi premere Run> Record Espresso Test nel menu.

inserisci qui la descrizione dell'immagine

Dopo l'avvio, fare clic sul pulsante nell'emulatore e quindi, per terminare, scegliere OK nella finestra di dialogo Registra. Dovrebbe generare automaticamente il seguente codice di test.

@LargeTest
@RunWith(AndroidJUnit4.class)
public class MainActivityTest {

    @Rule
    public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);

    @Test
    public void mainActivityTest() {
        ViewInteraction appCompatButton = onView(
                allOf(withId(R.id.myButton), withText("Click me"), isDisplayed()));
        appCompatButton.perform(click());
    }
}

Grande! Hai appena creato il tuo primo test strumentale! È stato semplicissimo. Probabilmente dovresti aggiungere un'affermazione per renderlo un vero test, ma anche questo è abbastanza facile da fare con il registratore. Guarda questo video per andare un po 'più a fondo.

Ulteriori studi

Prima guardavo i video e poi leggevo la documentazione. È tutto molto utile. L'ultimo collegamento è a una serie di articoli che trattano alcune cose importanti a cui pensare quando si sceglie cosa testare.


1
Ottima risposta @ Suragch. Domanda veloce: dove metterei i file di supporto per il test case dell'unità locale? È hacky, ma sarei felice di inserire il percorso completo dalla base del test, ma se eseguo/app in Android Studio, i test vengono eseguiti da root_ , tuttavia se eseguo dalla riga di comando Gradle (o CI) allora è _root . (Idealmente mi piacerebbe accedere a assetscartelle specifiche quando eseguito in entrambi i modi).
mm2001

@ mm2001, ho scritto questa risposta come un modo per imparare a fare il test da solo, quindi non sono nemmeno arrivato fino a te. Se lo capisci prima di me, puoi lasciare un commento?
Suragch

L'ho trovato utile: stackoverflow.com/a/42751502/19506 - dice creare una cartella test/resourcese mettere i file lì, ad esempio test.txte accedervi con getClass().getClassLoader().getResource("test.txt"). Ho deciso che l'accesso diretto alle risorse APK è probabilmente una cattiva idea, quindi mi occuperò di questo copiando i file per testarli in una fase di compilazione o in un processo di aggiornamento esterno. Rimangono alcune domande sulle diverse versioni di Gradle, ma non le ho ancora affrontate.
mm2001

36

Modifica: dalla 0.1.8 questo è ora supportato nell'IDE . Si prega di seguire le istruzioni qui, invece di utilizzare le istruzioni seguenti.

Seguendo la guida utente del plug-in Android Gradle, sono stato in grado di far funzionare i test sulla riga di comando eseguendo i seguenti passaggi su un progetto appena creato (ho utilizzato il pacchetto predefinito "com.example.myapplication"):

  1. Aggiungi una directory src / instrumentTest / java per i test
  2. Aggiungi una classe di test (che estende ActivityTestCase) nel pacchetto com.example.myapplication.test
  3. Avvia un dispositivo virtuale
  4. Sulla riga di comando (nella directory MyApplicationProject / MyApplication) utilizzare il comando "../gradlew connectedInstrumentTest"

Questo ha eseguito i miei test e ha inserito i risultati del test in MyApplicationProject / MyApplication / build / reports / instrumentTests / connected. Sono nuovo nel testare le app Android, ma sembra funzionare bene.

Dall'IDE, è possibile provare a eseguire la stessa classe di test. Avrai bisogno di

  1. Aggiorna build.gradle per elencare Maven Central come repository
  2. Aggiorna build.gradle aggiunge JUnit 3.8 come dipendenza instrumentTestCompile, ad esempio instrumentTestCompile 'junit: junit: 3.8'
  3. In "Struttura del progetto" sposta manualmente JUnit al primo posto nell'ordine di dipendenza

Tuttavia ciò non riesce (il percorso di classe utilizzato durante l'esecuzione dei test manca della directory di output del test). Tuttavia, non sono sicuro che questo funzionerebbe a prescindere in quanto mi risulta che sia richiesto un test runner specifico per Android.


20

Suggerirei di utilizzare il file gradle.build .

  1. Aggiungi una directory src / androidTest / java per i test (come Chris inizia a spiegare)

  2. Apri il file gradle.build e specifica lì:

    android {
    
        compileSdkVersion rootProject.compileSdkVersion
        buildToolsVersion rootProject.buildToolsVersion
    
        sourceSets {
    
            androidTest {
                java.srcDirs = ['androidTest/java']
            }
        }
    }
  3. Premi "Sincronizza progetto con file Gradle" (nel pannello superiore). Ora dovresti vedere una cartella "java" (all'interno di "androidTest") è di colore verde.

  4. Ora sei in grado di creare lì qualsiasi file di prova ed eseguirli.


Non dimenticare androidTest.setRoot ('instrumentTest')
IgorGanapolsky

3
Nell'attuale versione di Android Studio non è necessario, anzi, sostituisci tutto ciò che ha un nome instrumentTest con androidTest
Yuriy Chernyshov

I nomi "instrumentTest" e "androidTest" sono totalmente arbitrari. Sono solo nomi di directory per il progetto di test. Puoi anche creare una directory "tests". Inoltre, il nome del pacchetto dell'SDK nel framework di test è android.test.InstrumentationTestCase. Quindi canonicamente credo che "strumento" o "strumentazione" abbia ancora senso per nominare i propri test. Vedi il seguente codice sorgente: grepcode.com/file/repository.grepcode.com/java/ext/…
IgorGanapolsky

7
Per favore, leggi la documentazione qui: tools.android.com/tech-docs/new-build-system . Dalla versione 0.9.0 instrumentTest è stato rinominato androidTest .
Yuriy Chernyshov

1
@IgorGanapolsky La cartella dei nomi come androidTest NON è arbitraria. Deve essere fatto affinché la cartella diventi verde.
orologiaio


10

Android Studio v.2.3.3

Evidenzia il contesto del codice che desideri testare e usa il tasto di scelta rapida: CTRL+ SHIFT+T

Usa l'interfaccia di dialogo per completare la configurazione.

Il framework di test dovrebbe rispecchiare il layout del pacchetto del progetto per ottenere i migliori risultati, ma è possibile creare manualmente test personalizzati, a condizione di disporre della directory e delle impostazioni di compilazione corrette.


7

Per ora (studio 0.61) è sufficiente mantenere una corretta struttura del progetto. Non è necessario creare un progetto di test separato come in eclipse (vedi sotto).

Struttura dei test


4

Android Studio continua a evolversi, quindi le risposte di cui sopra non saranno più applicabili. Per la versione corrente di Android Studio 1.2.1.1, c'è un bel tutorial sui test su:

http://evgenii.com/blog/testing-activity-in-android-studio-tutorial-part-1/


2
Sì, AS continua ad evolversi, quindi è piuttosto sciocco per qualcuno creare un articolo sulla tecnologia all'avanguardia e non menzionare mai il numero di versione a cui si applica. l'unico indizio è una data in fondo.
Tom

3

Uno dei principali cambiamenti sembra essere che con Android Studio l'applicazione di prova è integrata nel progetto dell'applicazione.

Non sono sicuro che questo aiuti il ​​tuo problema specifico, ma ho trovato una guida su come eseguire test con un progetto Gradle. Guida per l'utente di Android Gradle


3

Il modo più semplice che ho trovato è semplificato nel mio seguente post sul blog :

  1. Crea una cartella in cui scrivere tutti i tuoi unit test (preferibilmente com.example.app.tests)
  2. Crea una nuova classe di test (preferibilmente NameOfClassTestedTests, cioè BankAccountLoginActivityTests)
  3. Estendi InstrumentationTestCase
  4. Scrivi uno unit test con esito negativo per assicurarti di aver configurato correttamente gli unit test
  5. Nota che il nome di un metodo di unit test deve iniziare con la parola "test" (preferibilmente testTestedMethodNameExpectedResult () cioè testBankAccountValidationFailedShouldLogout ())
  6. Configura il tuo progetto per gli unit test:
  7. Apri il menu "Esegui ..." e fai clic su "Modifica configurazioni"
  8. Fare clic sul pulsante +
  9. Seleziona il modello di test Android
  10. Immettere un nome per la configurazione della corsa (preferibilmente "AppName Tests")
  11. Seleziona la tua app nella casella combinata del modulo
  12. Seleziona il pulsante di opzione "Tutto nel pacchetto" (in genere dovresti selezionare questa opzione perché esegue tutti gli unit test in tutte le classi di test)
  13. Inserisci il nome del pacchetto di prova dal passaggio 1 (ad es. Com.example.app.tests)
  14. Seleziona il dispositivo su cui desideri eseguire i test
  15. Applica e salva la configurazione
  16. Esegui test unitari (e aspettati errori):
  17. Seleziona la configurazione dei test appena creata dal menu Esegui
  18. Fare clic su Esegui e leggere i risultati nella console di output

Buona fortuna per rendere il tuo codice più leggibile, manutenibile e ben testato!


La domanda riguardava i test di strumentazione! Ho anche difficoltà a scrivere alcuni test di strumentazione. Vedi la mia domanda su stackoverflow.com/questions/35426990/…
Monica

2

Android Studio è stato una specie di target mobile, prima come anteprima per sviluppatori e ora in versione beta. Il percorso per le classi Test nel progetto è cambiato nel tempo, ma indipendentemente dalla versione di AS che stai utilizzando, il percorso è dichiarato nel tuo file .iml. Attualmente, con la versione 0.8.3, troverai quanto segue all'interno del file iml interno:

      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/groovy" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />

Il file .iml ti dice dove posizionare le tue classi di test.



0

Aggiungi sotto lib all'interno del file gradle

 androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

Creare la classe HomeActivityTest nella directory androidTest e prima di eseguire il test aggiungere la stringa flurry_api_key e sender_id all'interno del file di risorse della stringa e modificare il valore per caso di errore e caso di successo.

@RunWith(AndroidJUnit4.class)
public class HomeActivityTest
{
    private static final String SENDER_ID = "abc";
    private static final String RELEASE_FLURRY_API_KEY = "xyz";

    @Test
    public void gcmRegistrationId_isCorrect() throws Exception
    {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        Assert.assertEquals(SENDER_ID, appContext.getString(R.string.sender_id));
    }

    @Test
    public void flurryApiKey_isCorrect() throws Exception
    {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        Assert.assertEquals(RELEASE_FLURRY_API_KEY, appContext.getString(R.string.flurry_api_key));
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.