調査 #116
未完了GradleでJUnit5テストをローカルマシンで実施する
50%
説明
調査目的¶
非インターネット接続環境で開発作業をするべく、JUnitライブラリをローカルマシン上に配置し、それを利用してJUnit5のテストを実行する方法を明らかにする。
前提条件¶
- 非インターネット接続の状況で新規にGradleプロジェクトを作成し、新たなJavaプログラムの開発を開始および継続できる。
- JPMSモジュール対応は対象外とする
調査結果¶
本調査では次を明らかにした。
- JUnit5ライブラリ(JARファイル)の選択、入手と配置
- ローカルマシン上に配置したJUnit5ライブラリを使用するGradleビルド定義の記述方法
- テストの実行
JUnit5ライブラリの選択と配置¶
JUnit 5は、ライブラリ(JARファイル)が細切れになっている。アプリケーションから利用するライブラリならよいが、副次的なテストライブラリでそれは全く嬉しくない。
ローカルマシンに配置するJARファイルは少ない方が作業・管理の手間が削減されるので、1つのJARファイルで賄える junit-platform-console-standalone
を選択する。
mavenリポジトリにある次のURLからバージョン番号ディレクトリを辿って所望のJARファイルを入手する。
https://repo1.maven.org/maven2/org/junit/platform/junit-platform-console-standalone/
入手したJARファイルをローカルマシンに配置する。場所は任意だが
Windowsマシンなら、C:\Program Files\Java\junit5
ディレクトリを設けてその下に、
Linuxマシンなら、/usr/local/share/java/junit5
ディレクトリを設けてその下に入れるのが一案である。
ビルド定義の記述¶
- build.gradle にローカルマシン上の指定のディレクトリをリポジトリとする定義を記述する。flatDirでパスを指定する。パスはマシンにより異なるのでbuild.gradleにはパスを直接記述せず、Gradleプロパティ名を記述する。
repositories { flatDir { dirs "${property('library.junit5.dir')}" } }
- プロパティ名にピリオドを含まない場合は、
dirs "${junit5}"
と記述できる。ピリオドが含まれると、dirs "${library.junit5}"
は library変数のjunit5メソッド呼び出しと解釈されるので意図した通りに動かない。
- プロパティ名にピリオドを含まない場合は、
- build.gradle にJUnit 5のjunit-platform-console-standalone への依存を記述する。
dependencies { testImplementation 'org.junit.platform:junit-platform-console-standalone:1.6.2' }
- build.gradle に、JUnit 5を使う際の必須定義を記述
test { useJUnitPlatform() }
- ユーザーホームのgradle.propertiesにGradleプロパティ定義を記述
Windowsの場合は、C:\Users\<ユーザー>\.gradle\gradle.properties
Linuxの場合は、/home/<ユーザー>/.gradle/gradle.propertieslibrary.junit5.dir = C:/Program Files/Java/junit5
テスト実行¶
gradle build で一連のタスクの中でユニットテストが実行される。
テスト結果はbuild\reports\tests\test\index.html に出力される。
完了条件¶
調査結果を本説明欄に明記し、Wikiからリンクで本チケットを辿れるようにする。
高橋 徹 さんが4年以上前に更新
JUnit5をテストに使うGradleビルド定義のデフォルト( gradle init
で生成されるもの)は次の様に記述される。
repositories {
jcenter()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.0'
}
test {
useJUnitPlatform()
}
gradle test
を実行すると、gradleキャッシュに次のJUnit関係ライブラリファイルをダウンロードし実行する。
apiguardian-api-1.1.0.jar junit-jupiter-api-5.6.0.jar junit-jupiter-engine-5.6.0.jar junit-platform-commons-1.6.0.jar junit-platform-engine-1.6.0.jar opentest4j-1.2.0.jar
テストは正常に実行された。
高橋 徹 さんが4年以上前に更新
- ステータス を 新規 から 進行中 に変更
- 進捗率 を 0 から 50 に変更
次に、リポジトリをローカルマシン上に設け、そこに必要なjarファイルを配置して実行する。
C:\Program Files\Java\junit5\
の中にjarファイルをコピー- build.gradle の記述を修正
repositories { - jcenter() + flatDir { + dirs "C:/Program Files/Java/junit5" + } }
この設定で、Gradleはdependenciesに記述したライブラリをインターネット上のリポジトリではなく、ローカルマシン上の指定したディレクトリから取得する。
テストを実行すると、次の結果となった。
> Task :compileTestJava 警告:不明な列挙型定数ですStatus.STABLE 理由: org.apiguardian.api.API$Statusのクラス・ファイルが見つかりません 警告:不明な列挙型定数ですStatus.STABLE 警告:不明な列挙型定数ですStatus.STABLE 警告:不明な列挙型定数ですStatus.STABLE 警告:不明な列挙型定数ですStatus.STABLE 警告:不明な列挙型定数ですStatus.STABLE : 警告100個 合計120個のうち、最初の100個の警告のみ表示しています。さらに表示する場合は、-Xmaxwarnsを使用してください > Task :test FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':test'. > There were failing tests. See the report at: file:///D:/work/HelloApp/build/reports/tests/test/index.html * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 2s 3 actionable tasks: 3 executed
- まずテストのコンパイルで警告が多数発生した。
- テストの実行でエラーが発生した。
テスト結果のレポートファイルを見ると次の例外が発生Caused by: java.lang.ClassNotFoundException: org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine
高橋 徹 さんが4年以上前に更新
テストの実行で ClassNotFoundException(HierarchicalTestEngine)エラーの対処(その1)¶
flatDir で指定したパスにJARファイルを置く場合、依存関係の自動解決はしないので、使用するライブラリをすべてdependenciesに列挙しなくてはならない。
- build.gradleの修正
dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.2' testCompileOnly 'org.apiguardian:apiguardian-api:1.1.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.2' + testRuntimeOnly 'org.junit.platform:junit-platform-engine:1.6.2' + testRuntimeOnly 'org.junit.platform:junit-platform-commons:1.6.2' + testRuntimeOnly 'org.opentest4j:opentest4j:1.2.0' }
テストの実行で ClassNotFoundException(HierarchicalTestEngine)エラーの対処(その2)¶
JUnit5の各ライブラリを1つにまとめたライブラリ junit-platform-console-standalone
が提供されている。
使用するライブラリをこれ1つにすればよい。
- build.gradleの修正
dependencies { - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.2' - testCompileOnly 'org.apiguardian:apiguardian-api:1.1.0' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.2' + testImplementation 'org.junit.platform:junit-platform-console-standalone:1.6.2' }
高橋 徹 さんが4年以上前に更新
開発マシンのローカルにJUnit5を配置し、Gradleでユニットテストを実行¶
JUnit5 の配置は、依存関係の記述をシンプルにしたく、JARファイル1つだけ指定すればよいjunit-platform-console-standaloneを使用する。mavenリポジトリの ここから バージョン番号のディレクトリを辿ってJARファイルを入手。
開発マシン(Windows)では、次のフォルダにJARファイルを配置する。
C:\Program Files\Java\junit5\lib\
build.gradle の記述から開発マシン固有の設定を排除するため、gradle プロパティを使う。build.gradle にはプロパティ名を記述、プロパティ名と値(ここでは上述のJARファイル配置パス情報)は開発マシンのユーザーホームディレクトリ下の.gradle/gradle.propertiesに記述する。
- C:\Users\<ユーザー>\.gradle\gradle.properties
library.junit5.dir = C:/Program Files/Java/junit5/lib
- build.gradleの記述(リポジトリ定義と依存関係定義箇所)
repositories { flatDir { dirs "${property('library.junit5.dir')}" } } dependencies { testImplementation 'org.junit.platform:junit-platform-console-standalone:1.6.2' }
プロパティ名の途中にピリオドを使うと、build.gradleの中でプロパティを指定する際、通常の${library.junit5.dir}
とすると文字列ではなくメソッド呼び出し式と解釈され意図した通りには展開されない。そこで、上述のflatDirの記述ではpropertyメソッドを明示的に呼びプロパティ名を文字列として渡す。
JUnitを使うときは、gradleのビルド定義に次も記述
test {
useJUnitPlatform()
}
あとは、gradle test などのタスクを実行する。