2017-04-21 26 views
6

我使用gradle 3.5構建系統,並在Java項目中執行了多個單元測試和集成測試。當我在源文件(sourceSets)中進行更改時,gradle的編譯避免和漸進式編譯確保只編譯相關的源文件,這是一個巨大的倍頻程序。但是,全部測試針對sourceSet中進行的每個更改運行。 Gradle能否識別並運行單元測試的相關子集而不是全部?如果沒有,有沒有辦法做到這一點?當使用Gradle更改源文件時運行單元測試的子集

回答

0

是的,Gradle可以做到這一點,但AFAIK並非開箱即用。

如果任務實現爲Incremental Task,則Gradle任務可以確定哪些文件已更改。 Gradle中的測試任務不是增量式的。幸運的是這很容易通過擴展它把它變成一個:

class TestWatcher extends Test { 

    @TaskAction 
    void executeTests(IncrementalTaskInputs inputs) { 
     if (inputs.incremental) { 
      def outputDir = this.project.sourceSets['test'].output.classesDir.absolutePath 
      this.filter.includePatterns = [] 
      inputs.outOfDate { InputFileDetails change -> 
       def candidate = change.file.absolutePath 
       if (candidate.endsWith('.class')) { 
        candidate = candidate 
          .replace('.class', '') 
          .replace(outputDir, '') 
          .substring(1) 
          .replace(File.separator, '.') 
        this.filter.includePatterns += candidate 
       } 
      } 
     } 
     super.executeTests() 
    } 
} 

這個任務是增加(主要方法將IncrementalTaskInputs作爲其參數)。如果輸入不是增量式的,它只是運行原始任務。如果輸入是增量式的,它會遍歷所做的更改並設置includePatterns以包含所有類。然後這將只運行已更改的測試。

您可以在build.gradle使用此任務:

task testWatcher(type: TestWatcher) { 
} 

它接受所有的默認測試任務的配置。您可以將任務代碼直接放在腳本或buildSrc文件夾下。

欲瞭解更多信息,你可以看到this article我寫道。它顯示瞭如何在持續構建支持時使用它,以便在代碼更改時只重新運行更改後的測試。文章中的代碼可以在GitHub repo中找到,您可以在其中找到上面的代碼以及一個獨立的示例。

+0

另請參見我在論壇上的這個問題。如果沒有答覆,可以開始工作... https://discuss.gradle.org/t/incremental-testing-support/24785 –

相關問題