JUnit5 で Cucumber を Gradle から実行してビルトイン・レポートを出力する

JUnit5 で　Cucumber　を実行するためのライブラリとして junit-platform-engine　を使うが、Runnerクラスを宣言するアノテーションが、 `@Cucumber` に変わり、 `@CucumberOptions` が無くなった。

このため、Built-in reporter を使うためのPluginを設定する方法が変わったので、設定サンプルを残しておくと同時にBuilt-in reporterについて調べたこともまとめておく。

2021.10.27 追記
cucumber-junit-platform-engin　を 7.0.0に上げると `@Cucumber` がDeprecatedになり警告が出ます。
この場合 [GitHubのREADME]
(https://github.com/cucumber/cucumber-jvm/blob/main/junit-platform-engine/README.md)に記載されている通り `junit-platform-suite` を依存関係に追加したら、Runnerクラスにアノテーションを付けなくてもテストが実行できます。
`@Suite` などを付ける場合の理由や必要条件や未確認。

## この記事を書いた時の主なソフトウェアのバージョン

`Java`: OpenJDK 16.0.1
`Gradle`: 7.0.2
`JUnit`: 5.7.2
`cucumber`: 6.10.4
`cucumber-json-formatter`: 7.0.1

ちなみに検証で使ったGradleプロジェクトの　build.gradle はこんな感じ

```build.gradle
plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation('io.cucumber:cucumber-java:6.10.4')
    testImplementation('io.cucumber:cucumber-junit-platform-engine:6.10.4')
    testImplementation('org.junit.jupiter:junit-jupiter:5.7.2')
    testImplementation('org.mockito:mockito-core:3.10.0')
    testImplementation('org.assertj:assertj-core:3.19.0')
}

test {
    useJUnitPlatform()
}
```

##JUnit5 + Gradle で Cucumber の Configuration Optionｓ を設定する方法

Cucumber の [Configuration Options](https://github.com/cucumber/cucumber-jvm/tree/main/junit-platform-engine#configuration-options) の設定は、[JUnit5 の ドキュメント](https://junit.org/junit5/docs/current/user-guide/#running-tests-build-gradle-config-params) より、 test ビルドスクリプト内で　system properties で設定するか、 junit-platform.properties ファイルに記述するかの２通りがある。
(もう一つ、cucumber.properties に設定する方法も公式にはあるのだが、これはJUnit5には対応していないようで、設定しても反映されない。)
今回は後者のjunit-platform.properties　を利用してみた。

``` ./src/test/resources/junit-platform.properties
cucumber.publish.quiet=true
cucumber.plugin=pretty, message:build/reports/cucumber.ndjson, html:build/reports/cucumber.html, junit:build/reports/cucumber.xml, json:build/reports/report.json
```

設定後、`./gradlew clean test` を実行すれば、build/reports ディレクトリに指定したレポートファイルが生成される。

## Built-in reporter の種類

Cucumberには、様々なレポートフォーマットが組み込まれている。今回は前述の properties ファイルで設定した５種類のフォーマッターについて説明する。

### pretty

実行したシナリオをコンソールに出力する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160107/25a20dac-b502-37a5-449b-80479ce2d565.png)


### html

実行したシナリオレポートをHTML形式で出力する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160107/c49c370e-da83-f8a5-ff4b-a204f4bd4419.png)

### junit

シナリオの実行結果をJUnitフォーマットのXMLファイルで出力する。
テスト管理ツールによっては、CIツールを介してこのファイルを取り込んで、テスト結果を管理しておくことができる。（qTestとか）

### json

シナリオの実行結果をJSONファイルで出力する。
JUnitフォーマットと同様、この形式で実行結果を取り込むテスト管理ツールがある。（Zephyr や Xrayなど）

ただし、このフォーマッターは、Cucumberの最新バージョンではDeprecatedになっており、現在は旧バージョンとの互換のためのメンテナンスしかしていない。

そのためJSONファイルで結果を出力したい場合は、次のmessageフォーマッター(.ndjson)で出力してから変換する方法が案内されている。

### message

Cucumberの最新バージョンでは、Jsonフォーマットではなく、こちらを利用することとなっている。
このフォーマッターでは、`.ndjson`形式で出力される。

ただし、テスト管理ツール側でこのフォーマットに対応しているものは少ないため、　こちらの[cucumber-json-formatter](https://github.com/cucumber/common/releases/tag/cucumber-json-formatter%2Fv7.0.1)をダウンロードし、以下のようにコマンドを実行して、.ndjson を .json ファイルに変換する。

```zsh
cat build/reports/cucumber.ndjson| ./cucumber-json-formatter --format ndjson > build/reports/cucumber.json

# ダウンロードしたファイルは、名称を cucumber-json-formatter に変換し、 実行権限（chmod +x）を付与しておくこと
```

## Serenity BDD

Cucumberのレポートは、Serenity　を使うのが良さそうと思っている。

https://serenity-bdd.github.io/theserenitybook/latest/index.html

https://github.com/serenity-bdd/serenity-cucumber-starter

現時点では調査できていないが、 [BDD in Action 2nd Edition](https://www.manning.com/books/bdd-in-action-second-edition) の公開状況に合わせて、評価しつつ追記しようと思う。

https://kazokmr.hatenablog.com/entry/2021/05/19/065702

## 参考
[Cucumber Built-in reporter plugins](https://cucumber.io/docs/cucumber/reporting/#built-in-reporter-plugins)
[cucumber-jvm/junit-platform-engin (GitHub)](https://github.com/cucumber/cucumber-jvm/tree/main/junit-platform-engine)
[common/messages (GitHub)](https://github.com/cucumber/common/tree/main/messages)
[common/json-formatter (GitHub)](https://github.com/cucumber/common/tree/main/json-formatter)
[Using Cucumber Tags with JUnit5 (Baeldungjj)](https://www.baeldung.com/junit-cucumber-tags)
[Using Cucumber JVM With Gradle and JUnit](https://medium.com/swlh/using-cucumber-jvm-with-gradle-and-junit-a0dc6e195c94)
[Cucumber Reports](https://www.toolsqa.com/selenium-cucumber-framework/cucumber-reports/)