Skip to content

Commit ed837de

Browse files
authored
fix(allure-karate): add history id (fixes #938, via #1018)
1 parent 5591a12 commit ed837de

File tree

2 files changed

+49
-22
lines changed

2 files changed

+49
-22
lines changed

allure-karate/src/main/java/io/qameta/allure/karate/AllureKarate.java

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import static io.qameta.allure.util.ResultsUtils.createLabel;
5858
import static io.qameta.allure.util.ResultsUtils.createLink;
5959
import static io.qameta.allure.util.ResultsUtils.createParameter;
60+
import static io.qameta.allure.util.ResultsUtils.md5;
6061

6162
/**
6263
* @author charlie (Dmitry Baev).
@@ -89,19 +90,22 @@ public AllureKarate(final AllureLifecycle lifecycle) {
8990
public boolean beforeScenario(final ScenarioRuntime sr) {
9091
final Feature feature = sr.featureRuntime.result.getFeature();
9192
final String featureName = feature.getName();
92-
final String featureNameQualified = feature.getPackageQualifiedName();
93+
final String featureNameQualified = feature.getResource().getRelativePath();
9394
final Scenario scenario = sr.scenario;
94-
final String scenarioName = scenario.getName();
9595

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

99+
final String nameOrLine = getName(scenario, String.valueOf(scenario.getLine()));
100+
final String testCaseId = md5(String.format("%s:%s", featureNameQualified, nameOrLine));
101+
final String fullName = String.format("%s:%d", featureNameQualified, scenario.getLine());
99102
final TestResult result = new TestResult()
100103
.setUuid(uuid)
101-
.setFullName(String.format("%s | %s", featureNameQualified, scenarioName))
102-
.setName(scenarioName)
104+
.setFullName(fullName)
105+
.setName(getName(scenario, fullName))
103106
.setDescription(scenario.getDescription())
104-
.setTestCaseId(scenario.getUniqueId())
107+
.setTestCaseId(testCaseId)
108+
.setHistoryId(md5(scenario.getUniqueId()))
105109
.setStage(Stage.RUNNING);
106110

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

126+
private static String getName(final Scenario scenario, final String defaultValue) {
127+
if (Objects.isNull(scenario.getName())) {
128+
return defaultValue;
129+
}
130+
final boolean blank = scenario.getName().chars()
131+
.allMatch(Character::isWhitespace);
132+
return blank ? defaultValue : scenario.getName().trim();
133+
}
134+
122135
@Override
123136
public void afterScenario(final ScenarioRuntime sr) {
124137
final String uuid = (String) sr.magicVariables.get(ALLURE_UUID);
@@ -131,9 +144,9 @@ public void afterScenario(final ScenarioRuntime sr) {
131144
final Status status = !sr.isFailed()
132145
? Status.PASSED
133146
: maybeResult
134-
.map(ScenarioResult::getError)
135-
.flatMap(ResultsUtils::getStatus)
136-
.orElse(null);
147+
.map(ScenarioResult::getError)
148+
.flatMap(ResultsUtils::getStatus)
149+
.orElse(null);
137150

138151
final StatusDetails statusDetails = maybeResult
139152
.map(ScenarioResult::getError)
@@ -193,9 +206,9 @@ public void afterStep(final StepResult result,
193206
final Status status = !stepResult.isFailed()
194207
? Status.PASSED
195208
: Optional.of(stepResult)
196-
.map(Result::getError)
197-
.flatMap(ResultsUtils::getStatus)
198-
.orElse(null);
209+
.map(Result::getError)
210+
.flatMap(ResultsUtils::getStatus)
211+
.orElse(null);
199212

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

211224
if (stepResult.isFailed()
212-
&& sr.engine.getConfig().getDriverOptions() != null
213-
&& (Boolean) sr.engine.getConfig().getDriverOptions().get("screenshotOnFailure")
225+
&& sr.engine.getConfig().getDriverOptions() != null
226+
&& (Boolean) sr.engine.getConfig().getDriverOptions().get("screenshotOnFailure")
214227
) {
215228
addToStepsAndTcUuids(uuid, lifecycle.getCurrentTestCase().get());
216229
addToStepAndUuids(uuid, step);

allure-karate/src/test/java/io/qameta/allure/karate/AllureKarateTest.java

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
import static io.qameta.allure.model.Status.BROKEN;
3030
import static io.qameta.allure.model.Status.PASSED;
31+
import static io.qameta.allure.util.ResultsUtils.md5;
3132
import static org.assertj.core.api.Assertions.assertThat;
3233
import static org.assertj.core.api.Assertions.tuple;
3334

@@ -46,11 +47,11 @@ void shouldCreateNameAndFullName() {
4647
.containsExactlyInAnyOrder(
4748
tuple(
4849
"Some api* request # comment 1",
49-
"testdata.description-and-name | Some api* request # comment 1"
50+
"testdata/description-and-name.feature:3"
5051
),
5152
tuple(
52-
"",
53-
"testdata.description-and-name | "
53+
"testdata/description-and-name.feature:8",
54+
"testdata/description-and-name.feature:8"
5455
)
5556
);
5657
}
@@ -135,8 +136,8 @@ void shouldCreateTestCaseIdAndName() {
135136
assertThat(results.getTestResults())
136137
.extracting(TestResult::getTestCaseId, TestResult::getTestCaseName)
137138
.containsExactlyInAnyOrder(
138-
tuple("testdata.description-and-name_1", null),
139-
tuple("testdata.description-and-name_2", null)
139+
tuple(md5("testdata/description-and-name.feature:Some api* request # comment 1"), null),
140+
tuple(md5("testdata/description-and-name.feature:8"), null)
140141
);
141142
}
142143

@@ -147,9 +148,9 @@ void shouldCreateTestCaseIdAndNamesOfParametrizedTest() {
147148
assertThat(results.getTestResults())
148149
.extracting(TestResult::getName, TestResult::getTestCaseId)
149150
.containsExactlyInAnyOrder(
150-
tuple("/login should return 200", "testdata.parametrized-test_1_1"),
151-
tuple("/user should return 301", "testdata.parametrized-test_1_2"),
152-
tuple("/pages should return 404", "testdata.parametrized-test_1_3")
151+
tuple("/login should return 200", md5("testdata/parametrized-test.feature:/login should return 200")),
152+
tuple("/user should return 301", md5("testdata/parametrized-test.feature:/user should return 301")),
153+
tuple("/pages should return 404", md5("testdata/parametrized-test.feature:/pages should return 404"))
153154
);
154155
}
155156

@@ -164,7 +165,20 @@ void shouldCreateParamsForParametrizedTest() {
164165
.containsExactlyInAnyOrder(
165166
tuple("path", "login"),
166167
tuple("status", "200")
167-
);
168+
);
169+
}
170+
171+
@Test
172+
void shouldCreateHistoryIdAndNamesOfParametrizedTest() {
173+
final AllureResults results = runApi("classpath:testdata/parametrized-test.feature");
174+
175+
assertThat(results.getTestResults())
176+
.extracting(TestResult::getName, TestResult::getHistoryId)
177+
.containsExactlyInAnyOrder(
178+
tuple("/login should return 200", md5("testdata.parametrized-test_1_1")),
179+
tuple("/user should return 301", md5("testdata.parametrized-test_1_2")),
180+
tuple("/pages should return 404", md5("testdata.parametrized-test_1_3"))
181+
);
168182
}
169183

170184
@Test

0 commit comments

Comments
 (0)