Esecuzione di semplici test JUnit su Android Studio (IntelliJ) quando si utilizza un Gradle di configurazione basato su

Sto usando Android Studio/IntelliJ di costruire su una esistente Android progetto e vorrei aggiungere alcune semplici JUnit unit test. Qual è la cartella giusta per aggiungere tali test su?

Android Gradle plug-in e definisce una struttura di directory con src/main/java per il codice sorgente principale e src/instrumentTest/java per Android test.

Cercando di aggiungere il mio test JUnit in instrumentTest non ha funzionato per me. Posso correre come un Android test (che è ciò che sembra directory per), ma che non è quello che sto cercando io voglio solo l’esecuzione di un semplice JUnit test.
Ho cercato di creare un JUnit eseguire la configurazione per questa Classe, ma che non ha funzionato – sto supponendo perché sto usando una directory che è contrassegnato come Android Test invece di Origine.

Se creo una nuova cartella di origine e marki come tale nella Struttura del Progetto, questo sarà ottenere spazzato la prossima volta IntelliJ aggiorna la configurazione di progetto dal gradle file di build.

Qual è il modo più appropriato di configurazione di test JUnit in un gradle basato su android progetto IntelliJ? Che la struttura di directory da utilizzare per questo?

  • Purtroppo non ti posso aiutare con i test, come sto ancora lottando con questo me stesso, ma è possibile utilizzare questo per interrompere IntelliJ asciugandosi le cartelle di origine: java.srcDirs = ['src/main/java','src/instrumentTest/java'] in sourceSets sezione del build.gradle
  • La sua non è divertente per impostare, né di semplice manutenzione, ma in qualche modo ho avuto in esecuzione utilizzando il valore predefinito /src/androidTest/java cartella con robolectric test JUnit, vedi: stackoverflow.com/a/25473702/1406325
  • Android Studio supporta ora Locale Unit Testing con JUnit 4: stackoverflow.com/a/30273301/885464
  • Cerruti Aggiornamento:Android Studio Demo per come eseguire testcase goo.gl/ac06C0 e di esempio per eseguire rete chiamata di prova goo.gl/bQFlmU
  • Directory di strutture per le prove e testato le classi devono adattarsi. Ecco come farlo facilmente: stackoverflow.com/a/36057080/715269

 

