4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

はじめに

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の方が使いやすかったなぁ。。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?