如何运行单元测试与Android工作室 [英] How to run unit tests with Android Studio

查看:291
本文介绍了如何运行单元测试与Android工作室的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是杰克的Andr​​oid单元测试插件摇篮:<一href="https://github.com/JakeWharton/gradle-android-test-plugin">https://github.com/JakeWharton/gradle-android-test-plugin

我的build.gradle看起来是这样的:

 相关性{
//分析
编译(com.crittercism:crittercism-机器人:3.0.11)

//改造
编译(com.squareup.retrofit:改造:1.2.2)
编译(com.squareup.okhttp:okhttp:1.2.1)

// 匕首
编译(com.squareup.dagger:短剑:1.1.0)
编译(com.squareup.dagger:匕首编译:1.1.0)

// 兼容性
编译(android.compatibility:Android的支持:V4-R13)
编译(com.actionbarsherlock:actionbarsherlock:4.4.0@aar)

//毕加索
编译(com.squareup.picasso:毕加索:2.1.1)

//奥托
编译(com.squareup:奥托:1.3.4)

//测试
testCompile'的JUnit:JUnit的:4.10
testCompileorg.robolectric:robolectric:2.2
testCompileorg.powermock:powermock-API的Mockito:1.5.1
testCompileorg.easytesting:巨星断言核心:2.0M10
}
 

不幸的是,我不能够运行所有或特定的单元测试形式的Andr​​oid工作室。我得到的错误:

 在线程异常主要java.lang.NoClassDefFoundError的:JUnit的/文本界面/ ResultPrinter
 在java.lang.Class.forName0(本机方法)
 在java.lang.Class.forName(Class.java:171)
 在com.intellij.rt.execution.application.AppMain.main(AppMain.java:113)
致:抛出java.lang.ClassNotFoundException:junit.textui.ResultPrinter
 在java.net.URLClassLoader的$ 1.运行(URLClassLoader.java:202)
 在java.security.AccessController.doPrivileged(本机方法)
 在java.net.URLClassLoader.findClass(URLClassLoader.java:190)
 在java.lang.ClassLoader.loadClass(ClassLoader.java:306)
 在sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:301)
 在java.lang.ClassLoader.loadClass(ClassLoader.java:247)
 ... 3更多
 

这是正确的,因为运行命令行不包括我的JUnit依赖:

  /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java -ea -Didea.launcher.port = 7533-Didea.launcher。 bin.path = /应用/ Android的Studio.app /箱-Dfile.encoding = UTF-8 -classpath/应用/ Android的Studio.app / lib中/ idea_rt.jar:/应用/ 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.$c$c.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 @ /私营/无功/文件夹/ WQ / knhztnf105v2_p1t580tj8h80000gp / T / idea_junit701450667388095664.tmp @w@/private/var/folders/wq/knhztnf105v2_p1t580tj8h80000gp/T/idea_working_dirs_junit4927192380605663413.tmp -socket63849
 

我不知道是否有人能在Android的Studio中运行单元测试?而且如果可能的话怎么做呢?

解决方案

更新AS 1.1+,Android的摇篮插件1.1 +

最后有可能没有花样繁多。下面是例子项目,说明如何建立 Robolectric 测试 Android的工作室V1.1 + Android的摇篮插件V1.1 + https://github.com/nenick/AndroidStudioAndRobolectric

您还可以找到有可能的问题和解决方法。是的, Robolectric 是复杂的,而不是由谷歌官方支持,因此还是有一些问题。但大部分作品和时间带来巨大的价值,你的项目。

我也建议你开始使用 Robolectric V3 + 。这几乎是释放,不够稳定。

有关AS 0.X和1.0倍和Android摇篮的插件版本低于1.1 旧的答案

我设法在朋友帮助下做到这一点。

所以基本上你需要做下一个改变运行Android的工作室Robolectric单元测试:

  1. 复制您的类路径测试(你可以找到它的运行日志第一行)
  2. 为单元测试打开运行配置
  3. 更改工作目录到文件夹中的Andr​​oidManifest.xml是present
  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旧的类路径&GT;

至于我的新的类路径的开始是这样的:

<$p$p><$c$c>/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. 在每一个新的测试运行配置需要这样的手动更改。但是,这是简单的复制/两个编辑字段粘贴

