背景
这两天把 app 中的一个模块拆分出来写了一个 library,写完后满心欢喜的写个测试用例测一下,直接右键选择 “Run testDataFileByMin” 运行测试,结果提示找不到测试用例,Run 控制台输出如下:
Testing started at 16:21 ...
08/10 16:21:54: Launching testDataFileByMin()
$ adb push /Users/panpf/Workspace/AppSample/app/build/outputs/apk/app-lollipop-debug.apk /data/local/tmp/com.sample.app
$ adb shell pm install -r "/data/local/tmp/com.sample.app"
pkg: /data/local/tmp/com.sample.app
Success
$ adb push /Users/panpf/Workspace/AppSample/app/build/outputs/apk/app-lollipop-debug-androidTest.apk /data/local/tmp/com.sample.app.test
$ adb shell pm install -r "/data/local/tmp/com.sample.app.test"
pkg: /data/local/tmp/com.sample.app.test
Success
Running tests
$ adb shell am instrument -w -r -e debug false -e class com.sample.library.stat.DataFileTest#testDataFileByMin com.sample.app.test/android.support.test.runner.AndroidJUnitRunner
Client not ready yet..
Started running tests
Tests ran to completion.
Empty test suite.
复制代码
一时间有些懵逼了,没遇到过这问题啊,咋就会找不到测试用例呢。另一个项目中也写过 library 的测试用例,能跑起来啊
怀疑一切
本着怀疑一切的精神首先怀疑是不是测试相关的配置
有问题,然后就开始了各种检查,并且照着另一个项目的配置一一比对,不一样的都改成一样的,再跑测试,结果还是找不到测试用例
然后怀疑测试相关依赖的版本
是不是有问题,因为另一个项目中用的是最新的 1.0.0 的 runner 和 rules,而当前用的是 0.5 版本的,改成 1.0.0 后再跑测试,结果依然是找不到测试用例
接下来怀疑是不是测试用例写的有问题,就把测试用例拷贝到另一个项目中,跑一下结果能找到,看来用例写的没问题
再怀疑是不是用的是 Canary 版本的 Android Studio (3.0 Canary 8)的 bug,就换回 2.3 Stable 版的 Android Studio 再跑,仍旧是找不到测试用例
柳暗花明
正当一愁莫展的时候无意间发现 Run 控制台输出的信息中显示安装的是我的 app module,注意这行:
$ adb push /Users/panpf/Workspace/AppSample/app/build/outputs/apk/app-lollipop-debug-androidTest.apk /data/local/tmp/com.sample.app.test
复制代码
感觉有些奇怪,就去另一个项目中跑一下其 library 的测试,看其 Run 控制台输出如下:
Testing started at 10:31 ...
08/11 10:31:01: Launching testReadApkIcon()
$ adb push /Users/panpf/Workspace/sketch/sketch/build/outputs/apk/sketch-debug-androidTest.apk /data/local/tmp/me.xiaopan.sketch.test
$ adb shell pm install -t -r "/data/local/tmp/me.xiaopan.sketch.test"
pkg: /data/local/tmp/me.xiaopan.sketch.test
Success
Running tests
$ adb shell am instrument -w -r -e debug false -e class me.xiaopan.sketch.androidtest.SketchUtilsTest#testReadApkIcon me.xiaopan.sketch.test/android.support.test.runner.AndroidJUnitRunner
Client not ready yet..
Started running tests
Tests ran to completion.
复制代码
sketch-debug-androidTest.apk 是 sketch module 的测试 APK,sketch module 是一个 library
一对比发现后者输出的信息中 安装的是 library 的 测试 APK ,而前者输出的信息中安装的是 app 的测试 APK
到这里问题似乎也就呼之欲出了,但为什么我在 library 中运行测试用例会跑到 app 中呢,想到这里就立马进入运行配置中找到刚刚创建的运行配置查看
一看就惊呆了,这指定的 module 怎么是 app 啊,应该是 library 才对啊,果断改为 library
再跑测试,这下终于成功了
Testing started at 10:55 ...
08/11 10:55:48: Launching testDataFileByMin()
$ adb push /Users/panpf/Workspace/AppSample/library/build/outputs/apk/library-debug-androidTest.apk /data/local/tmp/com.sample.library.test
$ adb shell pm install -t -r "/data/local/tmp/com.sample.library.test"
pkg: /data/local/tmp/com.sample.library.test
Success
Running tests
$ adb shell am instrument -w -r -e debug false -e class com.sample.library.stat.DataFileTest#testDataFileByMin com.sample.library.stat.test/android.support.test.runner.AndroidJUnitRunner
Client not ready yet..
Started running tests
Tests ran to completion.
复制代码
总结
1. 究竟是什么导致的 “Empty test suite.”
根本原因是测试用例的配置指向了 app module,而测试用例代码是在 library module 中,当然会找不到
2. 为什么在测试用例中右键选择 “Run ***” 执行测试用例默认会指向 app module
目前还没找到具体的答案,但肯定这是 Android Studio 的一个BUG
3. 为什么另一个项目中同样的方式可以运行,没有被指向 app module
这个问题尚未找到准确的答案,但 AppSample 与另一个项目的区别是 前者 app 和 library 都配置了测试,而后者只有 library module 配置了测试
我试着完全按照这样的结构写了一个demo,视图重现此问题,很遗憾无法复现。如果你也遇到了这个问题,不妨参考一下我的解决办法,也许会有用
4. 得到的经验
- 首先工具也会出错,但是出了问题还是要首先怀疑自己,证明自己各方面无误后再去视图证明是工具出错了
- 其次一定要注意查看控制台输出的信息,像 Android Sutido 这么完善的工具运行结果不管成功过还是失败都会在控制台输出相应的信息,有时候你 Google 了半天的问题,控制台早已给出了原因以及解决办法
- 最后切记勿燥,要有耐心