net.serenitybdd.junit.runners.ParameterizedTestsOutcomeAggregator Maven / Gradle / Ivy
package net.serenitybdd.junit.runners;
import net.thucydides.model.domain.*;
import org.apache.commons.lang3.StringUtils;
import org.junit.runner.Runner;
import java.util.*;
import java.util.stream.Collectors;
public class ParameterizedTestsOutcomeAggregator {
private final SerenityParameterizedRunner serenityParameterizedRunner;
private ParameterizedTestsOutcomeAggregator(SerenityParameterizedRunner serenityParameterizedRunner) {
this.serenityParameterizedRunner = serenityParameterizedRunner;
}
public static ParameterizedTestsOutcomeAggregator from(SerenityParameterizedRunner serenityParameterizedRunner) {
return new ParameterizedTestsOutcomeAggregator(serenityParameterizedRunner);
}
public List aggregateTestOutcomesByTestMethods() {
List allOutcomes = getTestOutcomesForAllParameterSets();
if (allOutcomes.isEmpty()) {
return new ArrayList<>();
} else {
return aggregatedScenarioOutcomes(allOutcomes);
}
}
private List aggregatedScenarioOutcomes(List allOutcomes) {
Map scenarioOutcomes = new HashMap();
for (TestOutcome testOutcome : allOutcomes) {
TestOutcome scenarioOutcome = scenarioOutcomeFor(baseMethodName(testOutcome), testOutcome, scenarioOutcomes);
recordTestOutcomeAsSteps(testOutcome, scenarioOutcome);
scenarioOutcome.setContext(testOutcome.getContext());
if (testOutcome.isManual()) {
scenarioOutcome = scenarioOutcome.setToManual();
}
if (testOutcome.isDataDriven()) {
scenarioOutcome.addDataFrom(testOutcome.getDataTable());
}
}
List aggregatedScenarioOutcomes = new ArrayList<>();
aggregatedScenarioOutcomes.addAll(scenarioOutcomes.values());
return aggregatedScenarioOutcomes;
}
private void recordTestOutcomeAsSteps(TestOutcome testOutcome, TestOutcome scenarioOutcome) {
final String name = alternativeMethodName(testOutcome);
TestStep nestedStep = TestStep.forStepCalled(name).withResult(testOutcome.getResult());
List testSteps = testOutcome.getTestSteps();
if (testOutcome.getTestFailureCause() != null) {
nestedStep.failedWith(testOutcome.getTestFailureCause().toException());
}
if (!testSteps.isEmpty()) {
for (TestStep nextStep : testSteps) {
nextStep.setDescription(normalizeTestStepDescription(nextStep.getDescription(),
scenarioOutcome.getTestSteps().size() + 1));
nestedStep.addChildStep(nextStep);
nestedStep.setDuration(nextStep.getDuration() + nestedStep.getDuration());
}
}
if (nestedStep.getDuration() == 0) {
nestedStep.setDuration(testOutcome.getDuration());
}
scenarioOutcome.recordStep(nestedStep);
}
private TestOutcome scenarioOutcomeFor(String normalizedMethodName, TestOutcome testOutcome, Map scenarioOutcomes) {
if (!scenarioOutcomes.containsKey(normalizedMethodName)) {
TestOutcome scenarioOutcome = createScenarioOutcome(testOutcome);
scenarioOutcomes.put(normalizedMethodName, scenarioOutcome);
}
return scenarioOutcomes.get(normalizedMethodName);
}
private TestResult overallResultFrom(List rows) {
List resultsOfEachRow = rows.stream()
.map(DataTableRow::getResult)
.collect(Collectors.toList());
return TestResultList.overallResultFrom(resultsOfEachRow);
}
private String normalizeTestStepDescription(String description, int index) {
return StringUtils.replace(description, "[1]", "[" + index + "]");
}
private TestOutcome createScenarioOutcome(TestOutcome parameterizedOutcome) {
TestOutcome testOutcome = TestOutcome.forTest(baseMethodName(parameterizedOutcome),
parameterizedOutcome.getTestCase());
return testOutcome;
}
private String baseMethodName(TestOutcome testOutcome) {
return testOutcome.getName().replaceAll("\\[\\d+\\]", "");
}
private String alternativeMethodName(TestOutcome testOutcome) {
Optional qualifier = testOutcome.getQualifier();
if (qualifier.isPresent()) {
return testOutcome.getTitle(false) + " " +
testOutcome.getQualifier().get();
} else {
return testOutcome.getTitle();
}
}
public List getTestOutcomesForAllParameterSets() {
List testOutcomes = new ArrayList<>();
for (Runner runner : serenityParameterizedRunner.getRunners()) {
for (TestOutcome testOutcome : ((SerenityRunner) runner).getTestOutcomes()) {
if (!testOutcomes.contains(testOutcome)) {
testOutcomes.add(testOutcome);
}
}
}
return testOutcomes;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy