mike-neckのブログ

JavaかJavaFXかJavaEE(なんかJava8が多め)

Gradle2.11の新機能を試してみた(1)

Gradle2.11でJavaソフトウェアモデルに対してJUnitによるテストがサポートされたので試してみました。

基本

ディレクトリー構成は以下のとおりです。

root
 └─src
    ├─data
    │  └─java
    ├─data.test
    │  └─java
    ├─exceptions
    │  └─java
    └─functions
       └─java

使用するJavaのバージョンはJava8、JUnitのバージョンは4.12です。また、各ライブラリーは次のような機能を提供しています。

  • exceptions - 例外クラスを提供。
  • functions - 関数型インターフェースを提供。exceptionsライブラリーに依存。
  • data - データ型を提供。functionsライブラリーに依存。
  • data.test - dataライブラリーのテスト。

このようなJavaソフトウェアモデルのビルドファイルは次のようになります。

plugins {
  id 'jvm-component'
  id 'java-lang'
  //JavaソフトウェアモデルにてJUnitを利用するためのプラグイン
  id 'junit-test-suite'
}
repositories {
  jcenter()
}
model {
  testSuites {
    //data.test ディレクトリーにテストを配置するためにシングルクォートで囲む
    'data.test'(JUnitTestSuiteSpec) {
    //JUnitのバージョン指定
      jUnitVersion '4.12'
      //テスト対象のライブラリーを指定
      testing $.components.data
    }
  }
  components {
    exceptions(JvmLibrarySpec) {
      targetPlatform 'java8'
    }
    functions(JvmLibrarySpec) {
      targetPlatform 'java8'
      api {
        exports 'com.sample.func.api'
        dependencies {
          library 'exceptions'
        }
      }
    }
    data(JvmLibrarySpec) {
      targetPlatform 'java8'
      api {
        exports 'com.sample.data.api'
        dependencies {
          library 'functions'
        }
      }
    }
  }
}

tasksタスクを実行してタスクの一覧を見てみます。

$ gradle tasks
…前略…
Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
clean - Deletes the build directory.
data.testDataJarBinary - Assembles Test suite 'data.test:dataJarBinary'.
dataJar - Assembles Jar 'data:jar'.
exceptionsJar - Assembles Jar 'exceptions:jar'.
functionsJar - Assembles Jar 'functions:jar'.
…中略…
Verification tasks
------------------
check - Runs all checks.
data.testDataJarBinaryTest - Runs test suite 'data.test:dataJarBinary'.
…以下略…

data.testDataJarBinaryというタスクがテストのコンパイルで、data.testDataJarBinaryTestというタスクがテストタスクです。

ではdata.testDataJarBinaryTestタスクを実行してみます。

$ gradle data.testDataJarBinaryTest
:compileExceptionsJarExceptionsJava
:exceptionsApiJar
:compileFunctionsJarFunctionsJava
:functionsApiJar
:compileDataJarDataJava
:compileData.testDataJarBinaryData.testJava
:createExceptionsJar
:createFunctionsJar
:data.testDataJarBinaryTest

BUILD SUCCESSFUL

Total time: 13.984 secs

テストのレポートはbuild/reports/data.test/dataJar/testsディレクトリーに出力されます。なお、レポートの内容はGradleでお馴染みのものです。また、JUnitxmlファイルはbuild/test-results/data.test/dataJarディレクトリーの下に出力されます。

f:id:mike_neck:20160221205738p:plain

テスト対象のdataライブラリーはjarファイルが作成されていませんし、data.testの方もjarファイルは作成されません。

JenkinsでGradleを利用する場合は大抵buildタスクを実行すると思いますので、buildもやってみましょう。

$ gradle clean build
:clean
:compileExceptionsJarExceptionsJava
:exceptionsApiJar
:compileFunctionsJarFunctionsJava
:functionsApiJar
:compileDataJarDataJava
:createDataJar
:dataApiJar
:dataJar
:createExceptionsJar
:exceptionsJar
:createFunctionsJar
:functionsJar
:assemble
:compileData.testDataJarBinaryData.testJava
:data.testDataJarBinaryTest
:check
:build

BUILD SUCCESSFUL

Total time: 5.025 secs

buildタスクでdata.testDataJarBinaryTestタスクが実行されているのがわかります。

応用

応用というほどではありませんが、今回はdataライブラリーに対してテストを実行しましたが、次のようにビルドファイルを用意して、src/funcsionsTests/java以下のディレクトリーにテストを記述することで、functionsライブラリーに対するテストも行えるようになります。

model {
  testSuites {
    'data.test'(JUnitTestSuiteSpec) {
      jUnitVersion '4.12'
      testing $.components.data
    }
    functionsTests(JUnitTestSuiteSpec) {
      jUnitVersion '4.12'
      testing $.components.functions
    }
  }
  //以下略
}

結論

まあ、現状のJavaプロジェクトで問題ないわけだし、JavaソフトウェアモデルにしなくてもJUnitだけでなく、TestNGも使えるし、webプロジェクトはJavaソフトウェアモデルでは作れないし、現状のjavaプラグインでいいんじゃね?という話でした。

Gradle2.11を試すシリーズ、次回はないと思います。