JavaのJunitテストコードをExcel出力する

# はじめに

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を呼び出す必要があります。

~~~java
jdk.javadoc.internal.tool.Main
~~~

引数は以下の通り。

~~~java
-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

大まかにやったことは、

~~~text
DocletEnvironment → List<ClassElement> → ClassElement → List<MethodElement> → MethodElement
~~~

を経て、

~~~text
DocletEnvironment → docTrees
~~~

このdocTreesにMethodElementを当ててようやくメソッドのJavaDocコメントが取れるという、変換の嵐でした。。(もっといいやり方あったかも。。)

## DocletEnvironmentのJavaDocコメントがUnicode形式に

そして苦労して取れたJavaDocコメントは日本語がUnicodeという、、(なぜだ。。)

Unicode変換はこちらを参考にさせていただきました。
https://qiita.com/sifue/items/039846cf8415efdc5c92

当然ながらUnicodeと英数字混在の場合の処理は苦戦しました。


## Junit5のテストが動かない

gradleにJunit5定義を追加したのですが、エラーになりました。

- 追加した定義

~~~groovy
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")
}
~~~

- エラー内容

~~~log
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

~~~groovy
testRuntime("org.junit.platform:junit-platform-launcher:1.4.0")
~~~

## buildした資材にpoiのjarが含まれない

外部ライブラリを含めるためのGradle定義追加は、以下を参考にさせていただきました。
https://qiita.com/mychaelstyle/items/9338f558903ac0c14bc3

~~~text
やり方は簡単。
build.gradleファイルのjarの設定に
from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
を加えるだけでできます。
~~~

のように、簡単にできました！

## さいごに

ツラツラ書いてきましたが、年末年始結構時間取られました。。
`RootDoc`の方が使いやすかったなぁ。。