Android单元测试“Unable to find instrumentation info for: ComponentInfo{} Empty Test Suite”的解决思路

最近在入门学习Android测试,感觉对于入门来说,最艰难的大概就是配置环境了,出现问题了完全没有思路,网上找了很多资料,说法各不相同,也经常不能解决问题。

对于新创建的工程,如果默认使用的gradle插件版本就在1.1.0以上,默认就可以支持单元测试,最顺利的情况下,几乎什么都不需要配置就能直接运行测试。但是不顺利的时候,各种奇怪的报错都会发生。

在我终于搞清了单元测试的各种配置后,开始尝试对已有的工程做单元测试。原有的工程用的gradle插件是1.0.0,手动将其修改成了1.1.0,gradle同步时没有报错,原有项目能正常编译。而运行测试时,测试方法并没有被执行,总是提示如下:

  1. No tests were found

  2. Running tests

  3. Test running started

  4. Test running failed: Unable to find instrumentation info for: ComponentInfo{***/android.test.InstrumentationTestRunner}

  5. Empty Test Suite.

网上找了各种解决方案,但是回答基本上都是针对还没搞清单元测试基本写法和配置的情况。例如下面这些资料可供参考。

http://stackoverflow.com/questions/14381694/why-is-the-android-test-runner-reporting-empty-test-suite

http://mtdevuk.com/2014/10/07/solution-for-test-running-failed-unable-to-find-instrumentation-info-for-componentinfo-com-google-android-apps-common-testing-testrunner-googleinstrumentationtestrunner/

https://testerhome.com/topics/2098

http://blog.csdn.net/wsm6591289/article/details/7204524

http://stackoverflow.com/questions/16591504/android-studio-import-existing-unit-tests-unable-to-find-instrumentation-info

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。

  1. Testing started at 下午10:43 ...

  2. Installing com.jzj1993.unittest

  3. DEVICE SHELL COMMAND: pm install -r "/data/local/tmp/com.jzj1993.unittest"

  4. pkg: /data/local/tmp/com.jzj1993.unittest

  5. Success

  6. Uploading file

  7. local path: /Users/jzj/AndroidStudio/UnitTest/app/build/outputs/apk/app-debug-androidTest-unaligned.apk

  8. remote path: /data/local/tmp/com.jzj1993.unittest.test

  9. Installing com.jzj1993.unittest.test

  10. DEVICE SHELL COMMAND: pm install -r "/data/local/tmp/com.jzj1993.unittest.test"

  11. pkg: /data/local/tmp/com.jzj1993.unittest.test

  12. Success

  13. Running tests

  14. Test running startedFinish