単体試験項目表をJUnit/Ant/Javadocで作ろう:おじどうくんUT5

単体試験項目表をJUnitで作りたいと思いました。

従来でもAntを使用してJunitReportから試験結果一覧を出すことは可能です。
しかし、この JUnitReportによるJUnitの結果一覧はこんな感じ になります(あるいはこんな感じです)。

よく見ましょう。どこにもJavaDocのコメントがないのです。

こんなんで単体(テスト)試験項目のレビューができるか馬鹿やろう (ほらそこ! 直接テストコードみりゃいいじゃねぇかとか言わない)

ということで、 JUnitReportによるJUnitの結果一覧 にJavadocのコメントをdocletを使って追加するものを作ってみました。
これでようやくレビューができます。
これによって出てくる 単体試験項目表はこんな感じです。コメントが付いていることが確認できますね?
もっと表一体化している方が良いのであれば 単体試験項目表はこんな感じにでも出力します。 こちらは画面を目いっぱい広げてからコピーし、excelに張り付けるような用途を想定して作成しています。

さぁ、頑張ってレビューをしましょう。

※ ってなんでこの程度のものがネットで探して出てこないんだ……
※ ちなみに、HTMLがフレームじゃないのは印刷できるようにするためです。
※ 試験項目表って印刷しないとフレームじゃなくてクレームが来るんだよね。

※ なお、気に入らなければソースも置くんで適当に書き換えてください

使い方(Antの書き方)

まずは適当にTestCaseを書いてください。
テストケース上のJavaDocが今回JUnitレポート出力相当に付きます。

    /**
     * Hello world test message
     */
    @Test
    public void testHello() {
        assertTrue(true);
    }

こんな感じでまずJUnitを実行してTEST-*.xmlを出力してください。

  <path id="common.classpath">
    <pathelement path="C:\eclipse\plugins\org.hamcrest.core_1.3.0.v201303031735.jar" />
    <pathelement path="C:\eclipse\plugins\org.junit_4.12.0.v201504281640/junit.jar" />
    <pathelement path="C:\Program Files\Java\jdk1.8.0_77\lib\tools.jar" />
    <pathelement location="./classes" />
  </path>
  <target name="all">
    <mkdir dir="./target/" />
    <delete dir="./target/junit" />
    <mkdir dir="./target/junit" />
    <junit printsummary="yes" haltonfailure="no">
      <classpath refid="common.classpath" />
      <formatter type="xml" />
      <batchtest fork="yes" todir="./target/junit">
        <fileset dir="./src/test/java">
          <include name="**/*Test.java" />
        </fileset>
      </batchtest>
    </junit>

次に、JavaDocを使って単体試験項目表を作成します。
※当然ですが、これを使うにはこのページからダウンロードしたUT5DocLet.jarが必要です

    <delete dir="./target/ut5" />
    <mkdir dir="./target/ut5" />
    <javadoc destdir="./target/ut5"
      encoding="UTF-8" docencoding="UTF-8"
      additionalparam="-J-Dfile.encoding=UTF-8"
      charset="Shift_JIS">
      <classpath refid="common.classpath" />
      <packageset dir="src/test/java">
          <include name="jp/**" />
      </packageset>
      <doclet name="jp.ruru.park.ando.ut5.UT5Doclet" path="lib/UT5DocLet.jar">
        <param name="-junit" value="./target/junit" />
      </doclet>
    </javadoc>

書き方(テーブルカラムの変更)

また、以下のように-junittreeオプションを付けると、 ツリーの一覧を並び替えることができます。
並び替えたサンプルはこちらになります。

    <delete dir="./target/ut5" />
    <mkdir dir="./target/ut5" />
    <javadoc destdir="./target/ut5"
      encoding="UTF-8" docencoding="UTF-8"
      additionalparam="-J-Dfile.encoding=UTF-8"
      charset="Shift_JIS">
      <classpath refid="common.classpath" />
      <packageset dir="src/test/java">
          <include name="jp/**" />
      </packageset>
      <doclet name="jp.ruru.park.ando.ut5.UT5Doclet" path="lib/UT5DocLet.jar">
        <param name="-junit" value="./target/junit" />
        <param name="-junittree" value="abdegh cf r i j tt s nqq l" />
      </doclet>
    </javadoc>

-junittreeオプションの値は以下の意味を持ちます。

キー 意味
a パッケージ番号
b パッケージ名
c パッケージメッセージ
d クラス番号
e クラス名
f クラスメッセージ
g テストケース番号
h テストケース名
i テストメッセージ
j Status
k TimeStamp
l Time
m Author (JavaDocの@author)
n Version (JavaDocの@version)
o ブランク(パッケージ)
p ブランク(クラス)
q ブランク(テストケース)
r 前提条件
s Authorから@以降を除いたもの
t 最古のTimeStamp
u 最古のTimeStampから時刻を除いたもの
v TimeStampから時刻を除いたもの
w Pass the test code.
[space] 無視

使い方(複雑版)

