Comment exécuter des tests unitaires avec Android Studio

J'utilise le plugin de test Android unit de Jake pour gradle:https://github.com/JakeWharton/gradle-android-test-plugin

ma carrure.gradle ressemble à ceci:

dependencies {
// analytics
compile('com.crittercism:crittercism-android:3.0.11')

// retrofit
compile('com.squareup.retrofit:retrofit:1.2.2')
compile('com.squareup.okhttp:okhttp:1.2.1')

// dagger
compile('com.squareup.dagger:dagger:1.1.0')
compile('com.squareup.dagger:dagger-compiler:1.1.0')

// compatibility
compile('android.compatibility:android-support:v4-r13')
compile('com.actionbarsherlock:actionbarsherlock:4.4.0@aar')

// Picasso
compile('com.squareup.picasso:picasso:2.1.1')

// Otto
compile('com.squareup:otto:1.3.4')

// Tests
testCompile 'junit:junit:4.10'
testCompile 'org.robolectric:robolectric:2.2'
testCompile 'org.powermock:powermock-api-mockito:1.5.1'
testCompile 'org.easytesting:fest-assert-core:2.0M10'
}

malheureusement, je ne suis pas en mesure d'exécuter tous les tests ou des unités spécifiques de Android Studio. J'obtiens une erreur:

Exception in thread "main" java.lang.NoClassDefFoundError: junit/textui/ResultPrinter
 at java.lang.Class.forName0(Native Method)
 at java.lang.Class.forName(Class.java:171)
 at com.intellij.rt.execution.application.AppMain.main(AppMain.java:113)
Caused by: java.lang.ClassNotFoundException: junit.textui.ResultPrinter
 at java.net.URLClassLoader.run(URLClassLoader.java:202)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
 at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
 ... 3 more

et c'est correct car exécuter la ligne de commande n'inclut pas ma dépendance JUnit:

/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java -ea -Didea.launcher.port=7533 "-Didea.launcher.bin.path=/Applications/Android Studio.app/bin" -Dfile.encoding=UTF-8 -classpath "/Applications/Android Studio.app/lib/idea_rt.jar:/Applications/Android Studio.app/plugins/junit/lib/junit-rt.jar:/Users/eugen/Development/SDK/android-sdk-macosx/platforms/android-18/android.jar:/Users/eugen/Development/SDK/android-sdk-macosx/platforms/android-18/data/res:/Users/eugen/Development/SDK/android-sdk-macosx/tools/support/annotations.jar:/Users/eugen/Development/Projects/eBuddy/xms/android/xms3-android/build/classes/alpha/debug:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup.retrofit/retrofit/1.2.2/jar/cdf7b60568092fbcc7a254371c345e92f733c03c/retrofit-1.2.2.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.google.code.gson/gson/2.2.4/jar/a60a5e993c98c864010053cb901b7eab25306568/gson-2.2.4.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup.okhttp/okhttp/1.2.1/jar/c3562574496bb4d452d6fc45b817577e98d08afe/okhttp-1.2.1.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup/javawriter/2.1.1/jar/67ff45d9ae02e583d0f9b3432a5ebbe05c30c966/javawriter-2.1.1.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup.dagger/dagger/1.1.0/jar/49f2061c938987c8e56679a731d74fd8448d8742/dagger-1.1.0.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup.picasso/picasso/2.1.1/jar/ab19bfb23f641f189b6dca9a4d393f8dc291103a/picasso-2.1.1.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup/otto/1.3.4/jar/4d72fb811c7b3c0e7f412112020d4430f044e510/otto-1.3.4.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup.dagger/dagger-compiler/1.1.0/jar/ddb38c2be31deeb7a001177f7c358665e350d646/dagger-compiler-1.1.0.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/javax.inject/javax.inject/1/jar/6975da39a7040257bd51d21a231b76c915872d38/javax.inject-1.jar:/Users/eugen/Development/Projects/eBuddy/xms/android/xms3-android/build/exploded-bundles/ComActionbarsherlockActionbarsherlock440.aar/res:/Users/eugen/Development/Projects/eBuddy/xms/android/xms3-android/build/exploded-bundles/ComActionbarsherlockActionbarsherlock440.aar/classes.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.squareup.okhttp/okhttp-protocols/1.2.1/jar/ec2beaefef3bd4f680c17fad8e72e66f2a006f1/okhttp-protocols-1.2.1.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/com.crittercism/crittercism-android/3.0.11/jar/e30c21ae491d780622ecaee2752969be98140c3/crittercism-android-3.0.11.jar:/Users/eugen/.gradle/caches/artifacts-26/filestore/android.compatibility/android-support/v4-r13/jar/bd6479f5dd592790607e0504e66e0f31c2b4d308/android-support-v4-r13.jar" com.intellij.rt.execution.application.AppMain com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 @/private/var/folders/wq/knhztnf105v2_p1t580tj8h80000gp/T/idea_junit701450667388095664.tmp @w@/private/var/folders/wq/knhztnf105v2_p1t580tj8h80000gp/T/idea_working_dirs_junit4927192380605663413.tmp -socket63849

