Frage Ausführen einfacher JUnit-Tests in Android Studio (IntelliJ) bei Verwendung einer Gradle-basierten Konfiguration


ich benutze Android Studio/IntelliJ auf einem bestehenden aufbauen Android Projekt und möchte etwas einfaches hinzufügen JUnit Komponententests. In welchem ​​Ordner werden solche Tests hinzugefügt?

Der Android Gradle Plug-in definiert eine Verzeichnisstruktur mit src/main/java für den Hauptquellcode und src/instrumentTest/java zum Android Tests.

Der Versuch, meine JUnit-Tests in InstrumentTest hinzuzufügen, funktionierte nicht für mich. Ich kann es als laufen lassen Android test (dafür steht das Verzeichnis), aber das ist nicht das, wonach ich suche - ich möchte einfach ein einfaches ausführen JUnit Prüfung. Ich habe versucht, eine JUnit-Laufkonfiguration für diese Klasse zu erstellen, aber das hat auch nicht funktioniert - ich nehme an, weil ich ein Verzeichnis verwende, das als markiert ist Android Test statt Quelle.

Wenn ich einen neuen Quellordner erstelle und ihn als solchen in der Projektstruktur markiere, wird er beim nächsten Mal gelöscht IntelliJ Aktualisiert die Projektkonfiguration aus den Gradle-Build-Dateien.

Was ist die geeignetere Methode zum Konfigurieren von JUnit-Tests in einem auf Großrechnern basierenden Android-Projekt? IntelliJ? Welche Verzeichnisstruktur soll dafür verwendet werden?


76
2017-07-24 21:16


Ursprung


Antworten:


Ab Android Studio 1.1 ist die Antwort jetzt einfach: http://tools.android.com/tech-docs/unit-testing-support


22
2018-02-11 20:53



Normalerweise können Sie nicht. Willkommen in der Welt von Android, wo alle Tests auf einem Gerät (außer Robolectric) laufen müssen.

Der Hauptgrund ist, dass Sie nicht die Quellen des Frameworks haben - selbst wenn Sie die IDE dazu verleiten, den Test lokal auszuführen, erhalten Sie sofort eine Ausnahme "Stub! Not implemented". "Warum?" Sie könnten sich wundern? Weil das android.jar dass das SDK Ihnen gibt, ist wirklich alle ausgedrückt - alle Klassen und Methoden sind dort, aber sie alle werfen nur eine Ausnahme. Es ist dort, um eine API zur Verfügung zu stellen, aber nicht dort, um Ihnen irgendeine tatsächliche Implementierung zu geben.

Es gibt ein wunderbares Projekt namens Roboelektrisch Das implementiert eine Menge des Frameworks, so dass Sie aussagekräftige Tests durchführen können. Zusammen mit einem guten Mock-Framework (z. B. Mockito) macht es Ihren Job überschaubar.

Gradle-Plugin: https://github.com/robolectric/robolectric-gradel-plugin


36
2017-07-24 22:01



Einführung

Beachten Sie, dass robolectric 2.4 zum Zeitpunkt des Schreibens die neueste Version ist und keine Unterstützung für appcompat v7 Bibliothek. Support wird in der robolectric 3.0-Version hinzugefügt (noch keine ETA). Ebenfalls ActionBar Sherlock kann Probleme mit Robolectric verursachen.

Um Robolectric in Android Studio zu verwenden, haben Sie zwei Möglichkeiten:

(Option 1) - Ausführen von JUnit-Tests mit Android Studio mithilfe eines Java-Moduls

Diese Technik verwendet ein Java-Modul für alle Ihre Tests mit einer Abhängigkeit zu Ihrem Android-Modul und einen benutzerdefinierten Test-Runner mit etwas Magie:

Anweisungen finden Sie hier: http://blog.blundellapps.com/how-to-run-robolectric-junit-tests-in-android-studio/

Überprüfen Sie auch den Link am Ende des Posts für die Tests von Android Studio.

(Option 2) - Ausführen von JUnit-Tests mit Android Studio mit dem robolectric-gradle-plugin

Ich habe einige Probleme bei der Einrichtung von Junit-Tests festgestellt, die in Android Studio ausgeführt werden.

