【问题标题】:What are list of tasks that ConnectedAndroidTest executes?ConnectedAndroidTest 执行的任务列表是什么?
【发布时间】:2015-07-30 00:50:52
【问题描述】:

我想了解有关 ConnectedAndroidTest Gradle 任务的更多信息。我看到它用于安装应用程序和测试 apk 并运行测试。

但它的具体步骤是什么? (如果有的话,gradle 任务)

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

非常感谢。

【问题讨论】:

    标签: android android-testing


    【解决方案1】:

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

    但它的具体步骤是什么? (如果有的话,gradle 任务)

    因此,如果您想大致了解 tasks ConnectedAndroidTest 所依赖的内容,只需运行 ./gradlew connectedAndroidTest./gradlew cAT(不带 -q 选项)将输出每个任务的名称cAT 在它本身被执行之前依赖于它。任务本身不能有其他任务,但可以依赖于它之前的其他任务。

    来自this 的回答,gradle build 任务实际上与 java 相关,而不是负责构建测试 apk。相反,它是在 connectedAndroidTest 之前执行的 assembleAndroidTest 任务。您对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 部分来自哪里,但是谷歌搜索类名的其余部分为我们提供了任务基类的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 工具文档。

    【讨论】:

    • connectedAndroidTest 是否实际运行 buildcompile
    • @IgorGanapolsky, connectedAndroidTest` 直接依赖于assembleDebug(组装调试APK)和assembleDebugAndroidTest(组装测试APK)。这两个任务编译了一切。还有installDebuginstallDebugAndroidTest 任务,但我不清楚它们在依赖树上的确切位置。它们必须发生在 assemble* 任务之后,并且在测试实际运行之前(当然),但我不确定确切的位置。
    • 为什么 ./gradlew connectedDebugAndroidTest 完成后会卸载我的应用程序?这快把我逼疯了!
    • 我也是@Phlip - 你明白了吗?它打破了我的测试运行!
    • 我使用原始的 gradlew 命令进行测试,无需卸载。它们运行起来很痛苦,因为它们在 adb 中暴露了比通常数量更多的错误,但我在这里写了它们:stackoverflow.com/questions/57433975/…
    【解决方案2】:

    要回答更一般的问题“任务<taskName> 执行的任务列表是什么?”,对于任何给定任务,有两种简单的方法可以找出答案。

    第一个是:

    ./gradlew tasks --all | grep <taskName> 
    

    &lt;taskName&gt; 应该替换为您关心的任何任务。例如,./gradlew tasks --all | grep connectedDebugAndroidTest。请注意,我正在通过grep 进行管道传输,以省去手动筛选所有任务列表的麻烦。

    第二个是:

    使用task-tree 插件。应用后,用法如下所示:

    ./gradlew <taskName> taskTree
    

    或者,正如我通常喜欢的那样:

    ./gradlew <taskName> taskTree --no-repeat -quiet
    

    后一个选项使输出不那么混乱。

    【讨论】:

      猜你喜欢
      • 2018-05-19
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      相关资源
      最近更新 更多