MavenでJUnit5 @DisplayNameを使う

こんにちは、平田です。

MavenでJUnit5テストケースを実行した際に、@DisplayNameアノテーションに指定したタイトルをXMLテストレポートに出してみます。

JUnit5では、@DisplayNameアノテーションでテストメソッド名とは別のテストケース表示名を指定できます。句読点や絵文字などを含む、より自然なテストケース名をつけることができます。

Eclipseなどのテストランナーで実行すると、DisplayNameに指定したタイトルが表示されますが、これをCIサーバ等で実行すると相変わらずメソッド名が表示されます。

EclipseのテストランナーではDisplayNameが表示される

Jenkins等のCIサーバでは、XML形式のテストレポート(JUnitのXML形式がデファクトになっており、他の言語のテストフレームワークでも大抵出力できる)を読み込んでテスト結果を表示するため、テストレポートの時点でDisplayNameが出ていないとテスト結果の画面にも出ないことになります。

Jenkinsのテスト結果ではメソッド名が表示される

Mavenを使っている場合は、2019年末にリリースされたmaven-surefire-plugin 3.0.0-M4から、DisplayNameを出力できるようになったようです(プラグインドキュメント参照)。

JUnit5のサンプル集から junit5-jupiter-starter-maven で試してみます。サンプルを git clone して、junit5-jupiter-starter-mavenに対して mvn clean test します。出力された target/surefire-reports/TEST-com.example.project.CalculatorTests.xml は以下のようにメソッド名が出力されています。

<testsuite ...>
  ...
  <testcase name="addsTwoNumbers" classname="com.example.project.CalculatorTests" time="0.023"/>
  <testcase name="add(int, int, int)[1]" classname="com.example.project.CalculatorTests" time="0.031"/>
  <testcase name="add(int, int, int)[2]" classname="com.example.project.CalculatorTests" time="0.001"/>
  <testcase name="add(int, int, int)[3]" classname="com.example.project.CalculatorTests" time="0.003"/>
  <testcase name="add(int, int, int)[4]" classname="com.example.project.CalculatorTests" time="0.005"/>
</testsuite>

次に、pom.xmlを以下のように修正します。

<build>
  <plugins>
  ...
    <plugin>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>3.0.0-M5</version>
      <configuration>
        <statelessTestsetReporter implementation="org.apache.maven.plugin.surefire.extensions.junit5.JUnit5Xml30StatelessReporter">
          <usePhrasedTestCaseMethodName>true</usePhrasedTestCaseMethodName>
        </statelessTestsetReporter>
      </configuration>
    </plugin>
  </plugins>
</build>

再度、mvn clean test して出力されたレポートが以下です。

<testsuite ...>
  ...
  <testcase name="1 + 1 = 2" classname="com.example.project.CalculatorTests" time="0.025"/>
  <testcase name="0 + 1 = 1" classname="com.example.project.CalculatorTests" time="0.018"/>
  <testcase name="1 + 2 = 3" classname="com.example.project.CalculatorTests" time="0.001"/>
  <testcase name="49 + 51 = 100" classname="com.example.project.CalculatorTests" time="0"/>
  <testcase name="1 + 100 = 101" classname="com.example.project.CalculatorTests" time="0.001"/>
</testsuite>

DisplayNameに指定したテストケース表示名(1 + 1 = 2 など)が出力されました。これを元にしたテスト結果画面も、テストケース表示名が出力されます。

Jenkinsのテスト結果画面にDisplayNameが表示される

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です