cucumber-jvm
cucumber-jvm copied to clipboard
A separate main to launch JUnit Platform
🤔 What's the problem you're trying to solve?
When launched through io.cucumber.core.cli.Main Cucumber will use cucumber.properties. When launched through the JUnit Platform the junit-platform.properties file is used.
This difference can be confusing for novice and advanced users who use Intelij IDEA. And unfortunately JetBrains has made little progres improving on this (see IDEA-227508).
✨ What's your proposed solution?
Create a new main method that maps the CLI arguments to the JUnit Platform and runs Cucumber. This main can then be used in IDEAs run configuration.
⛏ Have you considered any alternatives or workarounds?
Reading cucumber.properties in the JUnit Platform is an option. Though because Cucumber and JUnit have different semantics around merging properties this doesn't seem feasible.
Alternatively Cucumber could change it's property reading mechanism to be more sane. But that would be something for the next major release.
Or I could implement a better Cucumber plugin. Though I should probably do it in VS Code. Maybe that will get JetBrains attention. My subscription certainly doesn't.
Additional idea. Consider adding a --junit-platform flag or subcommand to the regular CLI that will delegate to the JUnit Platform for reduced friction.
The workaround is to have the two files cucumber.properties and junit-platform.properties with the same content, so that Cucumber runtime configuration is the same no matter the execution method.
Thanks for reminding me. There's a better workaround now. It allows the properties to be shared.
https://github.com/junit-team/junit5/blob/main/junit-platform-suite-api/src/main/java/org/junit/platform/suite/api/ConfigurationParametersResource.java
I added @ConfigurationParametersResource("cucumber.properties") and it works. To summarize the different behaviors:
| Run with | cucumber.properties + @ConfigurationParametersResource("cucumber.properties") on Cucumber test class |
cucumber.properties + same junit-platform.properties |
cucumber.properties only |
|---|---|---|---|
| IntelliJ IDEA right click on project, Run "All tests" (or right click on Cucumber test class, then Run "<testClass>") |
properties taken into account | properties taken into account | ⚠️properties not taken into account |
| IntelliJ IDEA right click on the project Run "All Features in: <project>" |
properties taken into account (but all features are ran twice) |
properties taken into account (but all features are ran twice) |
properties taken into account (but all features are ran twice) |
| IntelliJ IDEA right click on the resource directory which contains the feature files, Run "All Features in: <directory>" |
properties taken into account | properties taken into account | properties taken into account |
| Maven running Cucumber test class | properties taken into account | properties taken into account | properties taken into account |
I still didn't found why the features files are ran twice when using Intellij's "Run All Features in <project>", but that's another story...
I still didn't found why the features files are ran twice when using Intellij's "Run All Features in
", but that's another story...
Sounds like IDEA is using the class path root selector on the JUnit Platform. It will discover both the Suite through the Suite Engine and the features through the Cucumber Engine.