Skip to content

Commit

Permalink
fix(allure-karate): add history id (fixes #938, via #1018)
Browse files Browse the repository at this point in the history
  • Loading branch information
baev committed Mar 18, 2024
1 parent 5591a12 commit ed837de
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
import static io.qameta.allure.util.ResultsUtils.createLabel;
import static io.qameta.allure.util.ResultsUtils.createLink;
import static io.qameta.allure.util.ResultsUtils.createParameter;
import static io.qameta.allure.util.ResultsUtils.md5;

/**
* @author charlie (Dmitry Baev).
Expand Down Expand Up @@ -89,19 +90,22 @@ public AllureKarate(final AllureLifecycle lifecycle) {
public boolean beforeScenario(final ScenarioRuntime sr) {
final Feature feature = sr.featureRuntime.result.getFeature();
final String featureName = feature.getName();
final String featureNameQualified = feature.getPackageQualifiedName();
final String featureNameQualified = feature.getResource().getRelativePath();
final Scenario scenario = sr.scenario;
final String scenarioName = scenario.getName();

final String uuid = UUID.randomUUID().toString();
sr.magicVariables.put(ALLURE_UUID, uuid);

final String nameOrLine = getName(scenario, String.valueOf(scenario.getLine()));
final String testCaseId = md5(String.format("%s:%s", featureNameQualified, nameOrLine));
final String fullName = String.format("%s:%d", featureNameQualified, scenario.getLine());
final TestResult result = new TestResult()
.setUuid(uuid)
.setFullName(String.format("%s | %s", featureNameQualified, scenarioName))
.setName(scenarioName)
.setFullName(fullName)
.setName(getName(scenario, fullName))
.setDescription(scenario.getDescription())
.setTestCaseId(scenario.getUniqueId())
.setTestCaseId(testCaseId)
.setHistoryId(md5(scenario.getUniqueId()))
.setStage(Stage.RUNNING);

final List<String> labels = sr.tags.getTags();
Expand All @@ -119,6 +123,15 @@ public boolean beforeScenario(final ScenarioRuntime sr) {
return true;
}

private static String getName(final Scenario scenario, final String defaultValue) {
if (Objects.isNull(scenario.getName())) {
return defaultValue;
}
final boolean blank = scenario.getName().chars()
.allMatch(Character::isWhitespace);
return blank ? defaultValue : scenario.getName().trim();
}

@Override
public void afterScenario(final ScenarioRuntime sr) {
final String uuid = (String) sr.magicVariables.get(ALLURE_UUID);
Expand All @@ -131,9 +144,9 @@ public void afterScenario(final ScenarioRuntime sr) {
final Status status = !sr.isFailed()
? Status.PASSED
: maybeResult
.map(ScenarioResult::getError)
.flatMap(ResultsUtils::getStatus)
.orElse(null);
.map(ScenarioResult::getError)
.flatMap(ResultsUtils::getStatus)
.orElse(null);

final StatusDetails statusDetails = maybeResult
.map(ScenarioResult::getError)
Expand Down Expand Up @@ -193,9 +206,9 @@ public void afterStep(final StepResult result,
final Status status = !stepResult.isFailed()
? Status.PASSED
: Optional.of(stepResult)
.map(Result::getError)
.flatMap(ResultsUtils::getStatus)
.orElse(null);
.map(Result::getError)
.flatMap(ResultsUtils::getStatus)
.orElse(null);

final StatusDetails statusDetails = Optional.of(stepResult)
.map(Result::getError)
Expand All @@ -209,8 +222,8 @@ public void afterStep(final StepResult result,
lifecycle.stopStep(uuid);

if (stepResult.isFailed()
&& sr.engine.getConfig().getDriverOptions() != null
&& (Boolean) sr.engine.getConfig().getDriverOptions().get("screenshotOnFailure")
&& sr.engine.getConfig().getDriverOptions() != null
&& (Boolean) sr.engine.getConfig().getDriverOptions().get("screenshotOnFailure")
) {
addToStepsAndTcUuids(uuid, lifecycle.getCurrentTestCase().get());
addToStepAndUuids(uuid, step);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

import static io.qameta.allure.model.Status.BROKEN;
import static io.qameta.allure.model.Status.PASSED;
import static io.qameta.allure.util.ResultsUtils.md5;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.tuple;

Expand All @@ -46,11 +47,11 @@ void shouldCreateNameAndFullName() {
.containsExactlyInAnyOrder(
tuple(
"Some api* request # comment 1",
"testdata.description-and-name | Some api* request # comment 1"
"testdata/description-and-name.feature:3"
),
tuple(
"",
"testdata.description-and-name | "
"testdata/description-and-name.feature:8",
"testdata/description-and-name.feature:8"
)
);
}
Expand Down Expand Up @@ -135,8 +136,8 @@ void shouldCreateTestCaseIdAndName() {
assertThat(results.getTestResults())
.extracting(TestResult::getTestCaseId, TestResult::getTestCaseName)
.containsExactlyInAnyOrder(
tuple("testdata.description-and-name_1", null),
tuple("testdata.description-and-name_2", null)
tuple(md5("testdata/description-and-name.feature:Some api* request # comment 1"), null),
tuple(md5("testdata/description-and-name.feature:8"), null)
);
}

Expand All @@ -147,9 +148,9 @@ void shouldCreateTestCaseIdAndNamesOfParametrizedTest() {
assertThat(results.getTestResults())
.extracting(TestResult::getName, TestResult::getTestCaseId)
.containsExactlyInAnyOrder(
tuple("/login should return 200", "testdata.parametrized-test_1_1"),
tuple("/user should return 301", "testdata.parametrized-test_1_2"),
tuple("/pages should return 404", "testdata.parametrized-test_1_3")
tuple("/login should return 200", md5("testdata/parametrized-test.feature:/login should return 200")),
tuple("/user should return 301", md5("testdata/parametrized-test.feature:/user should return 301")),
tuple("/pages should return 404", md5("testdata/parametrized-test.feature:/pages should return 404"))
);
}

Expand All @@ -164,7 +165,20 @@ void shouldCreateParamsForParametrizedTest() {
.containsExactlyInAnyOrder(
tuple("path", "login"),
tuple("status", "200")
);
);
}

@Test
void shouldCreateHistoryIdAndNamesOfParametrizedTest() {
final AllureResults results = runApi("classpath:testdata/parametrized-test.feature");

assertThat(results.getTestResults())
.extracting(TestResult::getName, TestResult::getHistoryId)
.containsExactlyInAnyOrder(
tuple("/login should return 200", md5("testdata.parametrized-test_1_1")),
tuple("/user should return 301", md5("testdata.parametrized-test_1_2")),
tuple("/pages should return 404", md5("testdata.parametrized-test_1_3"))
);
}

@Test
Expand Down

0 comments on commit ed837de

Please sign in to comment.