L'exécution de Tests JUnit avec Android Studio à l'aide de robolectric
J'ai rencontré quelques problèmes de réglage jusqu'junit tests à exécuter à partir de gradle dans Android Studio.
C'est un exemple très simple du projet pour l'exécution des tests junit à partir d'un gradle projet basé sur Android Studio: https://github.com/hanscappelle/android-studio-junit-robolectric Cela a été testé avec Android Studio 0.8.14, JUnit 4.10, robolectric plugin gradle 0.13+ et robolectric 2.3
Buildscript (project/build.gradle)
Le script de construction est la construction.gradle fichier dans la racine de votre projet. Là, j'ai dû ajouter de la robolectric plugin gradle pour 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()
}
}
Projet buildscript (App/build.gradle)
Dans le script de création de votre application module d'utiliser l' robolectric
plugin, ajouter robolectric
config et ajouter androidTestCompile
dépendances.
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'
}
Créer Des Classes De Test JUnit
Maintenant, mettez les classes de test dans l'emplacement par défaut (ou mise à jour de gradle config)
app/src/androidTest/java
Et le nom de vos classes de tests de fin de Test (ou encore de mise à jour de config), s'étendant junit.framework.TestCase
et annoter des méthodes d'essai avec @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;
}
}
L'Exécution Des Tests
Prochaine exécuter les tests en utilisant gradlew en ligne de commande (le rendre exécutable à l'aide de chmod +x
si nécessaire)
./gradlew clean test
Exemple de sortie:
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
Dépannage
autre source répertoires
Tout comme vous pouvez avoir vos fichiers source java ailleurs que vous pouvez déplacer votre test fichiers sources. Juste mettre à jour gradle sourceSets
config.
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
androidTest {
setRoot('tests')
}
}
package org.junit n'existe pas
Vous avez oublié d'ajouter la junit test de dépendance à l'application du script de création
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile 'org.robolectric:robolectric:2.3'
androidTestCompile 'junit:junit:4.10'
}
java.lang.RuntimeException: Stub!
Vous êtes l'exécution de ce test avec la configuration à partir d'Android Studio, au lieu de la ligne de commande (Terminal onglet dans Android Studio). Pour l'exécuter à partir d'Android Studio, vous aurez à mettre à jour l' app.iml
le fichier pour avoir le jdk entrée listés en bas. Voir deckard-gradle exemple pour plus de détails.
Complet exemple d'erreur:
!!! 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)
ERREUR: JAVA_HOME est fixé à un répertoire non valide
Voir ce DONC, la question pour trouver une solution. Ajouter le dessous de l'exportation de vous bash profil:
export JAVA_HOME=`/usr/libexec/java_home -v 1.7`
Complète du journal des erreurs:
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.
La Classe de Test non trouvé
Si vous souhaitez exécuter vos tests à partir de Android Studio de Test Junit coureur au lieu de cela, vous aurez à développer le construire.gradle fichier un peu plus, de sorte que android studio pouvez trouver votre compilé classes de test:
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
instrumentTestCompile 'junit:junit:4.11'
instrumentTestCompile 'com.google.android:android:4.1.1.4'
instrumentTestCompile '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
de: http://kostyay.name/android-studio-robolectric-gradle-getting-work/
Certains plus de ressources
Les meilleurs articles que j'ai trouvé autour de cette question sont: