Android单元测试环境搭建采坑记录

添加依赖
android {

    defaultConfig {
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
}

    dependencies {
    // App's dependencies, including test
    implementation 'com.android.support:support-annotations:27.1.1'

    // Testing-only dependencies
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
踩坑

以为环境配置好了,可以直接写测试用例run了是吧,此时无论你是什么问题,最终都是告诉你/app/build/outputs/apk/androidTest/app-debug-AndroidTest.apk does not exist on disk.或者你人品好,真的就没问题,当然大部分人应该是没问题的。但是本宝傻眼中,然后开始一步步采坑。

引入环境依赖后,可先使用./gradlew connecteAndroidTest命令检查测试环境。然后可使用./gradlew assembleDebug./gradlew assembleDebugAndroidTest生成test包,在这一过程中会报错具体原因,而不是只显示apk does not exist on disk.

引入测试框架之后造成65536问题
  1. $ ':transformDexArchiveWithExternalLibsDexMergerForDebug'
  2. $ ava.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex"
  3. $ com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536

以上问题,统统都是合并dex最大方法数的问题。

所以只需要配置multiDex的解决方案就好了。如果项目中引入了子Modul,记得需要在每个子module里面配置multiDex。

至此,你可能assembleDebug没有问题,但依旧无法找到apk,然后开始google。

Gradle-aware Make
Gradle-aware Make.png

实际上,这个默认配置是存在Gradle-aware Make的,是没有问题的。哪怕你按照他所说再加一个空白的Gradle-aware Make,也是不起作用的。他描述的这一问题其实在官方文档中时有关JUnit测试可能会编译两次的解决方案。


官方文档.png
Android Studio版本缓存问题
Android Studio版本.png

我依照这个指导,删除了我之前版本3.0的一些遗留缓存文件,不过当时的我的问题并不是主要在这里,所以并不知道实际有没有影响。

采用Gradle projects的build
Gradle projects的build.png

采用此方法,并且可以尝试点击assembleAndroidTest、assembleDebug、assembleDebugAndroidTest、installDebug、installDebugAndroidTest等按钮来编译生成apk,或许有用。

我的问题所在

其实bb了这么多,这些并不是我真正的问题所在。
因为我现在所搞的是一个年久依旧在修的项目,里面有无数前辈的耕耘,所以最终在build.geadle文件中发现一段这样的代码:


build.geadle.png

它会使用gralde编译的任务名字,如果包含这些字,这个任务就不可用,则不会继续执行,则不会生成apk了。可怕,最后居然是这样,是我没仔细看这个文件,否则也不会踩前面那么多坑了。

test依赖库和androidsupport库版本问题

库内部有引用support-annotations,如果你已自己引入此库,如果版本一致,会报多个asm-license.txt文件问题,此时只需在删除这个文件即可。


如果不一致,可在test依赖中剃除annotations库即可。


关于stackoverflow上的其他回答

禁用instant run:这主要是由于你使用了jack编译器。并且jack编译器现在已不推荐。对于未使用jack编译器的项目,instant run对此并不影响。

官方文档

invalidating the caches and restarting:很多时候,这个很有用,但是我是gradle有问题,因此并不知晓针对此问题是否可行。

一加手机的问题

至此,环境都已ok,可以开始正常运行单测了。但是在一加手机上,run起来,没有成功没有失败,一直是在过程当中,无法正常运行。目前此情况在一加3T手机上出现,小米三星暂未出现,原因不明,知道了再补吧。

参考文档

The APK file does not exist on disk
Espresso not finding test apk
Android Test release notes
Google文档---已知问题
Test apps on Android

你可能感兴趣的:(Android单元测试环境搭建采坑记录)