2017-04-21 7 views
6

私はgradle 3.5ビルドシステムを使用し、Javaプロジェクトに複数のユニットテストと統合テストを行います。ソースファイル(sourceSets)を変更すると、gradleのコンパイル回避とインクリメンタルコンパイルでは、関連するソースファイルのみがコンパイルされ、巨大な時間節約になります。ただし、すべてsourceSetで行われたすべての変更に対してテストが実行されます。グラデーションは、すべてではなくユニットテストの関連するサブセットのみを識別して実行できますか?そうでない場合は、これを達成する方法がありますか?Gradleを使用してソースファイルが変更されたときにユニットテストのサブセットを実行する

答えて

0

はい、Gradleはこれを実行できますが、AFAIKはそのままでは使用できません。

タスクがIncremental Taskとして実装されている場合、どのファイルが変更されたかをGradleタスクが知ることができます。 Gradleのテストタスクは増分ではありません。幸いにも、それはそれを拡張することで、1にそれを回すのは簡単です:

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() 
    } 
} 

このタスクは、増分である(mainメソッドは、引数としてIncrementalTaskInputsかかります)。入力がインクリメンタルでない場合は、単に元のタスクを実行します。入力が増分の場合、変更を繰り返し、すべてのクラスを含めるようにincludePatternsを設定します。これにより、変更されたテストのみが実行されます。

あなたのbuild.gradleでこのタスクを使用することができます。

task testWatcher(type: TestWatcher) { 
} 

これは、デフォルトのテストタスク構成のすべてを受け入れます。スクリプトまたはbuildSrcフォルダの下にタスクコードを直接配置することができます。

詳細については、this articleと書いてあります。コードを変更するたびに、変更されたテストのみを再実行するための継続ビルドサポートでこれを使用する方法を示します。記事のコードはGitHub repoにあります。ここでは、上記のコードも含まれています。

+0

フォーラムのこの私の質問も参照してください。返信がない場合は、この作業を開始できます... https://discuss.gradle.org/t/incremental-testing-support/24785 –

関連する問題