如何运行单元测试与Android工作室

编程入门 行业动态 更新时间:2024-10-23 17:28:03
本文介绍了如何运行单元测试与Android工作室的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我使用的是杰克的Andr​​oid单元测试插件摇篮:github/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) // 兼容性 编译(androidpatibility: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.URLClassLoader的$ 1.运行(URLClassLoader.java:202)  在java.security.AccessController.doPrivileged(本机方法)  在java.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/androidpatibility/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 + : github/nenick/AndroidStudioAndRobolectric

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

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

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

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

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

  • 复制您的类路径测试(你可以找到它的运行日志第一行)
  • 为单元测试打开运行配置
  • 更改工作目录到文件夹中的Andr​​oidManifest.xml是present
  • 添加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;
  • 至于我的新的类路径的开始是这样的:

    /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

    问题:

  • 您只能为调试版本上运行测试
  • 在每一个新的测试运行配置需要这样的手动更改。但是,这是简单的复制/两个编辑字段粘贴
  • 我有机器人工作室0.6版本。这又是我的 build.gradle 文件的一部分:

    buildscript {   库{     mavenCentral()     行家{URLgithub/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: github/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('androidpatibility: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.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.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/androidpatibility/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+: github/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:

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

  • You can run test only for debug variant
  • 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 'github/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工作室

    本文发布于:2023-10-31 04:12:25,感谢您对本站的认可!
    本文链接:https://www.elefans.com/category/jswz/34/1544965.html
    版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
    本文标签:单元测试   工作室   Android

    发布评论

    评论列表 (有 0 条评论)
    草根站长

    >www.elefans.com

    编程频道|电子爱好者 - 技术资讯及电子产品介绍!