Dies ist ein sehr einfaches Beispielprojekt für das Ausführen von Junit-Tests von einem auf Großprojekten basierenden Projekt in Android Studio: https://github.com/hanscappelle/android-studio-junit-robolectric Dies wurde mit Android Studio 0.8.14, JUnit 4.10, Robolectric Gradle Plugin 0.13+ und Robolectric 2.3 getestet

Buildscript (Projekt / Build.gradle)

Das Build-Skript ist die Datei build.gradle im Stammverzeichnis Ihres Projekts. Da musste ich hinzufügen Robolectric Gradle Plugin zum Klassenpfad

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()
    }
}

Projekt Buildscript (App / Build.gradle)

Verwenden Sie im Build-Skript Ihres App-Moduls die Option robolectric Plugin, hinzufügen robolectric konfigurieren und hinzufügen androidTestCompile Abhängigkeiten.

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'
}

Erstellen Sie JUnit-Testklassen

Setze nun die Test-Klassen in den Standard-Speicherort (oder aktualisiere grdle config)

app/src/androidTest/java

Und nenne deine Test-Klassen, die mit Test enden (oder wieder update config) und erweitere junit.framework.TestCase und kommentieren Testmethoden mit @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;
    }
}

Führen Sie Tests aus

Als nächstes führen Sie die Tests mit grodlew von der Kommandozeile aus (machen Sie es ausführbar mit chmod +x wenn benötigt)

./gradlew clean test

Beispielausgabe:

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

Fehlerbehebung

alternative Quellverzeichnisse

Genauso wie Sie Ihre Java-Quelldateien irgendwo anders haben können, können Sie Ihre Testquelldateien verschieben. Aktualisieren Sie einfach die Größe sourceSets Konfig.

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        androidTest {
            setRoot('tests')
        }
    }

Das Paket org.junit existiert nicht

Sie haben vergessen, die Junit-Test-Abhängigkeit im App-Build-Skript hinzuzufügen

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    androidTestCompile 'org.robolectric:robolectric:2.3'
    androidTestCompile 'junit:junit:4.10'
}

java.lang.RuntimeException: Stub!

Sie führen diesen Test mit den Laufkonfigurationen von Android Studio anstelle der Befehlszeile aus (Registerkarte "Terminal" in Android Studio). Um es von Android Studio aus zu starten, müssen Sie das Update durchführen app.iml Datei, um den jdk-Eintrag unten aufgelistet zu haben. Sehen Deckard-Gradle-Beispiel für Details.

Vollständiges Fehlerbeispiel:

!!! 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)

FEHLER: JAVA_HOME ist auf ein ungültiges Verzeichnis eingestellt

Sehen diese SO Frage für eine Lösung. Fügen Sie den folgenden Export zu Ihrem bash Profil hinzu:

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

Das vollständige Fehlerprotokoll:

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.

Testklasse nicht gefunden

Wenn Sie Ihre Tests von Android Studio Junit Test runner ausführen möchten, müssen Sie die build.gradle-Datei etwas erweitern, damit Android Studio Ihre kompilierten Testklassen finden kann:

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

von: http://kostyay.name/android-studio-robolectric-gra-dle-getting-work/

Etwas mehr Ressourcen

Die besten Artikel, die ich hier gefunden habe, sind:


32
2017-11-03 15:18



Dies wird jetzt in Android Studio ab Android Gradle plugin 1.1.0 unterstützt.

https://developer.android.com/training/testing/unit-testing/local-unit-tests.html

Beispiel-App mit lokalen Unit-Tests auf GitHub:

https://github.com/googlesamples/android-testing/tree/master/unittesting/BasicSample


4
2018-05-16 08:07



Zum Android Studio 1.2+ Ein Projekt für JUnit ist ziemlich einfach Versuchen Sie, dieses Tutorial zu folgen:

Dies ist der einfachste Teil zum Einrichten eines Projekts für JUnit:

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

Folge dem alten Link bis "Ausführen Ihrer Tests"

Jetzt, wenn Sie mit Intrumentation Test integrieren möchten, folgen Sie von hier:

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


1
2017-09-09 00:50



Bitte sehen Sie dies Anleitung von der offiziellen Android-Entwickler-Website. Dieser Artikel zeigt außerdem, wie Sie Mock-ups für Ihre Tests erstellen.

Übrigens sollten Sie beachten, dass der Umfang der Abhängigkeiten für den einfachen JUnit-Test "testCompile" sein sollte.


0
2017-12-09 01:36