je me demande si quelqu'un a pu faire tourner unit des tests sur Android Studio? Et si c'est possible comment faire?

26
demandé sur Luis 2013-11-10 19:34:27

5 réponses

il suffit d'ajouter un dossier nommé instrumentTest sous / src il doit avoir /java à l'intérieur comme ceci

enter image description here

puis étendre la classe ActivityTestCase (ou toute autre classe unité-test android), comme

package com.example.app.test;

import android.test.ActivityTestCase;

import junit.framework.Assert;


public class MainActivityTest extends ActivityTestCase {


public void testHappy(){
    Assert.assertTrue(true);
}

} 

clic droit sur le répertoire java vert et sélectionnez Exécuter tous les tests et vous devriez obtenir ceci:

enter image description here

bonne chance

27
répondu zebra 2014-02-05 13:13:50

mise à Jour pour 1,1+, android plugin gradle 1.1+

enfin c'est possible sans beaucoup d'astuces. Voici un exemple de projet qui montre comment configurer Robolectric test Android Studio v1.1+ et android gradle plugin v1.1+: https://github.com/nenick/AndroidStudioAndRobolectric

vous pouvez trouver aussi là problème possible et solutions de travail. Oui, Robolectric est complexe et n'est pas officiellement pris en charge par Google, il a donc encore quelques problèmes. Mais la plupart du temps ça fonctionne et apporte une grande valeur à votre projet.

je voudrais aussi vous encourager à commencer à utiliser Robolectric v3+. Il est presque libéré et assez stable.

ancienne réponse pour AS 0.X et 1.0 X et android gradle version plugin en dessous de 1.1

j'ai réussi à le faire avec l'aide d'amis.

donc en gros, vous devez faire les changements suivants pour exécuter des tests d'unités Robolectric dans Android Studio:

  1. Copiez votre chemin de classe pour le test (vous pouvez trouver en première ligne dans "Exécuter" dans le journal).
  2. Ouvrir configuration d'exécution de vos tests unitaires
  3. changez le dir de travail en dossier où AndroidManifest.xml est présent
  4. ajouter L'Option VM -classpath "<path_to_project_folder>/build/test-classes:<path_to_gradle_cache>/caches/modules-2/files-2.1/junit/junit/4.11/4e031bb61df09069aeb2bffb4019e7a5034a4ee0/junit-4.11.jar:<your old classpath>"

pour moi le début d'un nouveau chemin de classe ressemble à ceci:

/Users/emartynov/Development/Projects/work/android.project/build/test-classes:/Users/emartynov/.gradle/caches/modules-2/files-2.1/junit/junit/4.11/4e031bb61df09069aeb2bffb4019e7a5034a4ee0/junit-4.11.jar

Problèmes:

  1. vous pouvez lancer le test seulement pour la variante de débogage
  2. chaque nouvelle configuration d'exécution d'essai nécessite de telles modifications manuelles. Mais c'est tout simplement un copier/coller de deux champs d'édition

J'ai Android Studio version 0.6. Ici, c'est encore une partie de mon build.gradle fichier:

buildscript {
  repositories {
    mavenCentral()
    maven { url 'https://github.com/rockerhieu/mvn-repo/raw/master/' }
  }

  dependencies {
    classpath 'com.android.tools.build:gradle:0.11.+'
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.3'
  //  classpath 'org.robolectric.gradle:gradle-android-test-plugin:0.10.1'
    classpath 'org.robolectric.gradle:gradle-android-test-plugin:0.10.1-SNAPSHOT'
    classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.10.+'
  }
}

apply plugin: 'android-sdk-manager'
apply plugin: 'android'
apply plugin: 'android-apt'
apply plugin: 'android-test'

