32

私はGradle用のJakeのAndroid単体テストプラグインを使用しています: https://github.com/JakeWharton/gradle-android-test-plugin

私のbuild.gradleは次のようになります:

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

残念ながら、Android Studio からすべてまたは特定の単体テストを実行することはできません。エラーが発生します:

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$1.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

コマンドラインの実行には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

誰かが Android Studio で単体テストを実行できたのだろうか? また、可能であればどのように作るのですか?

4

5 に答える 5

10

AS 1.1+、android gradle プラグイン 1.1+ の更新

最後に、多くのトリックなしで可能です。およびRobolectricでテストをセットアップする方法を示すプロジェクトの例を次に示します: https://github.com/nenick/AndroidStudioAndRobolectricAndroid Studio v1.1+android gradle plugin v1.1+

考えられる問題と回避策も見つけることができます。はい、Robolectric複雑であり、Google によって公式にサポートされていないため、まだいくつかの問題があります。しかし、ほとんどの場合、それは機能し、プロジェクトに大きな価値をもたらします。

の使用を開始することもお勧めしますRobolectric v3+。ほぼリリースされており、十分に安定しています。

AS 0.x および 1.0x および 1.1 未満の android gradle プラグイン バージョンに対する古い回答

友達の助けを借りて、なんとか作ることができました。

Android Studio で Robolectric 単体テストを実行するには、基本的に次の変更を行う必要があります。

  1. テスト用にクラスパスをコピーします (「実行」ログの最初の行として見つけることができます)
  2. 単体テストの実行構成を開く
  3. 作業ディレクトリを AndroidManifest.xml が存在するフォルダーに変更します
  4. 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>"

私の場合、新しいクラスパスの開始は次のようになります。

/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

問題:

  1. デバッグバリアントに対してのみテストを実行できます
  2. すべての新しいテスト実行構成には、このような手動の変更が必要です。しかし、これは単に 2 つの編集フィールドをコピーして貼り付けるだけです

私は Android Studio 0.6 バージョンを持っています。ここに再び私のbuild.gradleファイルの一部があります:

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'
  }
}
于 2014-06-10T12:18:28.210 に答える
2

私はこの問題に遭遇し、解決策を見つけました - 展開されたバンドル (.aar) からの classes.jar をビルド フォルダーに含めます。ただし、.aar 依存関係でリソースを見つけるのに役立つとは思いません。

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

編集: Android Gradle ビルド ツール0.9.0 以降、依存関係は次のように変更されました。

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

編集 2: Android Gradle ビルド ツール0.10.0以降、依存関係は次のように変更されました。

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

注: 相対パスは、プロジェクトの構造によって異なる場合があります。

于 2014-02-28T09:56:19.133 に答える
0

後世のために、Android Studio 2.0+はプラグインなしでのユニット テストの実行をサポートしています。

Android Studio 2.0 以降での JUnit 構成

この画面には、メニューの [実行] > [構成の編集...] からアクセスできます。

于 2016-03-17T13:07:40.357 に答える
0

AS 1.2.2 でも同様の問題がありました。

ここの手順に従いました。基本的:

  • 「ビルド バリアント」ツール ウィンドウを開き (リンクの画像を参照)、「テスト アーティファクト」ドロップダウンを「単体テスト」に変更しました。
  • テスト ソース コード用のディレクトリを作成し、src/test/javaそこにあるそれぞれのパッケージにテストを移動します。
  • build.gradleファイルの次のセクションにこれらが含まれていることを確認してください。

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

出来上がり!テスト ケースを右クリックし、JUnit フレーバーを選択します。

ところで、「Build Variants」ツールを変更すると、JUnit/Android テストの可視性が切り替わるように見えるので、JUnit または Android としてテストすることはできますが、両方を同時にテストすることはできないと思います。

于 2015-08-30T23:34:07.390 に答える