我想了解更多有关ConnectedAndroidTest Gradle任务的信息。我看到它用于安装应用程序和测试apks并运行测试。
但它的个别步骤是什么? (如果有任务,则为gradle任务)
“gradle build”似乎生成了Application apk。什么任务生成测试apk?它是如何(ConnectedAndroidTest)安装应用程序和测试apk?它是如何开始测试的?
非常感谢。
答案 0 :(得分:19)
我的第一个答案,请温柔;)
但它的个别步骤是什么? (如果有任务,则为gradle任务)
因此,如果您想要了解ConnectedAndroidTest所依赖的任务的高级概述,那么只需运行./gradlew connectedAndroidTest
或./gradlew cAT
(不使用-q
选项)输出cAT
在执行之前依赖的每个任务的名称。任务本身不能在其中包含其他任务,但可以依赖于其他任务。
从this回答,gradle build
任务实际上与java相关,并且不负责构建测试apk。相反,它是在assembleAndroidTest
之前发生的connectedAndroidTest
任务。你对connectedAndroidTest
是正确的,它实际上安装并运行测试apk。但我会稍微谈谈如何。我的其余部分详细介绍了有效使用任务所需的详细信息,但如果您想了解其工作原理,则非常有用。
一些背景
与许多其他Android gradle插件任务一样,connectedAndroidTest实际上在执行阶段的某个时刻放在一起,因为不同的构建变体(调试,发布,风味1,风味2等)。因此,connectedAndroidTest
在配置阶段(大多数构建脚本逻辑执行时)都无法使用connectedInstrumentTest
。相反,一旦构建完成,它就被设置为{{1}中testVariants
属性的android
属性(基本上是一个字段)对象。
作为澄清的一个示例,如果您想以某种方式访问此任务来操作它(可能在其末尾添加Action
),您可以在build.gradle
文件中执行类似的操作:
android {
testVariants.all { variant ->
variant.connectedInstrumentTest.doLast {
println "This will be executed right after our connectedInstrumentTest!"
println "The name of the test type: $connectedInstrumentTest.name"
println "The type of test $connectedInstrumentTest.class"
}
}
}
然后运行./gradlew -q cAT
所以在这里,我在任何已经构建并分配给connectedInstrumentTest
属性的任务的末尾添加一个动作,该属性嵌套在android
对象中相当深的位置。此任务可能是connectedDebugAndroidTest
或类似的东西。
任务在做什么?
现在,从我在最后一个println中输入的type属性,我们可以看到任务的类实际上是com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask_Decorated
。说实话,我还不太清楚_Decorated
部分来自哪里,但谷歌搜索其余的类名为我们提供了source code的基类。任务。
任务的主要Action
称为runTests()
,并且或多或少地向您显示任务如何完成其工作。如果你稍微遵循源代码,你最终会发现adb pm install
命令将用于安装apk。
虽然我无法找到它,但我怀疑在其他地方使用adb命令adb shell am instrument -w com.package.name/android.support.test.runner.AndroidJUnitRunner
命令来最终驱动测试。
所以我希望这不会太混乱 - 我最近学到了大部分知识,所以有些事情可能不是100%。我建议您完成gradle文档,特别是如何创建自定义插件和自定义任务,还可以查看Android gradle plug-in工具文档。
答案 1 :(得分:2)
要回答更一般的问题“任务<taskName>
执行的任务列表是什么?”,有两种简单的方法可以找出任何特定任务。
第一个是:
./gradlew tasks --all | grep <taskName>
其中<taskName>
应该替换为您关心的任何任务。例如,./gradlew tasks --all | grep connectedDebugAndroidTest
。请注意,我正在通过grep
进行管道工作,以避免手动筛选所有任务列表的麻烦。
第二个是:
使用task-tree插件。使用后,使用情况如下:
./gradlew <taskName> taskTree
或者,正如我通常喜欢的那样:
./gradlew <taskName> taskTree --no-repeat -quiet
后一种选择使输出更加混乱。