ConnectedAndroidTest执行的任务列表是什么?

ap1*_*234 9 android android-testing

我想更多地了解ConnectedAndroidTest Gradle任务.我看到它用于安装应用程序和测试apks并运行测试.

但它的个别步骤是什么?(如果有任务,则为gradle任务)

"gradle build"似乎生成了Application apk.什么任务生成测试apk?它是如何(ConnectedAndroidTest)安装应用程序和测试apk?它是如何开始测试的?

非常感谢.

Dea*_*ean 19

我的第一个答案,请温柔;)

但它的个别步骤是什么?(如果有任务,则为gradle任务)

因此,如果您想要了解ConnectedAndroidTest所依赖的任务的高级概述,那么只运行./gradlew connectedAndroidTest或./gradlew cAT(没有-q选项)将输出在cAT执行之前依赖的每个任务的名称.任务本身不能在其中包含其他任务,但可以依赖于之前的其他任务.

从这个答案来看,gradle build任务实际上是java相关的东西,而不是负责构建测试apk的东西.相反,它是在assembleAndroidTest此之前完成的任务connectedAndroidTest.你是对的connectedAndroidTest,它实际上安装并运行测试apk.但我会稍微谈谈.我的其余部分详细介绍了有效使用任务所需的详细信息,但如果您想了解其工作原理,则非常有用.

一些背景
与许多其他Android gradle插件任务一样,connectedAndroidTest实际上在执行阶段的某个时刻放在一起,因为不同的构建变体(调试,发布,风味1,风味2等).因此connectedAndroidTest,在配置阶段(大多数构建脚本逻辑执行时)都无法使用.相反,一旦它的建成,它被设置为connectedInstrumentTest 属性的的(基本上,一个字段)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"       
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后运行 ./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插件工具文档.