在Android Gradle中,对于testCompile和androidTestCompile的使用感到困惑。

87
我对测试领域和Android测试领域都很陌生。在研究有助于进行Android测试的Robolectric时,有一件事最令我困惑。有时候在网上看到人们在Gradle构建脚本的依赖中使用testCompile关键词来引用Robolectric,而其他人则使用androidTestCompile。这两个关键词都是有效的吗?有人能解释一下它们之间的区别以及在使用Robolectric时应该使用哪一个关键词吗?
4个回答

120

testCompile是配置单元测试(位于src/test)的内容,而androidTestCompile则用于测试api(位于src/androidTest)。由于您的意图是编写单元测试,因此应该使用testCompile

更新:两者之间的主要区别在于test源集运行在常规Java JVM上,而androidTest源集测试在Android设备(或模拟器)上运行。


3
命名规则有些奇怪。基本上,如果你正在编写单元测试(不会在设备上运行的测试),那么它们应该存在于"src/test"目录中,因此它们的依赖关系属于testCompile配置。添加到androidTestCompile配置中的依赖项只对位于"src/androidTest"目录下的源代码可用,实际上这些代码会被构建成一个APK并部署到设备上。 - Mark Vieira
感谢您指引我方向。虽然它没有回答我所有的问题,但它在我的研究中帮了我很多。只是为了澄清您所说的,单元测试不仅限于测试文件夹中的测试(默认情况下)。有时候Google会将androidTest中的测试也称为单元测试,具体取决于特定测试的目的,但这仍然会增加混淆。 - Lucas
1
这主要是语义问题,所以不必纠结于此。使用Roboelectric编写的许多测试可以说是集成测试,而不是单元测试。话虽如此,两者之间的主要区别在于'src/test'在标准JVM上运行于开发人员的机器上,而'src/androidTest'则打包在APK中并在实际设备(或模拟器)上运行。 - Mark Vieira
非常感谢。是的,一个在JVM上运行,另一个在模拟器或设备上运行是实际的区别。顺便问一下,当Google发布AS 1.1.0时添加了"experimental junit",你能告诉我有什么变化吗?我问这个问题是因为即使在那之前,也有"test"配置和"androidTest"配置,你可以向两者都添加依赖项,gradle构建任务既可以用于集成测试,也可以用于单元测试(compileDebugTestJava),你可以使用"test"任务运行它们。您能解释一下引入实验性单元测试后在这方面真正发生了什么变化吗? - Lucas
1
我认为你之前看到的对'src/test'的支持只是通过标准Gradle Java插件提供的。因此,没有对构建风格或类型提供支持。现在,Android插件完全支持单元测试,包括每个变体的单元测试源集。 - Mark Vieira
显示剩余3条评论

3
回答您的问题 - 在Robolectric中使用testCompile。
为什么呢?因为Robolectric在JVM上运行并模拟所有Android设备的行为。
testCompile和androidTestCompile是“按照惯例”使用的Android文件夹,Gradle在运行由Android插件提供的任务时使用这些文件夹。
androidTestDebug从androidTest文件夹中选择测试,testDebug从test文件夹中选择测试。
同样,这些只是按照惯例的文件夹,您可以为这些配置提供源设置。
注意:Espresso是一个非常棒的库,请尝试远离Robolectric :)

1

//单元测试

testCompile 'junit:junit:4.12'

上述代码是Android Studio中build.gradle文件中JUnit 4的依赖项。你可以看到它有testCompile,因为JUnit在JVM上运行,不需要设备或模拟器来运行。这也意味着JUnit测试不需要应用程序上下文来运行,如果需要,我们需要“MOCK”它们。
//仪器化单元测试
androidTestCompile('com.android.support.test:runner:0.5', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

现在我们在这里看到androidTestCompile,因为这次我们打算使用设备或模拟器进行测试,也就是仪器测试。为了更好地阐明,我建议从developer.android.com上阅读。

0

为JVM测试或单元测试添加依赖项(这些测试仅依赖于Java环境,我们不需要任何Android环境)。

我们使用testCompile指令。例如:

dependencies {
    testCompile gradleTestKit()
}

为了为仪器测试添加依赖项(这些测试主要依赖于Android环境),我们使用androidTestCompile指令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接