在离线模式下使用 Robolectric(Gradle 并行执行的修复)
Posted 小陈乱敲代码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在离线模式下使用 Robolectric(Gradle 并行执行的修复)相关的知识,希望对你有一定的参考价值。
最近,我们在我们的 android 项目上启用了并行执行。随着构建时间的良好性能提升,我们的 Robolectric 测试出现了一些问题。我们注意到大约 20%(完全是轶事)的时间,我们的测试会因 NoClassDefFound 或 NoSuchFieldError 错误而失败。
在 Robolectric Github 页面上搜索此问题会发现其他人也遇到了类似的问题。
处理此问题的推荐方法之一是在离线模式下使用 Robolectric,并提前手动下载依赖项或让 Gradle 在配置时下载它们。
在编写 Robolectric 4.8.1 版本时,这是我们在配置时下载依赖项的方法。
在一个文件中,我们将调用“robolectric.gradle”,我们可以添加以下代码:
configurations
robo16Instrumented
robo21
robo21Instrumented
robo28Instrumented
robo29Instrumented
robo31
robo31Instrumented
robo32Instrumented
dependencies
robo16Instrumented "org.robolectric:android-all-instrumented:4.1.2_r1-robolectric-r1-i4"
robo21 "org.robolectric:android-all:5.0.2_r3-robolectric-r0"
robo21Instrumented "org.robolectric:android-all-instrumented:5.0.2_r3-robolectric-r0-i4"
robo28Instrumented "org.robolectric:android-all-instrumented:9-robolectric-4913185-2-i4"
robo29Instrumented "org.robolectric:android-all-instrumented:10-robolectric-5803371-i4"
robo31 "org.robolectric:android-all:12-robolectric-7732740"
robo31Instrumented "org.robolectric:android-all-instrumented:12-robolectric-7732740-i4"
robo32Instrumented "org.robolectric:android-all-instrumented:12.1-robolectric-8229987-i4"
def robolectricDependencies = "$rootProject.buildDir.path/robolectric"
task fetchRobolectricDependencies(type: Copy)
from configurations.robo16Instrumented
from configurations.robo21
from configurations.robo21Instrumented
from configurations.robo28Instrumented
from configurations.robo29Instrumented
from configurations.robo31
from configurations.robo31Instrumented
from configurations.robo32Instrumented
into robolectricDependencies
subprojects
afterEvaluate
if (project.plugins.hasPlugin("com.android.application") || project.plugins.hasPlugin("com.android.library"))
android
testOptions.unitTests.all
systemProperty 'robolectric.offline', 'true'
systemProperty 'robolectric.dependency.dir', robolectricDependencies
tasks.withType(Test)
it.dependsOn fetchRobolectricDependencies
我们将build.gradle通过
apply from: "$project.rootDir/gradle/robolectric.gradle"
这个 Gradle 片段为我们做的是将robolectric.offline属性以及robolectric.dependency.dir指向下载依赖项的属性添加到具有应用程序或库插件(我们的主应用程序模块和它依赖的后续库模块)的任何项目。
在离线模式下运行时,Robolectric 所需的确切依赖项可能因您而异。Robolectric 所需的缺失 jar 通常会在测试失败中出现,如下所示:
java.lang.IllegalArgumentException: Path is not a file: /<build_dir>/robolectric/android-all-instrumented-12-robolectric-7732740-i4.jar
jar 是您应该需要的依赖项robolectric.gradle
使用上面的 Gradle 脚本,我们成功地添加org.gradle.parallel=true了 Robolectric 的任何片状行为。
以上是关于在离线模式下使用 Robolectric(Gradle 并行执行的修复)的主要内容,如果未能解决你的问题,请参考以下文章
如何在离线模式下使用 WorldWind Android 应用程序
如何在离线模式下使用 Cordova Geolocation 插件