我有机器人工作室0.6版本。这又是我的 build.gradle 文件的一部分:

  buildscript {
  库{
    mavenCentral()
    行家{URLhttps://github.com/rockerhieu/mvn-repo/raw/master/'}
  }

  依赖{
    类路径com.android.tools.build:gradle:0.11.+
    类路径com.neenbedankt.gradle.plugins:Android的贴切:1.3
  //类路径org.robolectric.gradle:摇篮,Android的测试插件:0.10.1
    类路径org.robolectric.gradle:摇篮,Android的测试插件:0.10.1-快照
    类路径com.jakewharton.sdkmanager:摇篮 - 插件:0.10 +。
  }
}

应用插件:Android的SDK管理器
应用插件:'机器人'
应用插件:Android的容易
应用插件:Android的测试

库{
  mavenCentral()
}

安卓{
  compileSdkVersion 19
  buildToolsVersion19.1.0

  packagingOptions {
    不包括META-INF /注意事项
    不包括META-INF / NOTICE.txt
    不包括META-INF / notice.txt
    不包括META-INF /许可证
    不包括META-INF / LICENSE.TXT
    不包括META-INF / LICENSE.TXT
    不包括META-INF / ASL2.0
    排除的LICENSE.txt
  }

  defaultConfig {
    的minSdkVersion 14
    targetSdkVersion 19
    版本code 1
    VERSIONNAME0.9.0
  }

  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
  }

  sourceSets {
    androidTest.setRoot(SRC /测试)
  }
}

依赖{
  // 牛油刀
  编译com.jakewharton:butterknife:5.0.0
  // 匕首
  编译com.squareup.dagger:短剑:1.2.1

  // 易于
  易'com.squareup.dagger:匕首编译:1 +'

  // AS测试
  androidTestCompile'的JUnit:JUnit的:4 +
  androidTestCompile('org.robolectric:robolectric:2.3'){
    排除组:共享记录
    排除组:org.apache.httpcomponents
  }
  androidTestCompilecom.squareup:巨星-机器人:1 +'
  androidTestCompileorg.mockito:的Mockito全:1.9 +。
  androidTestCompileorg.easytesting:巨星断言核心:2.0M10
  androidTestCompile('org.skyscreamer:jsonassert:1.2 +'){
    排除组:org.json
  }

  //测试
  testCompile'的JUnit:JUnit的:4 +
  testCompile('org.robolectric:robolectric:2.3'){
    排除组:共享记录
    排除组:org.apache.httpcomponents
  }
  testCompilecom.squareup:巨星-机器人:1 +'
  testCompileorg.mockito:的Mockito全:1.9 +。
  testCompileorg.easytesting:巨星断言核心:2.0M10
  testCompilecom.squareup.dagger:匕首编译:1 +'
  testCompile('org.skyscreamer:jsonassert:1.2 +'){
    排除组:org.json
  }
}
 

I'm using Jake's Android unit tests plugin for gradle: https://github.com/JakeWharton/gradle-android-test-plugin

My build.gradle looks like this:

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

Unfortunately I'm not able to run all or specific unit test form Android Studio. I'm getting error:

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

And this is correct because running command line doesn't include my JUnit dependency:

/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

I wonder if anyone was able to run unit tests in Android Studio? And if it is possible how make it?

解决方案

Update for AS 1.1+, android gradle plugin 1.1+

Finally it is possible without many tricks. Here is example of project that shows how to setup Robolectric test in Android Studio v1.1+ and android gradle plugin v1.1+: https://github.com/nenick/AndroidStudioAndRobolectric

You can find also there possible issue and workarounds. Yes, Robolectric is complex and not officially supported by Google so it still has some issues. But most of the time it works and brings huge value to your project.

I would also encourage you to start using Robolectric v3+. It is almost released and stable enough.

Old answer for AS 0.x and 1.0x and android gradle plugin version below 1.1

I managed to make it with help of friends.

So basically you need to make next changes to run Robolectric unit tests in Android Studio:

  1. Copy your classpath for test (you can find it as first line in "Run" log)
  2. Open run configuration for your unit tests
  3. Change working dir to folder where AndroidManifest.xml is present
  4. Add VM Option -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>"

As for me the start of new classpath looks like this:

/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

Problems:

  1. You can run test only for debug variant
  2. Every new test run configuration requires such manual changes. But this is simply copy/paste of two edit fields

I have Android Studio 0.6 version. Here is again part of my build.gradle file:

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

这篇关于如何运行单元测试与Android工作室的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