Skip to content

Commit f264982

Browse files
dsankouskisankouski-dzmitryDzmitry Sankouski
authored
Enable ParallelSuiteTest (#2687)
* Enable ParallelSuiteTest Presumably, test was disabled to get rid of distraction during development and was forgotten. Test was broken and commented out temporary back in 2011 in cc950e9 commit, named `Temp commit`. Commit was introduced in `AllDynamic` branch Test is green both on the base commit of AllDynamic branch (10a202a) as well as on branch merge point (b251fce) Done: - Add test: child suite should obey threadCount parameter - Move private stuff to bottom, add more details in error message * Fix: setup parallel option for all suites, including child * Fix populateSuiteGraph method: add parent nodes, too Before this, populateSuiteGraph method was ignoring any suite runner with child suites. This leads to parallel suites not being executed with `randomize suite` option enabled The method now add all nodes, including parents into the graph. * Adjust expected results for suitesShouldRunInParallel4 This test implied a requirement to exclude duplicating suite files from run. For example, for suite graph like: suite-parallel-1.xml suite-parallel-2.xml suite-parallel-2-1.xml suite-parallel-2-2.xml | | | | ---------- ---------| v v v suite-parallel-2-2-1.xml suite-parallel-2-1.xml suite-parallel-2-2.xml | | v suite-parallel-2-2-1.xml a test expected 5 suites and 5 threads. However, this test was excluded from TestNG unit tests since 2011, and broken somewhere later on the timeline. Dropping mentioned requirement (i.e. leaving things as it is now), since there's no complains on current behaviour by adjusting test expected results, to 8 expected suites and 8 threads. * review fixes: - revert suite order - gradle autostyle apply - set parallel mode recursively Co-authored-by: sankouski-dzmitry <[email protected]> Co-authored-by: Dzmitry Sankouski <[email protected]>
1 parent 290532e commit f264982

File tree

9 files changed

+132
-55
lines changed

9 files changed

+132
-55
lines changed

testng-core/src/main/java/org/testng/TestNG.java

+15-9
Original file line numberDiff line numberDiff line change
@@ -344,12 +344,7 @@ private Collection<XmlSuite> parseSuite(String suitePath) {
344344
private Collection<XmlSuite> processCommandLineArgs(Collection<XmlSuite> allSuites) {
345345
Collection<XmlSuite> result = new ArrayList<>();
346346
for (XmlSuite s : allSuites) {
347-
if (this.m_parallelMode != null) {
348-
s.setParallel(this.m_parallelMode);
349-
}
350-
if (this.m_threadCount > 0) {
351-
s.setThreadCount(this.m_threadCount);
352-
}
347+
processParallelModeCommandLineArgs(s);
353348
if (m_testNames == null) {
354349
result.add(s);
355350
continue;
@@ -366,6 +361,18 @@ private Collection<XmlSuite> processCommandLineArgs(Collection<XmlSuite> allSuit
366361
return result;
367362
}
368363

364+
private void processParallelModeCommandLineArgs(XmlSuite suite) {
365+
if (this.m_parallelMode != null) {
366+
suite.setParallel(this.m_parallelMode);
367+
}
368+
if (this.m_threadCount > 0) {
369+
suite.setThreadCount(this.m_threadCount);
370+
}
371+
if (suite.getChildSuites() != null) {
372+
suite.getChildSuites().forEach(this::processParallelModeCommandLineArgs);
373+
}
374+
}
375+
369376
public void initializeSuitesAndJarFile() {
370377
// The IntelliJ plug-in might have invoked this method already so don't initialize suites twice.
371378
if (isSuiteInitialized) {
@@ -1256,9 +1263,8 @@ private void populateSuiteGraph(
12561263
SuiteRunnerMap suiteRunnerMap,
12571264
XmlSuite xmlSuite) {
12581265
ISuite parentSuiteRunner = suiteRunnerMap.get(xmlSuite);
1259-
if (xmlSuite.getChildSuites().isEmpty()) {
1260-
suiteGraph.addNode(parentSuiteRunner);
1261-
} else {
1266+
suiteGraph.addNode(parentSuiteRunner);
1267+
if (!xmlSuite.getChildSuites().isEmpty()) {
12621268
for (XmlSuite childSuite : xmlSuite.getChildSuites()) {
12631269
suiteGraph.addEdge(0, parentSuiteRunner, suiteRunnerMap.get(childSuite));
12641270
populateSuiteGraph(suiteGraph, suiteRunnerMap, childSuite);

testng-core/src/test/java/test/thread/ParallelSuiteTest.java

+101-41
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.testng.TestListenerAdapter;
1010
import org.testng.TestNG;
1111
import org.testng.annotations.Test;
12+
import org.testng.xml.XmlSuite;
1213
import test.SimpleBaseTest;
1314

1415
public class ParallelSuiteTest extends SimpleBaseTest {
@@ -21,12 +22,18 @@ public void suitesShouldRunInParallel1() {
2122
2,
2223
null,
2324
Arrays.asList(
24-
getPathToResource("suite-parallel-1.xml"), getPathToResource("suite-parallel-2.xml")));
25+
getPathToParallelResource("simple-suite-parallel-1.xml"),
26+
getPathToParallelResource("simple-suite-parallel-2.xml")));
2527
}
2628

2729
@Test
2830
public void suitesShouldRunInParallel2() {
29-
runTest(5, 3, 3, null, Collections.singletonList(getPathToResource("suite-parallel-0.xml")));
31+
runTest(
32+
5,
33+
3,
34+
3,
35+
null,
36+
Collections.singletonList(getPathToParallelResource("simple-suite-parallel-0.xml")));
3037
}
3138

3239
@Test(description = "Number of threads (2) is less than number of suites (3)")
@@ -35,54 +42,28 @@ public void suitesShouldRunInParallel3() {
3542
TestListenerAdapter tla = new TestListenerAdapter();
3643
TestNG tng = create();
3744
tng.setSuiteThreadPoolSize(SUITE_THREAD_POOL_SIZE);
38-
tng.setTestSuites(Collections.singletonList(getPathToResource("suite-parallel-0.xml")));
45+
tng.setTestSuites(
46+
Collections.singletonList(getPathToParallelResource("simple-suite-parallel-0.xml")));
3947
tng.addListener((ITestNGListener) tla);
4048

4149
BaseThreadTest.initThreadLog();
4250
tng.run(); // Shouldn't not deadlock
4351
Assert.assertEquals(BaseThreadTest.getThreadCount(), SUITE_THREAD_POOL_SIZE);
4452
}
4553

46-
private void runTest(
47-
int suiteThreadPoolSize,
48-
int expectedThreadCount,
49-
int expectedSuiteCount,
50-
Boolean randomizeSuites,
51-
List<String> paths) {
52-
TestListenerAdapter tla = new TestListenerAdapter();
53-
TestNG tng = create();
54-
tng.setSuiteThreadPoolSize(suiteThreadPoolSize);
55-
tng.setTestSuites(paths);
56-
tng.addListener((ITestNGListener) tla);
57-
if (null != randomizeSuites) {
58-
tng.setRandomizeSuites(randomizeSuites);
59-
}
60-
61-
BaseThreadTest.initThreadLog();
62-
tng.run();
63-
64-
Assert.assertEquals(
65-
BaseThreadTest.getThreadCount(),
66-
expectedThreadCount,
67-
"Thread count expected:"
68-
+ expectedThreadCount
69-
+ " actual:"
70-
+ BaseThreadTest.getThreadCount());
71-
Assert.assertEquals(BaseThreadTest.getSuitesMap().keySet().size(), expectedSuiteCount);
72-
}
73-
7454
@Test
7555
public void suitesShouldRunInParallel4() {
56+
final int TOTAL_SUITE_COUNT_INCLUDING_DUPLICATES = 8;
7657
runTest(
7758
10,
78-
5,
79-
5,
59+
TOTAL_SUITE_COUNT_INCLUDING_DUPLICATES,
60+
TOTAL_SUITE_COUNT_INCLUDING_DUPLICATES,
8061
null,
8162
Arrays.asList(
82-
getPathToResource("parallel-suites/suite-parallel-1.xml"),
83-
getPathToResource("parallel-suites/suite-parallel-2.xml"),
84-
getPathToResource("parallel-suites/suite-parallel-2-1.xml"),
85-
getPathToResource("parallel-suites/suite-parallel-2-2.xml")));
63+
getPathToParallelResource("suite-parallel-1.xml"),
64+
getPathToParallelResource("suite-parallel-2.xml"),
65+
getPathToParallelResource("suite-parallel-2-1.xml"),
66+
getPathToParallelResource("suite-parallel-2-2.xml")));
8667
}
8768

8869
@Test
@@ -92,7 +73,7 @@ public void suitesShouldRunInParallel5() {
9273
5,
9374
7,
9475
null,
95-
Collections.singletonList(getPathToResource("parallel-suites/suite-parallel-0.xml")));
76+
Collections.singletonList(getPathToParallelResource("suite-parallel-0.xml")));
9677
}
9778

9879
@Test(description = "Number of threads (2) is less than level of suites (3)")
@@ -102,7 +83,7 @@ public void suitesShouldRunInParallel6() {
10283
2,
10384
7,
10485
null,
105-
Collections.singletonList(getPathToResource("parallel-suites/suite-parallel-0.xml")));
86+
Collections.singletonList(getPathToParallelResource("suite-parallel-0.xml")));
10687
}
10788

10889
@Test(
@@ -112,7 +93,8 @@ public void suitesShouldRunInParallel6() {
11293
public void suitesShouldRunInOrder() {
11394
TestListenerAdapter tla = new TestListenerAdapter();
11495
TestNG tng = create();
115-
tng.setTestSuites(Collections.singletonList(getPathToResource("suite-parallel-0.xml")));
96+
tng.setTestSuites(
97+
Collections.singletonList(getPathToParallelResource("simple-suite-parallel-0.xml")));
11698
tng.addListener((ITestNGListener) tla);
11799
BaseThreadTest.initThreadLog();
118100
tng.run();
@@ -134,6 +116,84 @@ public void suitesShouldRunInOrder() {
134116

135117
@Test(description = "Number of threads (1) is less than number of levels of suites (2)")
136118
public void suitesShouldRun1() {
137-
runTest(1, 1, 3, true, Collections.singletonList(getPathToResource("suite-parallel-0.xml")));
119+
runTest(
120+
1,
121+
1,
122+
3,
123+
true,
124+
Collections.singletonList(getPathToParallelResource("simple-suite-parallel-0.xml")));
125+
}
126+
127+
@Test(description = "Child suite should obey threadCount parameter")
128+
public void childSuiteObeyParentThreadCount() {
129+
/* parent suite has no tests, so only child suite counts */
130+
final int EXPECTED_SUITE_COUNT = 1;
131+
runTest(
132+
1,
133+
2,
134+
XmlSuite.ParallelMode.CLASSES,
135+
2,
136+
EXPECTED_SUITE_COUNT,
137+
null,
138+
Arrays.asList(getPathToParallelResource("inherit-thread-count-parent.yaml")));
139+
}
140+
141+
private void runTest(
142+
int suiteThreadPoolSize,
143+
int expectedThreadCount,
144+
int expectedSuiteCount,
145+
Boolean randomizeSuites,
146+
List<String> paths) {
147+
runTest(
148+
suiteThreadPoolSize,
149+
null,
150+
null,
151+
expectedThreadCount,
152+
expectedSuiteCount,
153+
randomizeSuites,
154+
paths);
155+
}
156+
157+
private void runTest(
158+
int suiteThreadPoolSize,
159+
Integer threadCount,
160+
XmlSuite.ParallelMode parallelMode,
161+
int expectedThreadCount,
162+
int expectedSuiteCount,
163+
Boolean randomizeSuites,
164+
List<String> paths) {
165+
TestListenerAdapter tla = new TestListenerAdapter();
166+
TestNG tng = create();
167+
tng.setSuiteThreadPoolSize(suiteThreadPoolSize);
168+
if (threadCount != null) {
169+
tng.setThreadCount(threadCount);
170+
}
171+
if (parallelMode != null) {
172+
tng.setParallel(parallelMode);
173+
}
174+
tng.setTestSuites(paths);
175+
tng.addListener((ITestNGListener) tla);
176+
if (null != randomizeSuites) {
177+
tng.setRandomizeSuites(randomizeSuites);
178+
}
179+
180+
BaseThreadTest.initThreadLog();
181+
tng.run();
182+
183+
Assert.assertEquals(
184+
BaseThreadTest.getThreadCount(),
185+
expectedThreadCount,
186+
"Thread count expected:"
187+
+ expectedThreadCount
188+
+ " actual:"
189+
+ BaseThreadTest.getThreadCount());
190+
Assert.assertEquals(
191+
BaseThreadTest.getSuitesMap().keySet().size(),
192+
expectedSuiteCount,
193+
"Suite count is incorrect");
194+
}
195+
196+
private static String getPathToParallelResource(String resourceName) {
197+
return getPathToResource(String.format("parallel-suites/%s", resourceName));
138198
}
139199
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
name: Child suite
2+
3+
tests:
4+
- name: Tests
5+
classes:
6+
- test.thread.Sample2
7+
- test.thread.Sample1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
name: Parent suite
2+
3+
suiteFiles:
4+
- ./inherit-thread-count-child.yaml
5+

testng-core/src/test/resources/suite-parallel-0.xml renamed to testng-core/src/test/resources/parallel-suites/simple-suite-parallel-0.xml

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
<suite name="Suite Parallel 0">
44

55
<suite-files>
6-
<suite-file path="./suite-parallel-1.xml" />
7-
<suite-file path="./suite-parallel-2.xml" />
6+
<suite-file path="simple-suite-parallel-1.xml" />
7+
<suite-file path="simple-suite-parallel-2.xml" />
88
</suite-files>
99

1010
<test name="Test0">
1111
<classes>
1212
<class name="test.thread.Sample2"/>
1313
</classes>
1414
</test>
15-
</suite>
15+
</suite>

testng-core/src/test/resources/testng.xml

-2
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,7 @@
109109
<class name="test.github765.ExcludeSyntheticMethodsFromTemplateCallsTest"/>
110110
<class name="test.github1405.TestExclusionOfMainMethod"/>
111111
<class name="test.cli.github1517.ExitCodeListenerBehaviorTest"/>
112-
<!--
113112
<class name="test.thread.ParallelSuiteTest"/>
114-
-->
115113
<class name="test.simple.IncludedExcludedTest" />
116114
<class name="test.reports.ReportTest" />
117115
<class name="test.reports.XmlReporterTest"/>

testng-core/src/test/resources/testng.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ tests:
5050
- test.thread.ThreadPoolSizeTest
5151
- test.thread.SequentialTest
5252
- test.thread.ParallelTestTest
53+
- test.thread.ParallelSuiteTest
5354
- test.thread.FactoryTest
5455
- test.thread.DataProviderThreadPoolSizeTest
5556
- test.thread.MultiThreadedDependentTest

0 commit comments

Comments
 (0)