在离线模式下使用 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 插件

PDF文件阅读问题仅在离线模式下快速

在 Jupyter 中使用 plotly 在离线模式下创建动画图表

如何在离线模式下从 Apple Watch 导入使用 HealthKit 的步骤?