プロジェクト

全般

プロフィール

調査 #116

未完了

GradleでJUnit5テストをローカルマシンで実施する

高橋 徹 さんが1年以上前に追加. 1年以上前に更新.

ステータス:
進行中
優先度:
通常
担当者:
カテゴリ:
-
開始日:
2020/05/08
期日:
2020/05/10 (約21ヶ月 遅れ)
進捗率:

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 ディレクトリを設けてその下に入れるのが一案である。

ビルド定義の記述

  1. build.gradle にローカルマシン上の指定のディレクトリをリポジトリとする定義を記述する。flatDirでパスを指定する。パスはマシンにより異なるのでbuild.gradleにはパスを直接記述せず、Gradleプロパティ名を記述する。
    repositories {
        flatDir {
            dirs "${property('library.junit5.dir')}" 
        }
    }
    
    • プロパティ名にピリオドを含まない場合は、dirs "${junit5}" と記述できる。ピリオドが含まれると、dirs "${library.junit5}" は library変数のjunit5メソッド呼び出しと解釈されるので意図した通りに動かない。
  2. build.gradle にJUnit 5のjunit-platform-console-standalone への依存を記述する。
    dependencies {
        testImplementation 'org.junit.platform:junit-platform-console-standalone:1.6.2'
    }
    
  3. build.gradle に、JUnit 5を使う際の必須定義を記述
    test {
        useJUnitPlatform()
    }
    
  4. ユーザーホームのgradle.propertiesにGradleプロパティ定義を記述
    Windowsの場合は、C:\Users\<ユーザー>\.gradle\gradle.properties
    Linuxの場合は、/home/<ユーザー>/.gradle/gradle.properties
    library.junit5.dir = C:/Program Files/Java/junit5
    

テスト実行

gradle build で一連のタスクの中でユニットテストが実行される。
テスト結果はbuild\reports\tests\test\index.html に出力される。

完了条件

調査結果を本説明欄に明記し、Wikiからリンクで本チケットを辿れるようにする。

高橋 徹 さんが1年以上前に更新

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

テストは正常に実行された。

高橋 徹 さんが1年以上前に更新

  • ステータス新規 から 進行中 に変更
  • 進捗率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
    

高橋 徹 さんが1年以上前に更新

警告:不明な列挙型定数ですStatus.STABLE の対処

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'
  }

clean して test を実行すると警告は消えた。

高橋 徹 さんが1年以上前に更新

テストの実行で 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'
      }
    

高橋 徹 さんが1年以上前に更新

開発マシンのローカルに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 などのタスクを実行する。

高橋 徹 さんが1年以上前に更新

高橋 徹 さんが1年以上前に更新

他の形式にエクスポート: Atom PDF