I want to add a tag @skiponchrome to a scenario, this should skip the scenario when running a Selenium test with the Chrome browser. The reason to-do this is because some sc
It's actually really easy. If you dig though the Cucumber-JVM and JUnit 4 source code, you'll find that JUnit makes skipping during runtime very easy (just undocumented).
Take a look at the following source code for JUnit 4's ParentRunner
, which Cucumber-JVM's FeatureRunner
(which is used in Cucumber
, the default Cucumber runner):
@Override
public void run(final RunNotifier notifier) {
EachTestNotifier testNotifier = new EachTestNotifier(notifier,
getDescription());
try {
Statement statement = classBlock(notifier);
statement.evaluate();
} catch (AssumptionViolatedException e) {
testNotifier.fireTestIgnored();
} catch (StoppedByUserException e) {
throw e;
} catch (Throwable e) {
testNotifier.addFailure(e);
}
}
This is how JUnit decides what result to show. If it's successful it will show a pass, but it's possible to @Ignore
in JUnit, so what happens in that case? Well, an AssumptionViolatedException
is thrown by the RunNotifier
(or Cucumber FeatureRunner
in this case).
So your example becomes:
@Before("@skiponchrome") // this works
public void beforeScenario() {
if(currentBrowser == 'chrome') { // this works
throw new AssumptionViolatedException("Not supported on Chrome")
}
}
If you've used vanilla JUnit 4 before, you'd remember that @Ignore
takes an optional message that is displayed when a test is ignored by the runner. AssumptionViolatedException
carries the message, so you should see it in your test output after a test is skipped this way without having to write your own custom runner.