【问题标题】:Want to run a custom gradle task only when running Unit test只想在运行单元测试时运行自定义 gradle 任务
【发布时间】:2015-12-02 14:44:32
【问题描述】:

如何设置 gradle 以仅在运行单元测试时运行特定的自定义复制任务?

编辑

我想在按下 build 时运行这些任务,i。 e 仅在包含单元测试执行的构建风格中。

【问题讨论】:

    标签: android android-studio gradle


    【解决方案1】:

    我终于找到了解决方案,在this documentation 的帮助下,它以非常简洁的方式呈现了在buildtestrelease 等期间运行的所有任务。因此,通过使任务cleanpreBuild 依赖于我的copyTask,我可以确保每次清理或构建项目时都会运行复制任务。

    但由于我不想在构建或清理过程中运行它,而是想在只运行测试时运行它,我确定了一个编译发布单元测试源的任务,称为 compileReleaseUnitTestSources,但只是在构建中提到它.gradle 为

    compileReleaseUnitTestSources.dependsOn(myCopyTask)
    

    实际上并没有工作,因为 gradle 会给出一个错误,说它找不到任务compileReleaseUnitTestSources,因为由于某种原因该任务还不可用。相反,通过将其包含在 afterEvaluate 块中,我们可以确保在评估所有任务之后执行该块,这样我们现在就可以访问该任务,所以最后我将它添加到我的 build.gradle

    afterEvaluate {
        compileReleaseUnitTestSources.dependsOn(copyResDirectoryToClasses)
    }
    

    这里的所有答案都提到使用 dependsOn 关键字将我的任务附加到在一般构建/测试执行期间运行的另一个任务,但没有一个提到如何解决 gradle 无法找到的问题即使您确定这些任务在构建/测试执行期间可用并运行。

    【讨论】:

      【解决方案2】:

      你必须设置一个“customCopyTask”并使执行单元测试的“test-task”依赖于这样的“customCopyTask”

      task customCopyTask(type: Copy) {
          from sourceSets.test.resources
          into sourceSets.test.output.classesDir
      }
      test.dependsOn customCopyTask
      

      【讨论】:

      • 我了解单独设置单元测试任务,当我运行该任务时,让它依赖于我的复制任务我想要做的是在我在 android studio 中执行单元测试时运行复制任务右键单击单元测试并选择运行测试
      • 正确。依赖手段之前必须执行过。例如:“运行”取决于“编译”。 “编译”必须在“运行”执行之前执行
      • 是的,我知道当我在 android studio 中运行 build 时如何确保这个测试任务执行?
      • 这里 test 不可用,您需要将其包含在 afterEvaluate 块中才能运行该语句 test.dependsOn
      【解决方案3】:

      您可以让某个任务完成另一个任务,在这种情况下,该任务只有在另一个任务被调用时才会运行,就在它之后。这可以这样做:

      task runUnitTest << {
          println 'running tests'
      }
      
      task copyTestResults << {
          println 'copying results'
      }
      
      //make copyTestResults finalize runUnitTest
      runUnitTest.finalizedBy copyTestResults
      

      您可以在官方user guide阅读。

      此外,如果您的单元测试可能是最新的并且您不想在这种情况下运行复制任务,您可以检查测试任务状态并跳过复制任务,如下所示:

      task copyTestResults {
          doFirst {
              //chtck anothe task status and skip this one if it didn't actually work
              if (!tasks.getByName("runUnitTest").getState().didWork) {
                  throw new StopExecutionException();
              }
          }
          doLast{
              println 'copying results'
          }
      }
      

      或者,如果您只需要在单元测试之前运行 copy-task,则通过将其设置为 dependsOn 属性来使测试任务依赖于 copy-task,并通过一些示例 here 了解它

      【讨论】:

      • 当我右键单击我的单元测试方法并单击运行单元测试时,这样做会自动执行任务吗?
      • @Bhargav 如果您将其应用于运行测试并使用 gradle 运行它们的任务,当确定时
      • 点击运行单元测试时如何查看运行了哪些任务?
      • @Bhargav 你试过查看日志吗?如果测试由 Gradle 运行,则记录项目和任务名称
      • 是的,对不起,我看了看,我看到这个任务 prepareDebugUnitTestDependencies 正在运行,但是当我将这一行 prepareDebugUnitTestDependencies.dependsOn(copyResDirectoryToClasses) 放入 build.gradle(module:app) 时,我收到了这个错误 Could not find property 'prepareDebugUnitTestDependencies' on project ':app'.
      猜你喜欢
      • 2019-11-08
      • 1970-01-01
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      • 2023-02-14
      • 2015-12-30
      • 1970-01-01
      • 2014-07-11
      相关资源
      最近更新 更多