Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 95a629f

Browse filesBrowse files
authored
fix class fixtures (fixes allure-framework#99, via allure-framework#100)
1 parent b7e419d commit 95a629f
Copy full SHA for 95a629f

13 files changed

+258-44Lines changed: 258 additions & 44 deletions

File tree

Expand file treeCollapse file tree
Open diff view settings
Filter options
Expand file treeCollapse file tree
Open diff view settings
Collapse file

‎allure-testng/src/main/java/io/qameta/allure/testng/AllureTestNg.java‎

Copy file name to clipboardExpand all lines: allure-testng/src/main/java/io/qameta/allure/testng/AllureTestNg.java
+53-4Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,11 @@
4242
import java.util.ArrayList;
4343
import java.util.Arrays;
4444
import java.util.List;
45+
import java.util.Map;
4546
import java.util.Objects;
4647
import java.util.Optional;
4748
import java.util.UUID;
49+
import java.util.concurrent.ConcurrentHashMap;
4850
import java.util.function.Consumer;
4951
import java.util.function.Function;
5052
import java.util.stream.Collectors;
@@ -90,6 +92,11 @@ public class AllureTestNg implements ISuiteListener, ITestListener, IInvokedMeth
9092
private final ThreadLocal<String> currentExecutable
9193
= InheritableThreadLocal.withInitial(() -> UUID.randomUUID().toString());
9294

95+
/**
96+
* Store uuid for class test containers.
97+
*/
98+
private final Map<ITestClass, String> classContainerUuidStorage = new ConcurrentHashMap<>();
99+
93100
private final AllureLifecycle lifecycle;
94101

95102
public AllureTestNg(final AllureLifecycle lifecycle) {
@@ -122,23 +129,53 @@ public void onStart(final ITestContext context) {
122129
.withName(context.getName())
123130
.withStart(System.currentTimeMillis());
124131
getLifecycle().startTestContainer(parentUuid, container);
132+
133+
Stream.of(context.getAllTestMethods())
134+
.map(ITestNGMethod::getTestClass)
135+
.distinct()
136+
.forEach(this::onBeforeClass);
125137
}
126138

127139
@Override
128140
public void onFinish(final ISuite suite) {
129141
final String uuid = getUniqueUuid(suite);
130142
getLifecycle().stopTestContainer(uuid);
131143
getLifecycle().writeTestContainer(uuid);
144+
132145
}
133146

134147
@Override
135148
public void onFinish(final ITestContext context) {
136149
final String uuid = getUniqueUuid(context);
137150
getLifecycle().stopTestContainer(uuid);
138151
getLifecycle().writeTestContainer(uuid);
152+
153+
Stream.of(context.getAllTestMethods())
154+
.map(ITestNGMethod::getTestClass)
155+
.distinct()
156+
.forEach(this::onAfterClass);
157+
}
158+
159+
public void onBeforeClass(final ITestClass testClass) {
160+
final String uuid = UUID.randomUUID().toString();
161+
final TestResultContainer container = new TestResultContainer()
162+
.withUuid(uuid)
163+
.withName(testClass.getName());
164+
getLifecycle().startTestContainer(container);
165+
classContainerUuidStorage.put(testClass, uuid);
166+
}
167+
168+
public void onAfterClass(final ITestClass testClass) {
169+
if (!classContainerUuidStorage.containsKey(testClass)) {
170+
return;
171+
}
172+
final String uuid = classContainerUuidStorage.get(testClass);
173+
getLifecycle().stopTestContainer(uuid);
174+
getLifecycle().writeTestContainer(uuid);
139175
}
140176

141177
@Override
178+
@SuppressWarnings({"Indentation", "PMD.ExcessiveMethodLength"})
142179
public void onTestStart(final ITestResult testResult) {
143180
Current current = currentTestResult.get();
144181
if (current.isStarted()) {
@@ -183,6 +220,16 @@ public void onTestStart(final ITestResult testResult) {
183220
processDescription(getClass().getClassLoader(), method.getConstructorOrMethod().getMethod(), result);
184221
getLifecycle().scheduleTestCase(parentUuid, result);
185222
getLifecycle().startTestCase(current.getUuid());
223+
224+
final String uuid = current.getUuid();
225+
Optional.of(testResult)
226+
.map(ITestResult::getMethod)
227+
.map(ITestNGMethod::getTestClass)
228+
.map(classContainerUuidStorage::get)
229+
.ifPresent(testClassContainerUuid -> getLifecycle().updateTestContainer(
230+
testClassContainerUuid,
231+
container -> container.getChildren().add(uuid)
232+
));
186233
}
187234

188235
@Override
@@ -258,7 +305,7 @@ public void beforeInvocation(final IInvokedMethod method, final ITestResult test
258305
if (isSupportedConfigurationFixture(testMethod)) {
259306
ifSuiteFixtureStarted(context.getSuite(), testMethod);
260307
ifTestFixtureStarted(context, testMethod);
261-
ifClassFixtureStarted(context, testMethod);
308+
ifClassFixtureStarted(testMethod);
262309
ifMethodFixtureStarted(testMethod);
263310
}
264311
}
@@ -272,12 +319,14 @@ private void ifSuiteFixtureStarted(final ISuite suite, final ITestNGMethod testM
272319
}
273320
}
274321

275-
private void ifClassFixtureStarted(final ITestContext context, final ITestNGMethod testMethod) {
322+
private void ifClassFixtureStarted(final ITestNGMethod testMethod) {
276323
if (testMethod.isBeforeClassConfiguration()) {
277-
startBefore(getUniqueUuid(context), testMethod);
324+
final String parentUuid = classContainerUuidStorage.get(testMethod.getTestClass());
325+
startBefore(parentUuid, testMethod);
278326
}
279327
if (testMethod.isAfterClassConfiguration()) {
280-
startAfter(getUniqueUuid(context), testMethod);
328+
final String parentUuid = classContainerUuidStorage.get(testMethod.getTestClass());
329+
startAfter(parentUuid, testMethod);
281330
}
282331
}
283332

Collapse file

‎…lure/testng/FeatureCombinationsTest.java‎ ‎…meta/allure/testng/AllureTestNgTest.java‎allure-testng/src/test/java/io/qameta/allure/testng/FeatureCombinationsTest.java renamed to allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java allure-testng/src/test/java/io/qameta/allure/testng/FeatureCombinationsTest.java renamed to allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java

Copy file name to clipboardExpand all lines: allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java
+86-30Lines changed: 86 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
* @author Egor Borisov ehborisov@gmail.com
4040
*/
4141
@Test
42-
public class FeatureCombinationsTest {
42+
public class AllureTestNgTest {
4343

4444
private static final Condition<List<? extends ExecutableItem>> ALL_FINISHED = new Condition<>(items ->
4545
items.stream().allMatch(item -> item.getStage() == Stage.FINISHED),
@@ -80,7 +80,7 @@ public void parallelDataProvider() {
8080
List<TestResult> testResult = results.getTestResults();
8181
List<TestResultContainer> containers = results.getTestContainers();
8282
assertThat(testResult).as("Not all testng case results have been written").hasSize(2000);
83-
assertThat(containers).as("Not all testng containers have been written").hasSize(2);
83+
assertThat(containers).as("Not all testng containers have been written").hasSize(3);
8484
}
8585

8686
@Test(description = "Singe testng")
@@ -175,8 +175,6 @@ public void perSuiteFixtures() {
175175

176176
assertThat(testResult).as("Unexpected quantity of testng case results has been written").hasSize(1);
177177
List<String> testUuid = singletonList(testResult.get(0).getUuid());
178-
assertThat(testContainers).as("Unexpected quantity of testng containers has been written")
179-
.hasSize(2);
180178

181179
assertContainersChildren(testTagName, testContainers, testUuid);
182180
assertContainersChildren(suiteName, testContainers, getUidsByName(testContainers, testTagName));
@@ -186,26 +184,27 @@ public void perSuiteFixtures() {
186184

187185
@Test(description = "Class fixtures")
188186
public void perClassFixtures() {
189-
String suiteName = "Test suite 11";
190-
String testTagName = "Test tag 11";
191-
String beforeClass = "beforeClass";
192-
String afterClass = "afterClass";
193-
194187
runTestNgSuites("suites/per-class-fixtures-combination.xml");
188+
assertThat(results.getTestResults())
189+
.extracting(TestResult::getName)
190+
.containsExactlyInAnyOrder("test1", "test2");
195191

196-
List<TestResult> testResults = results.getTestResults();
197-
List<TestResultContainer> testContainers = results.getTestContainers();
198-
199-
assertThat(testResults).as("Unexpected quantity of testng case results has been written").hasSize(2);
200-
assertThat(testContainers).as("Unexpected quantity of testng containers has been written").hasSize(2);
192+
assertThat(results.getTestContainers())
193+
.flatExtracting(TestResultContainer::getBefores)
194+
.extracting(FixtureResult::getName)
195+
.containsExactlyInAnyOrder("beforeClass");
201196

202-
List<String> uuids = testResults.stream().map(TestResult::getUuid).collect(Collectors.toList());
197+
assertThat(results.getTestContainers())
198+
.flatExtracting(TestResultContainer::getAfters)
199+
.extracting(FixtureResult::getName)
200+
.containsExactlyInAnyOrder("afterClass");
203201

204-
assertContainersChildren(testTagName, testContainers, uuids);
205-
assertContainersChildren(suiteName, testContainers, getUidsByName(testContainers, testTagName));
202+
final TestResult test1 = findTestResultByName("test1");
203+
final TestResult test2 = findTestResultByName("test2");
206204

207-
assertBeforeFixtures(testTagName, testContainers, beforeClass);
208-
assertAfterFixtures(testTagName, testContainers, afterClass);
205+
assertThat(results.getTestContainers())
206+
.flatExtracting(TestResultContainer::getChildren)
207+
.contains(test1.getUuid(), test2.getUuid());
209208
}
210209

211210
@Test(description = "Method fixtures")
@@ -224,8 +223,6 @@ public void perMethodFixtures() {
224223

225224
assertThat(testResults).as("Unexpected quantity of testng case results has been written").hasSize(2);
226225
List<String> uuids = testResults.stream().map(TestResult::getUuid).collect(Collectors.toList());
227-
assertThat(testContainers).as("Unexpected quantity of testng containers has been written")
228-
.hasSize(10);
229226

230227
assertContainersChildren(testTagName, testContainers, uuids);
231228
assertContainersChildren(suiteName, testContainers, getUidsByName(testContainers, testTagName));
@@ -251,8 +248,6 @@ public void perTestTagFixtures() {
251248

252249
assertThat(testResult).as("Unexpected quantity of testng case results has been written").hasSize(1);
253250
List<String> testUuid = singletonList(testResult.get(0).getUuid());
254-
assertThat(testContainers).as("Unexpected quantity of testng containers has been written")
255-
.hasSize(2);
256251

257252
assertContainersChildren(testTagName, testContainers, testUuid);
258253
assertContainersChildren(suiteName, testContainers, getUidsByName(testContainers, testTagName));
@@ -272,9 +267,9 @@ public void skippedSuiteTest() {
272267
assertThat(testResults).as("Unexpected quantity of testng case results has been written")
273268
.hasSize(2)
274269
.flatExtracting(TestResult::getStatus).contains(Status.SKIPPED, Status.SKIPPED);
275-
assertThat(testContainers).as("Unexpected quantity of testng containers has been written").hasSize(2);
270+
assertThat(testContainers).as("Unexpected quantity of testng containers has been written").hasSize(4);
276271

277-
assertThat(testContainers.get(1).getBefores())
272+
assertThat(findTestContainerByName("Test suite 8").getBefores())
278273
.as("Before suite container should have a before method with one step")
279274
.hasSize(1)
280275
.flatExtracting(FixtureResult::getSteps)
@@ -300,7 +295,7 @@ public void multipleSuites() {
300295
.hasSize(3);
301296
List<String> uids = testResults.stream().map(TestResult::getUuid).collect(Collectors.toList());
302297
assertThat(testContainers).as("Unexpected quantity of testng containers has been written")
303-
.hasSize(6).extracting(TestResultContainer::getName)
298+
.hasSize(8).extracting(TestResultContainer::getName)
304299
.contains(beforeMethodName, beforeMethodName, firstTagName, firstSuiteName, secondTagName,
305300
secondSuiteName);
306301

@@ -343,7 +338,7 @@ public void parallelMethods() {
343338
assertThat(testResults).as("Unexpected quantity of testng case results has been written")
344339
.hasSize(2001);
345340
assertThat(testContainers).as("Unexpected quantity of testng containers has been written")
346-
.hasSize(6005);
341+
.hasSize(6006);
347342

348343
assertContainersPerMethod(before1, testContainers, uids);
349344
assertContainersPerMethod(before2, testContainers, uids);
@@ -366,8 +361,6 @@ public void nestedSteps() {
366361
List<TestResultContainer> containers = results.getTestContainers();
367362
assertThat(testResults).as("Unexpected quantity of testng case results has been written")
368363
.hasSize(1);
369-
assertThat(containers).as("Unexpected quantity of testng containers has been written")
370-
.hasSize(3);
371364

372365
assertThat(containers)
373366
.filteredOn("name", beforeMethod)
@@ -574,7 +567,6 @@ public void shouldSetCorrectStatusesForFixtures() throws Exception {
574567

575568
assertThat(results.getTestContainers())
576569
.flatExtracting(TestResultContainer::getAfters)
577-
.hasSize(9)
578570
.extracting(FixtureResult::getName, FixtureResult::getStatus)
579571
.containsExactlyInAnyOrder(
580572
Tuple.tuple("afterSuite1", Status.PASSED),
@@ -643,6 +635,70 @@ public void shouldProcessVarargsParameters() throws Exception {
643635
);
644636
}
645637

638+
@Issue("99")
639+
@Test
640+
public void shouldAttachClassFixturesCorrectly() throws Exception {
641+
runTestNgSuites("suites/gh-99.xml");
642+
643+
assertThat(results.getTestResults())
644+
.flatExtracting(TestResult::getName)
645+
.containsExactlyInAnyOrder(
646+
"classFixtures1", "classFixtures2",
647+
"classFixtures3", "classFixturesInParent"
648+
);
649+
650+
assertThat(results.getTestContainers())
651+
.extracting(TestResultContainer::getName)
652+
.contains(
653+
"io.qameta.allure.testng.samples.ClassFixtures1",
654+
"io.qameta.allure.testng.samples.ClassFixtures2",
655+
"io.qameta.allure.testng.samples.ClassFixtures3",
656+
"io.qameta.allure.testng.samples.ClassFixturesInParent"
657+
);
658+
659+
660+
final TestResult classFixtures1 = findTestResultByName("classFixtures1");
661+
final TestResultContainer c1 = findTestContainerByName("io.qameta.allure.testng.samples.ClassFixtures1");
662+
663+
assertThat(c1.getChildren())
664+
.containsExactlyInAnyOrder(classFixtures1.getUuid());
665+
666+
final TestResult classFixtures2 = findTestResultByName("classFixtures2");
667+
final TestResultContainer c2 = findTestContainerByName("io.qameta.allure.testng.samples.ClassFixtures2");
668+
669+
assertThat(c2.getChildren())
670+
.containsExactlyInAnyOrder(classFixtures2.getUuid());
671+
672+
final TestResult classFixtures3 = findTestResultByName("classFixtures3");
673+
674+
final TestResultContainer c3 = findTestContainerByName("io.qameta.allure.testng.samples.ClassFixtures3");
675+
676+
assertThat(c3.getChildren())
677+
.containsExactlyInAnyOrder(classFixtures3.getUuid());
678+
679+
final TestResult classFixturesInParent = findTestResultByName("classFixturesInParent");
680+
final TestResultContainer c4 = findTestContainerByName("io.qameta.allure.testng.samples.ClassFixturesInParent");
681+
682+
assertThat(c4.getChildren())
683+
.containsExactlyInAnyOrder(classFixturesInParent.getUuid());
684+
685+
686+
}
687+
688+
private TestResult findTestResultByName(final String name) {
689+
return results.getTestResults().stream()
690+
.filter(testResult -> name.equalsIgnoreCase(testResult.getName()))
691+
.findFirst()
692+
.orElseThrow(() -> new IllegalStateException("can not find result by name " + name));
693+
}
694+
695+
private TestResultContainer findTestContainerByName(final String name) {
696+
return results.getTestContainers().stream()
697+
.filter(testResultContainer -> name.equalsIgnoreCase(testResultContainer.getName()))
698+
.findFirst()
699+
.orElseThrow(() -> new IllegalStateException("can not find container by name " + name));
700+
}
701+
646702
private Predicate<TestResult> hasLinks() {
647703
return testResult -> !testResult.getLinks().isEmpty();
648704
}
Collapse file
+24Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package io.qameta.allure.testng.samples;
2+
3+
import org.testng.annotations.AfterClass;
4+
import org.testng.annotations.BeforeClass;
5+
import org.testng.annotations.Test;
6+
7+
/**
8+
* @author charlie (Dmitry Baev).
9+
*/
10+
public class ClassFixtures1 {
11+
12+
@BeforeClass
13+
public void beforeClass1() throws Exception {
14+
}
15+
16+
@Test
17+
public void classFixtures1() throws Exception {
18+
}
19+
20+
@AfterClass
21+
public void afterClass1() throws Exception {
22+
23+
}
24+
}
Collapse file
+24Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package io.qameta.allure.testng.samples;
2+
3+
import org.testng.annotations.AfterClass;
4+
import org.testng.annotations.BeforeClass;
5+
import org.testng.annotations.Test;
6+
7+
/**
8+
* @author charlie (Dmitry Baev).
9+
*/
10+
public class ClassFixtures2 {
11+
12+
@BeforeClass
13+
public void beforeClass2() throws Exception {
14+
}
15+
16+
@Test
17+
public void classFixtures2() throws Exception {
18+
}
19+
20+
@AfterClass
21+
public void afterClass2() throws Exception {
22+
23+
}
24+
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.