最近在入门学习Android测试,感觉对于入门来说,最艰难的大概就是配置环境了,出现问题了完全没有思路,网上找了很多资料,说法各不相同,也经常不能解决问题。
对于新创建的工程,如果默认使用的gradle插件版本就在1.1.0以上,默认就可以支持单元测试,最顺利的情况下,几乎什么都不需要配置就能直接运行测试。但是不顺利的时候,各种奇怪的报错都会发生。
在我终于搞清了单元测试的各种配置后,开始尝试对已有的工程做单元测试。原有的工程用的gradle插件是1.0.0,手动将其修改成了1.1.0,gradle同步时没有报错,原有项目能正常编译。而运行测试时,测试方法并没有被执行,总是提示如下:
-
No tests were found
-
Running tests
-
Test running started
-
Test running failed: Unable to find instrumentation info for: ComponentInfo{***/android.test.InstrumentationTestRunner}
-
Empty Test Suite.
网上找了各种解决方案,但是回答基本上都是针对还没搞清单元测试基本写法和配置的情况。例如下面这些资料可供参考。
https://testerhome.com/topics/2098
http://blog.csdn.net/wsm6591289/article/details/7204524
http://www.cnblogs.com/dtest/p/4142304.html
分析了自己遇到的情况,两个工程中我所知道的所有配置都一样,gradle插件版本、Build Variants、文件夹结构、测试代码,唯一我所知道的不同点,就是一个工程创建的时候就用的1.2.3版本gradle插件,之后被我改成1.1.0,而另一个工程则是从1.0.0被改成1.1.0。
于是我怀疑插件版本除了在build.gradle中修改,对项目的其他地方也有影响。于是尝试将可以运行单元测试、项目名称结构都完全一样的新建工程中的非代码文件,包括目录下的gradlew、gradlew.bat、local.properties等,替换到不能运行单元测试的已有项目中……但是并没有什么效果,似乎有时候能运行,有时候又不行了。
研究了很长时间,尝试了很多方法,最后终于在StackOverflow的一个很不起眼的地方找到了解答。
http://stackoverflow.com/questions/16591504/android-studio-import-existing-unit-tests-unable-to-find-instrumentation-info
自己创建的工程使用的Module Build Variants是默认的debug,而已有的项目选择的是gradle中配置的*Develop,从而导致不能运行。
之后进行对比可以发现,如果使用的不是Debug,而是例如Release,Android Studio右下角显示的Task只有一个assembleRelease
如果使用Debug,就会显示assembleDebug和assembleDebugAndroidTest两项。
在Run窗口可以看到,先后安装了两个APK,前一个是被测试的APK,后者则是Test Runner。
-
Testing started at 下午10:43 ...
-
Installing com.jzj1993.unittest
-
DEVICE SHELL COMMAND: pm install -r "/data/local/tmp/com.jzj1993.unittest"
-
pkg: /data/local/tmp/com.jzj1993.unittest
-
Success
-
Uploading file
-
local path: /Users/jzj/AndroidStudio/UnitTest/app/build/outputs/apk/app-debug-androidTest-unaligned.apk
-
remote path: /data/local/tmp/com.jzj1993.unittest.test
-
Installing com.jzj1993.unittest.test
-
DEVICE SHELL COMMAND: pm install -r "/data/local/tmp/com.jzj1993.unittest.test"
-
pkg: /data/local/tmp/com.jzj1993.unittest.test
-
Success
-
Running tests
-
Test running startedFinish