はじめに
2020年は心機一転、様々なことをアウトプットしていきたいということを胸に秘めつつ、初めての投稿です。
現在従事しているプロジェクトでは、Junit5で単体テストを実施していますが、試験結果はExcel形式で提出を求められるという非常にレガシー感漂う現場のため、いい感じにExcel出力するツールを作成しました。
やれることは参考にさせていただいた、やるすん様のUnitTestDoclet(https://w.atwiki.jp/yasrun/pages/86.html)
と大きく変わりませんが、勉強も兼ねてJavaバージョン最新化、Gradle対応等々手を加えさせていただきました。
ツールはGitHub(https://github.com/shimi58/unittestoutputter)
で公開していますので、同じ境遇の方は参考にしてみてください。
ここからは躓いた箇所をツラツラと書いていきます。
Docletのデバッグ実行
http://nabeshodai.web.fc2.com/java/environment/20090407/doclet.html
こちらを参考にさせていただきました。
メインクラス呼び出しは、DocletのMainを呼び出す必要があります。
jdk.javadoc.internal.tool.Main
引数は以下の通り。
-doclet unittestoutputter.UnitTestOutputter
-overviewfile overview.html
-sourcepath C:\pleiades\workspace\unittestoutputter\src\main\java unittestoutputter.domain.model
- -doclet プロジェクト名.runがあるJavaファイル
- -sourcepath パッケージパスとターゲットパッケージを分けて記載が必要
Java9からRootDoc非奨励に
これが結構躓きました。(移行後のDocletEnvironmentの情報がほとんどなく。。)
公式ドキュメントを読み込み、なんとか突破。
https://docs.oracle.com/javase/9/docs/api/jdk/javadoc/doclet/package-summary.html
大まかにやったことは、
DocletEnvironment → List<ClassElement> → ClassElement → List<MethodElement> → MethodElement
を経て、
DocletEnvironment → docTrees
このdocTreesにMethodElementを当ててようやくメソッドのJavaDocコメントが取れるという、変換の嵐でした。。(もっといいやり方あったかも。。)
DocletEnvironmentのJavaDocコメントがUnicode形式に
そして苦労して取れたJavaDocコメントは日本語がUnicodeという、、(なぜだ。。)
Unicode変換はこちらを参考にさせていただきました。
https://qiita.com/sifue/items/039846cf8415efdc5c92
当然ながらUnicodeと英数字混在の場合の処理は苦戦しました。
Junit5のテストが動かない
gradleにJunit5定義を追加したのですが、エラーになりました。
- 追加した定義
dependencies {
compile group: 'org.apache.poi', name : 'poi', version: '4.1.1'
compile group: 'org.apache.poi', name : 'poi-ooxml', version: '4.1.1'
testCompile("org.junit.jupiter:junit-jupiter-api:5.0.0")
testCompile("org.junit.jupiter:junit-jupiter-params:5.0.0")
testRuntime("org.junit.jupiter:junit-jupiter-engine:5.0.0")
testRuntime("org.junit.platform:junit-platform-launcher:1.0.0")
}
- エラー内容
java.lang.NoSuchMethodError: 'void org.junit.platform.launcher.Launcher.execute(org.junit.platform.launcher.TestPlan, org.junit.platform.launcher.TestExecutionListener[])'
at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:89)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)
どうやらLauncherのバージョンがあっていないと該当のエラーがでるみたいで、、バージョンアップさせるとうまく動くようになりました。
このあたりのやり取りを読んでバージョンを書き換えたりしてました。
https://github.com/junit-team/junit5/issues/1773
testRuntime("org.junit.platform:junit-platform-launcher:1.4.0")
buildした資材にpoiのjarが含まれない
外部ライブラリを含めるためのGradle定義追加は、以下を参考にさせていただきました。
https://qiita.com/mychaelstyle/items/9338f558903ac0c14bc3
やり方は簡単。
build.gradleファイルのjarの設定に
from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
を加えるだけでできます。
のように、簡単にできました!
さいごに
ツラツラ書いてきましたが、年末年始結構時間取られました。。
RootDoc
の方が使いやすかったなぁ。。