在离线模式下使用 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 的任何片状行为。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值