@Override public ScenarioTokenBean marshal(ScenarioToken s) throws Exception { ScenarioTokenBean result = new ScenarioTokenBean(); result.setTokenId(s.getTokenId()); result.setName(s.getName()); result.setSteps(s.getSteps()); List<String> tags = s.getTags(); result.setTags(tags.size() == 0 ? null : FormattingUtils.getAsCsv(s.getTags())); result.setEndState(s.getEndState()); return result; }
private ScenarioToken createScenario(String name, ScenarioToken backgroundScenario, List<String> currentFeaturesTags, List<String> currentScenariosTags) { ScenarioToken scenario = new ScenarioToken(); //add any background steps first if (backgroundScenario != null) { for (StepToken backgroundStep : backgroundScenario.getSteps()) { //pass empty list of macros since background steps have already been matched to step macros and expanded, //we add a deep copy of the background step, which will also contain copies of any macro child steps. StepToken copiedStep = backgroundStep.deepCopy(); addStepToScenario(scenario, copiedStep, Collections.<StepMacro>emptyList()); } } scenario.setName(name); //add the filter tags scenario.addTags(currentFeaturesTags); scenario.addTags(currentScenariosTags); return scenario; }
public boolean isStartOrEndScenario() { return isFeatureStartScenario() || isFeatureEndScenario(); }
public boolean isFeatureStartScenarioFailed() { boolean result = false; if (!scenarios.isEmpty()) { ScenarioToken scenarioToken = scenarios.get(0); result = scenarioToken.getName().equals("Feature-Start") && scenarioToken.getEndState() == EndState.FAILED; } return result; }
private void createFeatureFour() { ScenarioToken scenarioFour = new ScenarioToken(); scenarioFour.setName("Scenario Four"); StepToken step = scenarioFour.addStep(StepToken.createStep("If", "I add a step to scenario 3")); step.setEndState(StepEndState.SKIPPED); FeatureToken featureFour = new FeatureToken(); featureFour.setName("Feature Four Failed No Handler"); featureFour.addScenario(scenarioFour); listOfFeatures.add(featureFour); }
private String calculateName(FeatureToken featureToken, ScenarioToken scenarioToken, Set<String> scenarioNames) { String conf = featureToken.getConfigurationName().equals(FeatureToken.BASE_CONFIGURATION) ? "" : " [" + featureToken.getConfigurationName() + "]"; String name = scenarioToken.getName() + conf; int instance = 2; while ( ! scenarioNames.add(name)) { name = scenarioToken.getName() + " (" + instance++ + ")"; } return name; }
@Override public ScenarioToken unmarshal(ScenarioTokenBean v) throws Exception { ScenarioToken scenarioToken = new ScenarioToken(); scenarioToken.setName(v.getName()); scenarioToken.setSteps(v.getSteps()); String tags = v.getTags(); if ( tags != null ) { scenarioToken.setTags(FormattingUtils.getStringListFromCsv(tags)); } return scenarioToken; }
private void runScenario(ExecutionToken executionToken, HandlerManager handlerManager, ScenarioToken scenario, boolean skipScenario) throws Exception { executionListenerSupport.notifyScenarioStarted(executionToken, scenario); log.info(String.format("Processing scenario: %s", scenario.getName())); //reset the ChorusContext for the scenario ChorusContext.destroy(); handlerManager.setCurrentScenario(scenario); List<Object> handlerInstances = Collections.emptyList(); if ( ! skipScenario) { handlerInstances = handlerManager.getOrCreateHandlersForScenario(); } handlerManager.processStartOfScope(Scope.SCENARIO, handlerInstances); StepInvokerProvider p = getStepInvokers(handlerInstances); createTimeoutTasks(Thread.currentThread()); //will interrupt or eventually kill thread / interpreter if blocked log.debug((skipScenario ? "Skipping" : "Running") + " scenario steps for Scenario " + scenario); stepProcessor.runSteps(executionToken, p, scenario.getSteps(), stepCatalogue, skipScenario); stopTimeoutTasks(); //the special start or end scenarios don't count in the execution stats if ( ! scenario.isStartOrEndScenario() ) { updateExecutionStats(executionToken, scenario); } handlerManager.processEndOfScope(Scope.SCENARIO, handlerInstances); executionListenerSupport.notifyScenarioCompleted(executionToken, scenario); }
private void removeFeatureIfNoScenariosMatchTags(String filterExpression, Iterator<FeatureToken> fi) { //remove all filtered scenarios from this feature FeatureToken feature = fi.next(); int startOrEndCount = 0; for (Iterator<ScenarioToken> si = feature.getScenarios().iterator(); si.hasNext(); ) { ScenarioToken scenario = si.next(); if ( scenario.isFeatureStartScenario() || scenario.isFeatureEndScenario() ) { log.trace("Not removing since this is a start or end feature scenario"); startOrEndCount ++; } else if (! tagExpressionEvaluator.shouldRunScenarioWithTags(filterExpression, scenario.getTags())) { log.debug("Removing scenario " + scenario + " which does not match tag " + filterExpression); si.remove(); } } //if there are no scenarios left (apart from special start or end feature scenarios which are never tagged), //then remove this feature from the list to run if (feature.getScenarios().size() == startOrEndCount) { log.debug("Will not run feature " + fi + " which does not have any scenarios which " + "passed the tag filter " + filterExpression); fi.remove(); } }
protected boolean shouldPrompt(ScenarioToken scenarioToken) { return scenarioToken.getEndState() == EndState.FAILED; } }
public ScenarioToken deepCopy() { ScenarioToken copy = new ScenarioToken(); super.deepCopy(copy); copy.name = this.name; copy.steps = new ArrayList<>(); for (StepToken step : steps) { copy.steps.add(step.deepCopy()); } copy.tags = new ArrayList<>(); copy.tags.addAll(this.tags); return copy; }
/** * Creates a pretty formatted Feature */ @Override public String toString() { final StringBuilder sb = new StringBuilder(); if ( usesHandlers != null) { for (String s : usesHandlers) { sb.append("Using: ").append(s).append("\n"); } if (usesHandlers.length > 0) { sb.append("\n"); } } sb.append("Feature: ").append(name).append('\n'); String descriptionStr = " " + description.toString().trim().replaceAll("\n", "\n "); sb.append(descriptionStr).append('\n'); for (ScenarioToken scenario : scenarios) { sb.append('\n').append(" ").append(scenario.toString()).append('\n'); List<StepToken> steps = scenario.getSteps(); for (StepToken step : steps) { sb.append(" ").append(step.toString()).append('\n'); } } return sb.toString(); } }
/** * If a Feature-Start: section fails or a handler for a feature is not found, all steps may be skipped * * @return true if this scenario Failed because it was skipped (all child steps are skipped) */ public boolean wasSkipped() { return getSteps().stream().filter(s -> s.getEndState() != StepEndState.SKIPPED).count() == 0; }
public void setScopeForContextIfNotConfigured(ScenarioToken scenarioToken, Properties p) { if ( ! containsExplicitScope(p)) { Scope autoScope = scenarioToken.isFeatureStartScenario() ? Scope.FEATURE : Scope.SCENARIO; p.setProperty("scope", autoScope.name()); } }
@Test public void outlineScenarioInheritsTagsFromFeatureAndAddsOwn() throws Exception { File f = getFileResourceWithName(TEST_FEATURE_FILE); FeatureFileParser p = new FeatureFileParser(); List<FeatureToken> features = p.parse(new FileReaderSupplier(f)); FeatureToken feature = features.get(0); // remaining scenarios (created from an outline) should have 2 inherited tags from the parent feature and one of their own for (int i = 2; i < feature.getScenarios().size(); i++) { ScenarioToken scenario3 = feature.getScenarios().get(2); List<String> scenario3tags = scenario3.getTags(); assertEquals("Wrong number of tags found on scenario " + (i + 1), 3, scenario3tags.size()); assertTrue(scenario3tags.contains("@tagA")); assertTrue(scenario3tags.contains("@tagB")); assertTrue(scenario3tags.contains("@tagF")); } }
public void addStep(StepToken t) { this.scenarioToken.addStep(t); } }
private void createFeatureThree() { ScenarioToken scenarioThree = new ScenarioToken(); scenarioThree.setName("Scenario Three"); StepToken stepSix = scenarioThree.addStep(StepToken.createStep("If", "I add a step to scenario 3")); stepSix.setEndState(StepEndState.TIMEOUT); StepToken stepSeven = scenarioThree.addStep(StepToken.createStep("If", "I add another skipped step to scenario 3")); stepSeven.setEndState(StepEndState.SKIPPED); FeatureToken featureThree = new FeatureToken(); featureThree.setName("Feature Three"); featureThree.addScenario(scenarioThree); listOfFeatures.add(featureThree); }
public void printScenario(ScenarioToken scenario) { getPrintWriter().printf(" Scenario: %s%n", scenario.getName()); getPrintWriter().flush(); }
@Override public void scenarioCompleted(ExecutionToken testExecutionToken, ScenarioToken scenario) { if ( shouldPrompt(scenario)) { ChorusOut.out.println("Scenario " + scenario.getName() + " " + scenario.getEndState()); ChorusOut.out.println("Do you want to proceed? (y/n)"); Console console = System.console(); String l = console.readLine(); if ( ! "y".equalsIgnoreCase(l)) { log.error("Exiting early on user request"); System.exit(1); } } }
public EndState getEndState() { EndState result = EndState.PASSED; for ( ScenarioToken s : scenarios) { if ( s.getEndState() == EndState.FAILED) { result = EndState.FAILED; break; } } if ( result != EndState.FAILED) { for ( ScenarioToken s : scenarios) { if ( s.getEndState() == EndState.PENDING) { result = EndState.PENDING; } } } return result; }