repositories {
  mavenCentral()
}

android {
  compileSdkVersion 19
  buildToolsVersion "19.1.0"

  packagingOptions {
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/notice.txt'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/license.txt'
    exclude 'META-INF/ASL2.0'
    exclude 'LICENSE.txt'
  }

  defaultConfig {
    minSdkVersion 14
    targetSdkVersion 19
    versionCode 1
    versionName "0.9.0"
  }

  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
  }

  sourceSets {
    androidTest.setRoot( 'src/test' )
  }
}

dependencies {
  // butter knife
  compile 'com.jakewharton:butterknife:5.0.0'
  // dagger
  compile 'com.squareup.dagger:dagger:1.2.1'

  // apt
  apt 'com.squareup.dagger:dagger-compiler:1.+'

  // AS tests
  androidTestCompile 'junit:junit:4.+'
  androidTestCompile( 'org.robolectric:robolectric:2.3' ) {
    exclude group: 'commons-logging'
    exclude group: 'org.apache.httpcomponents'
  }
  androidTestCompile 'com.squareup:fest-android:1.+'
  androidTestCompile 'org.mockito:mockito-all:1.9.+'
  androidTestCompile 'org.easytesting:fest-assert-core:2.0M10'
  androidTestCompile( 'org.skyscreamer:jsonassert:1.2.+' ) {
    exclude group: 'org.json'
  }

  // tests
  testCompile 'junit:junit:4.+'
  testCompile( 'org.robolectric:robolectric:2.3' ) {
    exclude group: 'commons-logging'
    exclude group: 'org.apache.httpcomponents'
  }
  testCompile 'com.squareup:fest-android:1.+'
  testCompile 'org.mockito:mockito-all:1.9.+'
  testCompile 'org.easytesting:fest-assert-core:2.0M10'
  testCompile 'com.squareup.dagger:dagger-compiler:1.+'
  testCompile( 'org.skyscreamer:jsonassert:1.2.+' ) {
    exclude group: 'org.json'
  }
}
10
répondu Eugen Martynov 2015-04-16 07:55:17

j'ai rencontré ce problème et trouvé une solution - inclure des classes.pot de l'explosé paquet (.aar) dans le dossier build. Je ne pense pas que ça aidera à trouver des ressources .aar dépendances.

testCompile fileTree(dir: "$project.buildDir/exploded-bundles", include: "**/classes.jar")

Edit: depuis Android Gradle construire des outils 0.9.0 la dépendance a changé:

androidTestCompile fileTree(dir: "$project.buildDir/exploded-aar", include: "**/classes.jar")

Edit 2: depuis Android Gradle construire des outils 0.10.0 la dépendance a changé à:

androidTestCompile fileTree(dir: "$project.buildDir/../../build/exploded-aar", include: "**/classes.jar")

Note: le chemin relatif peut être différent selon la structure de votre projet.

2
répondu myanimal 2014-06-07 15:39:20

j'ai eu un problème similaire avec COMME 1.2.2.

j'ai suivi les étapes ici. Fondamentalement:

  • a ouvert la fenêtre de L'outil" Construire des variantes "(voir l'image sur le lien) et a remplacé le menu déroulant" tester L'artefact "par"tester les unités".
  • Créer un répertoire pour vos tests de code source, c'est à dire src/test/java, et déplacez votre test pour le paquet.
  • assurez-vous que les sections suivantes de votre build.gradle le fichier contient les présentes:

    dependencies { 
        testCompile 'junit:junit:4.12'
    }
    
    android {
        sourceSets {
            test {
                resources {
                    srcDir "test"
                }
            }
        }
    }
    

Voila! Cliquez avec le bouton droit de la souris sur votre cas d'essai et sélectionnez la saveur de JUnit.

BTW, il semble basculer la visibilité des tests JUnit/Android lorsque vous changez l'outil "Construire des variantes", donc je pense que vous pouvez soit tester en tant que JUnit ou Android mais pas les deux en même temps.

0
répondu ocarlsen 2015-08-30 23:34:07

Pour la postérité Android Studio 2.0+ supporte l'exécution de tests unitaires sans plugins.

JUnit configuration in Android Studio 2.0+

on peut accéder à cet écran par le menu Exécuter > Modifier les Configurations...

0
répondu scottyab 2016-10-13 18:30:24