我想了解更多关于ConnectedAndroidTest Gradle任务。我看到它是用来安装应用程序、测试apks和运行测试的。
但是它的每个步骤是什么呢?(gradle tasks如果有的话)
"gradle build"似乎生成了应用程序apk。什么任务生成测试apk?它(ConnectedAndroidTest)如何安装应用程序和测试apk?测试是怎么开始的?
我的第一个SO回答,请温柔一点;)
但是它的每个步骤是什么呢?(gradle tasks如果有的话)
因此,如果您想要对任务 ConnectedAndroidTest所依赖的内容进行高级概述,只需运行./gradlew connectedAndroidTest
或./gradlew cAT
(没有-q
选项)将输出cAT
依赖的每个任务的名称,然后再执行。任务本身不能包含其他任务,但可以依赖于它之前的其他任务。
从这个答案来看,gradle build
任务实际上是与java相关的,而不是负责构建测试apk的任务。相反,它是assembleAndroidTest
任务,在connectedAndroidTest
之前完成它。你对connectedAndroidTest
是对的,它实际上安装并运行测试apk。但我稍后会讲到怎么做。我的回答的其余部分是更详细的,而不是有效地使用任务,但如果你想了解它是如何工作的,这是有用的。
一些背景
像许多其他Android gradle插件任务一样,connectedAndroidTest实际上是在执行阶段的某个时候放在一起的,因为不同的构建变量(调试、发布、风味1、风味2等)。因此,在配置阶段(当执行大多数构建脚本逻辑时),connectedAndroidTest
是不可用的。相反,一旦构建完成,它就被设置为android
对象中testVariants
属性的connectedInstrumentTest
属性(基本上是一个字段)。
作为澄清的例子,如果您想访问此任务以某种方式操作它(可能在其末尾添加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
部分来自哪里,但是谷歌搜索类名称的其余部分为我们提供了任务的基类的源代码。
任务的主要Action
称为runTests()
,它或多或少地显示了任务是如何完成它所做的事情的。如果您稍微跟踪源代码,您最终会发现adb pm install
命令将用于安装apk。
虽然我找不到它,但我怀疑在其他地方使用adb命令adb shell am instrument -w com.package.name/android.support.test.runner.AndroidJUnitRunner
命令来最终驱动测试。
所以我希望这不是太令人困惑-我最近才学会这些,所以有些事情可能不是100%。我建议阅读gradle文档,特别是如何创建自定义插件和自定义任务,也可以查看Android gradle插件工具文档。
要回答更一般的问题"任务<taskName>
执行的任务列表是什么?",对于任何给定的任务,有两种简单的方法可以找到它。
第一个是:
./gradlew tasks --all | grep <taskName>
其中<taskName>
应该替换为您关心的任何任务。例如,./gradlew tasks --all | grep connectedDebugAndroidTest
。请注意,我通过grep
来省去手动筛选所有任务列表的麻烦。
第二个是:
使用任务树插件。一旦应用,用法看起来像这样:
./gradlew <taskName> taskTree
或者,像我通常喜欢的那样:
./gradlew <taskName> taskTree --no-repeat -quiet
后一个选项使输出不那么混乱。
您还可以执行./gradlew connectedAndroidTest --dry-run
,它将列出它将运行的所有任务,但不会运行任何任务。--dry-run
对任何你想分析的gradle任务做同样的事情。