6 Replies
  1. 22

    Di Android Studio 1.1, la risposta è semplice:
    http://tools.android.com/tech-docs/unit-testing-support

    • Questo significa che Robolectric non è più utile? Questo essenzialmente fare la stessa cosa?
    • Nota: Come di Android Studio 2.0 Beta5 il link da descrivere “Test di Artefatto” selettore manca e che entrambe le modalità (junit & insttrumentation) vengono attivati contemporaneamente per impostazione predefinita. Vedere qui per ulteriori informazioni stackoverflow.com/questions/35708263/…
  2. 36

    Normalmente, non è possibile. Benvenuti nel mondo di Android, in cui tutti i test deve essere eseguito su un dispositivo(ad eccezione Robolectric).

    Il motivo principale è che in realtà non hai il quadro delle fonti – anche se convincere l’IDE per eseguire il test in locale, si ottiene immediatamente un “Stub! Non implementato” eccezione.
    “Perché?” ci si potrebbe chiedere? Perché il android.jar che l’SDK fornisce in realtà è tutto stubbed – tutte le classi e i metodi ci sono, ma sono tutti a pochi passi di un’eccezione. È lì per fornire un’API, ma non è lì per dare effettiva attuazione.

    C’è un bellissimo progetto chiamato Robolectric che implementa un sacco di quadro solo così è possibile eseguire test significativo. Accoppiato con una buona finto quadro (ad esempio, Mockito), rende il vostro lavoro più semplice e gestibile.

    Gradle plugin: https://github.com/robolectric/robolectric-gradle-plugin

    • Grazie, Deylan. Io dopo un semplice test che non fanno uso di qualsiasi Android infrastrutture, quindi, la creazione di un nuovo progetto come suggerisci o modificare la Gradle Android configurazione per ospitare regolari test sarà il percorso per andare. Purtroppo ancora non sono riuscito a farlo funzionare – si continua a non funzionare per un motivo o per un altro – ma posterò il risultato se mai riuscirò a farlo funzionare
    • In questo caso, si vuole fare una nuova pianura java Gradle progetto (cioè apply plugin: 'java'), aggiungere in ‘impostazioni.gradle’, sono come una dipendenza del progetto Android (compile project(':plainJavaProjectName')), e basta eseguire il test attività. (Non testato, ma sicuramente dovrebbe funzionare!)
    • Le prove in un semplice java gradle progetto funzionare bene con la linea di comando, ma non all’interno di Android Studio dove sto diventando una “classe non trovata MyTestClass di errore”. Questo è strano perché, COME e la riga di comando dovrebbe utilizzare gradle stesso modo.
    • lukas: hai trovato una soluzione per questo? Mi sono bloccato alla stessa situazione. Classe non trovata in esecuzione per COME.
    • Evitare di gradle se si desidera utilizzare JUnit test, maven è un’opzione migliore.
    • Si può giustificare questa affermazione? Perché Maven meglio?
    • +1 per tagliare progetto in due moduli, un puro java e android.
    • Android Studio sta recuperando lentamente, vedere la recente beta: tools.android.com/tech-docs/unit-testing-support
    • Android Studio supporta ora Locale Unit Testing con JUnit 4: stackoverflow.com/a/30273301/885464

  3. 32

    Intro

    Di notare che al momento della stesura di robolectric 2.4 è l’ultima versione e non ha il supporto per appcompat v7 biblioteca. Supporto wil essere aggiunto in robolectric versione 3.0 (ETA di sicurezza). Anche ActionBar Sherlock può causare problemi con robolectric.

    Utilizzare Robolectric all’interno di Android Studio hai 2 opzioni:

    (Opzione 1) – Esecuzione di test JUnit con Android Studio utilizzando un modulo Java

    Questa tecnica utilizza un modulo java per tutti i test con una dipendenza di android e di un modulo personalizzato test runner con un po ‘ di magia:

    Le istruzioni possono essere trovate qui: http://blog.blundellapps.com/how-to-run-robolectric-junit-tests-in-android-studio/

    Anche di controllare il link alla fine del post per l’esecuzione del test da android studio.

    (Opzione 2) – Esecuzione di Test JUnit con Android Studio utilizzando robolectric-gradle-plugin

    Ho incontrato qualche difficoltà nell’impostazione di test junit per l’esecuzione da gradle in Android Studio.

    Questo è un esempio molto semplice progetto per l’esecuzione di test junit da un gradle progetto Android Studio: https://github.com/hanscappelle/android-studio-junit-robolectric Questo è stato testato con Android Studio 0.8.14, JUnit 4.10, robolectric gradle plugin 0.13+ e robolectric 2.3

    Buildscript (progetto/costruzione.gradle)

    Gli script di build è la build.gradle file nella root del tuo progetto. Ci ho dovuto aggiungere robolectric gradle plugin per classpath

    buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:0.13.2'
    
            //NOTE: Do not place your application dependencies here; they belong
            //in the individual module build.gradle files
            classpath 'org.robolectric:robolectric-gradle-plugin:0.13.+'
    
        }
    }
    
    allprojects {
        repositories {
            jcenter()
        }
    }

    Progetto buildscript (App/build.gradle)

    In uno script di build dell’applicazione del modulo utilizzare il robolectric plugin, add robolectric config e aggiungere androidTestCompile dipendenze.

    apply plugin: 'com.android.application'
    apply plugin: 'robolectric'
    
    android {
        //like any other project
    }
    
    robolectric {
        //configure the set of classes for JUnit tests
        include '**/*Test.class'
        exclude '**/espresso/**/*.class'
    
        //configure max heap size of the test JVM
        maxHeapSize = '2048m'
    
        //configure the test JVM arguments
        jvmArgs '-XX:MaxPermSize=512m', '-XX:-UseSplitVerifier'
    
        //configure whether failing tests should fail the build
        ignoreFailures true
    
        //use afterTest to listen to the test execution results
        afterTest { descriptor, result ->
            println "Executing test for {$descriptor.name} with result: ${result.resultType}"
        }
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
    
        androidTestCompile 'org.robolectric:robolectric:2.3'
        androidTestCompile 'junit:junit:4.10'
    }

    Creare Test JUnit Classi

    Ora di mettere alla prova le classi nel percorso predefinito (o aggiornamento gradle config)

    app/src/androidTest/java

    E il nome del tuo test di classi che terminano con Test (o aggiornare nuovamente config), che si estende junit.framework.TestCase e annotare i metodi di prova con @Test.

    package be.hcpl.android.mytestedapplication;
    
    import junit.framework.TestCase;
    import org.junit.Test;
    
    public class MainActivityTest extends TestCase {
    
        @Test
        public void testThatSucceeds(){
            //all OK
            assert true;
        }
    
        @Test
        public void testThatFails(){
            //all NOK
            assert false;
        }
    }

    Eseguire Test

    Prossima eseguire il test utilizzando gradlew da riga di comando (per renderlo eseguibile con chmod +x se necessario)

    ./gradlew clean test

    Esempio di output:

    Executing test for {testThatSucceeds} with result: SUCCESS
    Executing test for {testThatFails} with result: FAILURE
    
    android.hcpl.be.mytestedapplication.MainActivityTest > testThatFails FAILED
        java.lang.AssertionError at MainActivityTest.java:21
    
    2 tests completed, 1 failed                                  
    There were failing tests. See the report at: file:///Users/hcpl/Development/git/MyTestedApplication/app/build/test-report/debug/index.html
    :app:test                      
    
    BUILD SUCCESSFUL

    Risoluzione dei problemi

    fonte alternativa directory

    Proprio come si può avere il file sorgente java da qualche altra parte è possibile spostare il vostro test file di origine. Basta aggiornare gradle sourceSets config.

        sourceSets {
            main {
                manifest.srcFile 'AndroidManifest.xml'
                java.srcDirs = ['src']
                res.srcDirs = ['res']
                assets.srcDirs = ['assets']
            }
    
            androidTest {
                setRoot('tests')
            }
        }

    pacchetto org.junit non esiste

    Hai dimenticato di aggiungere il test junit dipendenza in app script di build

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
    
        androidTestCompile 'org.robolectric:robolectric:2.3'
        androidTestCompile 'junit:junit:4.10'
    }

    java.lang.RuntimeException: Stub!

    Si sta eseguendo il test con la run configurations da Android Studio invece di riga di comando (Terminale scheda in Android Studio). Per eseguirlo da Android Studio, dovrete aggiornare il app.iml file jdk voce elencati in basso. Vedere deckard-gradle esempio per i dettagli.

    Completo esempio di errore:

    !!! JUnit version 3.8 or later expected:
    
    java.lang.RuntimeException: Stub!
        at junit.runner.BaseTestRunner.<init>(BaseTestRunner.java:5)
        at junit.textui.TestRunner.<init>(TestRunner.java:54)
        at junit.textui.TestRunner.<init>(TestRunner.java:48)
        at junit.textui.TestRunner.<init>(TestRunner.java:41)
        at com.intellij.rt.execution.junit.JUnitStarter.junitVersionChecks(JUnitStarter.java:190)
        at com.intellij.rt.execution.junit.JUnitStarter.canWorkWithJUnitVersion(JUnitStarter.java:173)
        at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:56)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

    ERRORE: JAVA_HOME è impostare una directory non valida

    Vedere questa domanda COSÌ per una soluzione. Aggiungere il seguente esportati bash profilo:

    export JAVA_HOME=`/usr/libexec/java_home -v 1.7`  

    Completa di log di errore:

    ERROR: JAVA_HOME is set to an invalid directory: export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home
    
    Please set the JAVA_HOME variable in your environment to match the
    location of your Java installation.

    Classe di Test non trovato

    Se si desidera eseguire il test da Android Studio Junit Test runner invece dovrete espandere la compilazione.gradle file un po ‘ di più in modo che android studio è possibile trovare il test compilato classi:

    sourceSets {
        testLocal {
            java.srcDir file('src/test/java')
            resources.srcDir file('src/test/resources')
        }
    }
    
    android {
    
        //tell Android studio that the instrumentTest source set is located in the unit test source set
        sourceSets {
            instrumentTest.setRoot('src/test')
        }
    }
    
    dependencies {
    
        //Dependencies for the `testLocal` task, make sure to list all your global dependencies here as well
        testLocalCompile 'junit:junit:4.11'
        testLocalCompile 'com.google.android:android:4.1.1.4'
        testLocalCompile 'org.robolectric:robolectric:2.3'
    
        //Android Studio doesn't recognize the `testLocal` task, so we define the same dependencies as above for instrumentTest
        //which is Android Studio's test task
        androidTestCompile 'junit:junit:4.11'
        androidTestCompile 'com.google.android:android:4.1.1.4'
        androidTestCompile 'org.robolectric:robolectric:2.3'
    
    }
    
    task localTest(type: Test, dependsOn: assemble) {
        testClassesDir = sourceSets.testLocal.output.classesDir
    
        android.sourceSets.main.java.srcDirs.each { dir ->
            def buildDir = dir.getAbsolutePath().split('/')
            buildDir =  (buildDir[0..(buildDir.length - 4)] + ['build', 'classes', 'debug']).join('/')
    
            sourceSets.testLocal.compileClasspath += files(buildDir)
            sourceSets.testLocal.runtimeClasspath += files(buildDir)
        }
    
        classpath = sourceSets.testLocal.runtimeClasspath
    }
    
    check.dependsOn localTest

    da: http://kostyay.name/android-studio-robolectric-gradle-getting-work/

    Alcuni più risorse

    Migliori articoli che ho trovato in giro questo sono:

  4. 1

    Per Android Studio 1.2+ impostazione di un progetto per JUnit è abbastanza semplice provare a seguire questo tutorial:

    Questa è la parte più facile l’impostazione di un progetto per JUnit:

    https://io2015codelabs.appspot.com/codelabs/android-studio-testing#1

    Seguire insieme il passato, fino a che non “L’esecuzione dei test

    Ora, se si desidera integrare con strumentazione di test di seguire da qui:

    https://io2015codelabs.appspot.com/codelabs/android-studio-testing#6

  5. 0

    Vedere questo tutorial da Android Developers sito ufficiale. Anche in questo articolo viene illustrato come creare mock-up per il vostro test.

    Dal modo in cui, si dovrebbe notare che l’ambito delle dipendenze per il semplice test JUnit dovrebbe essere “testCompile”.

Lascia un commento