テスト項目表では開始日と終了日を入れたくなることがあります。
そのような場合は、レポートを日毎単位でフォルダを分けて記載して読み込ませると良いでしょう。
以下は、日付毎に tstamp anttask を使用して日付毎にレポートを出す例です。

    <tstamp>
      <format property="DATE" pattern="yyyy-MM-dd" />
    </tstamp>


    <delete dir="./target/junitDate/${DATE}" />
    <mkdir dir="./target/junitDate/${DATE}" />
    <junit printsummary="yes" haltonfailure="no">
      <classpath refid="common.classpath" />
      <formatter type="xml" />
      <batchtest fork="yes" todir="./target/junitDate/${DATE}">
        <fileset dir="./src/test/java">
          <include name="**/*Test.java" />
        </fileset>
      </batchtest>
    </junit>

こちら、もう少し複雑書いた例になります。
-junit フォルダは再帰的に見るので./target/junitDate/を見るようにしています。

    <javadoc destdir="./src/site"
      windowtitle="(SAMPLE)DOCLET: JUnit report include JavaDoc"
      encoding="MS932"
      docencoding="UTF-8"
      additionalparam="-J-Dfile.encoding=MS932"
      locale="en"
      use="true"
      defaultexcludes="no"
      access="private"
      nodeprecated="true"
      nodeprecatedlist="true"
      notree="false"
      noindex="false"
      nonavbar="true"
      nohelp="true"
      serialwarn="true"
      failonerror="false"
      splitindex="true"
      charset="Shift_JIS"
      source="1.8"
      stylesheetfile="./target/site/css/maven-theme.css">
      <classpath refid="common.classpath" />
      <packageset dir="src/test/java" defaultexcludes="yes">
        <include name="jp/**" />
      </packageset>
      <group title="Main TestCase" packages="jp.ruru.park.ando.ut5*"/>
      <group title="Findbugs Test" packages="findbugs*"/>
      <doclet name="jp.ruru.park.ando.ut5.UT5Doclet"
        path="lib/UT5DocLet.jar">
        <param name="-junit" value="./target/junitDate" />
        <param name="-junittree" value="abdegh cf r i wj vt s nqq l" />
      </doclet>
      <doctitle>DOCLET: JUnit report include JavaDoc.</doctitle>
      <footer>Copyright &#169; 2016 Ando Computer Behavior RandD. All Rights Reserved.</footer>
      <link href="http://docs.oracle.com/javase/8/docs/api/" />
    </javadoc>

変更履歴

Version.1.1.15 :
JUnit4 の @Theoryに対応。update102に対応。
Version.1.1.14 :
findbugsのxml内のtimestampがいまいち信用ならないのでxmlのファイルのタイムスタンプを使うように修正。
Version.1.1.13 :
findbugsでmix表示したときにfindbugs側をjunitの出力より後ろにもっていくように修正。
Version.1.1.12 :
System.out.println()でデバッグメッセージが残っていたので削除。
ドキュメントの記述一部修正。
Version.1.1.11 :
findbugs側のエラー行の検索とカウントエンジンにミスがあったのを修正。
Version.1.1.10 :
GitHubに登録。それに伴いpom.xmlにサイトURLを登録。
ソースの出力をGitHubに移行。
time値が0.00のとき--を出力するように修正。
表示するドキュメントがないとき、@Overriteがあるかチェックするように修正(ジェネリック対策)。
Version.1.1.9 :
FindBugsも単体試験項目表のようにしてみた。
Mavenでドキュメント生成するように修正(xdoc書くの辛い…)。
JavaDocの stilesheetfile オプションに対応。
そろそろgithubに載せたい(が、やりかた忘れた…)。
JUnitがどーやってもMaven⇒ant経由で起動できないんだよなぁ…。
Version.1.1.8 :
FindBugsでコードチェックしたらいくつか出ていたので修正。
Version.1.1.7 :
JavaDoc ant task の groupタグに対応。
Version.1.1.6 :
junit指定でフォルダを1階層しか見なかったが、下位の再帰で確認するように修正。
同じクラス名のTest-*.xmlがいたら、過去のものをold dateとして管理するように修正。
Version.1.1.5 :
authorを見るときにクラスのチェックが入っていないかったのを修正。
テストメソッドと同名の引数付きメソッドがあるときに未チェックだったのを修正。
treeの順番を入れ替えられるようにした(javatreeオプションを追加した)
Version.1.1.4 :
表示の順番をソートするように変更
notreeオプションの動作変更。tee表示として表一体化したものを追加した (notreeを指定すると出力されない/つまりデフォルト出力)
Version.1.1.3 :
処理できるオプションにcharsetを追加。
処理できるオプションにsourceを追加。
処理できるオプションにoverviewを追加。
処理できるオプションにnohelpを追加(ただし無視する)。
てけとーに英語のページを作ってみた(ソースコードのドキュメントをすべて英語に)。
Version.1.1.2 :
footer,bottomタグの付き方が変なので変更。
JavaDoc側のソースが存在しないときにNullPointerExceptionが出ていたのを修正。
@before,@afterなどのテスト系アノテーションがついたメソッドを項目に追加。
Version.1.1.1 :
初版