Skip to content

Commit

Permalink
[JUnit/TestNG] Always print snippets for undefined steps
Browse files Browse the repository at this point in the history
  • Loading branch information
mpkorstanje committed Aug 28, 2019
1 parent c671ccc commit 93659b9
Show file tree
Hide file tree
Showing 6 changed files with 76 additions and 15 deletions.
12 changes: 3 additions & 9 deletions CHANGELOG.md
Expand Up @@ -3,16 +3,10 @@ Please see [CONTRIBUTING.md](https://github.com/cucumber/cucumber/blob/master/CO

## [4.7.2-SNAPSHOT](https://github.com/cucumber/cucumber-jvm/compare/v4.7.1...master) (In Git)

### Added

### Changed

### Deprecated

### Removed

### Fixed

* [JUnit] JUnit will always print unused steps (M.P. Korstanje)
* [TestNG] TestNG will always print unused steps (M.P. Korstanje)

## [4.7.1-SNAPSHOT](https://github.com/cucumber/cucumber-jvm/compare/v4.7.0...v4.7.1) (2019-07-28)

### Fixed
Expand Down
Expand Up @@ -43,6 +43,7 @@ public final class PluginFactory {
put("json", JSONFormatter.class);
put("usage", UsageFormatter.class);
put("rerun", RerunFormatter.class);
put("undefined", UndefinedStepsPrinter.class);
put("default_summary", DefaultSummaryPrinter.class);
put("summary", DefaultSummaryPrinter.class);
put("null_summary", NullSummaryPrinter.class);
Expand Down
@@ -0,0 +1,48 @@
package cucumber.runtime.formatter;

import cucumber.api.event.EventHandler;
import cucumber.api.event.EventListener;
import cucumber.api.event.EventPublisher;
import cucumber.api.event.TestRunFinished;
import cucumber.runtime.UndefinedStepsTracker;

import java.io.PrintStream;
import java.util.List;

class UndefinedStepsPrinter implements EventListener {

private final UndefinedStepsTracker undefinedStepsTracker = new UndefinedStepsTracker();

private final PrintStream out;

public UndefinedStepsPrinter() {
this.out = System.out;
}

private void print() {
printSnippets();
}

private void printSnippets() {
List<String> snippets = undefinedStepsTracker.getSnippets();
if (!snippets.isEmpty()) {
out.append("\n");
out.println("There were undefined steps. You can implement missing steps with the snippets below:");
out.println();
for (String snippet : snippets) {
out.println(snippet);
}
}
}

@Override
public void setEventPublisher(EventPublisher publisher) {
undefinedStepsTracker.setEventPublisher(publisher);
publisher.registerHandlerFor(TestRunFinished.class, new EventHandler<TestRunFinished>() {
@Override
public void receive(TestRunFinished event) {
print();
}
});
}
}
Expand Up @@ -47,6 +47,12 @@ public static RuntimeOptions defaultOptions() {
return new RuntimeOptions();
}

public void addUndefinedStepsPrinterIfSummaryNotDefined() {
if (pluginSummaryPrinterNames.isEmpty()) {
pluginSummaryPrinterNames.add("undefined");
}
}

public int getCount() {
return count;
}
Expand Down
8 changes: 5 additions & 3 deletions junit/src/main/java/io/cucumber/junit/Cucumber.java
Expand Up @@ -11,10 +11,7 @@
import cucumber.runtime.BackendSupplier;
import cucumber.runtime.ClassFinder;
import cucumber.runtime.Env;
import io.cucumber.core.options.EnvironmentOptionsParser;
import cucumber.runtime.FeaturePathFeatureSupplier;
import io.cucumber.core.options.RuntimeOptions;
import io.cucumber.core.options.CucumberOptionsAnnotationParser;
import cucumber.runtime.filter.Filters;
import cucumber.runtime.formatter.PluginFactory;
import cucumber.runtime.formatter.Plugins;
Expand All @@ -23,6 +20,9 @@
import cucumber.runtime.io.ResourceLoaderClassFinder;
import cucumber.runtime.model.CucumberFeature;
import cucumber.runtime.model.FeatureLoader;
import io.cucumber.core.options.CucumberOptionsAnnotationParser;
import io.cucumber.core.options.EnvironmentOptionsParser;
import io.cucumber.core.options.RuntimeOptions;
import org.apiguardian.api.API;
import org.junit.AfterClass;
import org.junit.BeforeClass;
Expand Down Expand Up @@ -95,6 +95,8 @@ public Cucumber(Class clazz) throws InitializationError {
.parse(Env.INSTANCE)
.build(annotationOptions);

runtimeOptions.addUndefinedStepsPrinterIfSummaryNotDefined();

JUnitOptions junitAnnotationOptions = new JUnitOptionsParser()
.parse(clazz)
.build();
Expand Down
16 changes: 13 additions & 3 deletions testng/src/main/java/io/cucumber/testng/TestNGCucumberRunner.java
Expand Up @@ -2,8 +2,16 @@

import cucumber.api.event.TestRunFinished;
import cucumber.api.event.TestRunStarted;
import cucumber.runner.*;
import cucumber.runtime.*;
import cucumber.runner.EventBus;
import cucumber.runner.Runner;
import cucumber.runner.ThreadLocalRunnerSupplier;
import cucumber.runner.TimeService;
import cucumber.runner.TimeServiceEventBus;
import cucumber.runtime.BackendModuleBackendSupplier;
import cucumber.runtime.ClassFinder;
import cucumber.runtime.CucumberException;
import cucumber.runtime.Env;
import cucumber.runtime.FeaturePathFeatureSupplier;
import cucumber.runtime.filter.Filters;
import cucumber.runtime.formatter.PluginFactory;
import cucumber.runtime.formatter.Plugins;
Expand All @@ -13,9 +21,9 @@
import cucumber.runtime.model.CucumberFeature;
import cucumber.runtime.model.FeatureLoader;
import gherkin.events.PickleEvent;
import io.cucumber.core.options.CucumberOptionsAnnotationParser;
import io.cucumber.core.options.EnvironmentOptionsParser;
import io.cucumber.core.options.RuntimeOptions;
import io.cucumber.core.options.CucumberOptionsAnnotationParser;
import org.apiguardian.api.API;

import java.util.ArrayList;
Expand Down Expand Up @@ -52,6 +60,8 @@ public TestNGCucumberRunner(Class clazz) {
.parse(Env.INSTANCE)
.build(annotationOptions);

runtimeOptions.addUndefinedStepsPrinterIfSummaryNotDefined();

ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader);
BackendModuleBackendSupplier backendSupplier = new BackendModuleBackendSupplier(resourceLoader, classFinder, runtimeOptions);
bus = new TimeServiceEventBus(TimeService.SYSTEM);
Expand Down

0 comments on commit 93659b9

Please sign in to comment.