Skip to content

Commit 70ca872

Browse files
authored
Merge pull request #191 from marklogic-community/feature/553-select-suites
DEVEXP-553 New TestManager methods for selecting tests to run
2 parents 0c180b2 + b4a0285 commit 70ca872

File tree

5 files changed

+191
-53
lines changed

5 files changed

+191
-53
lines changed

marklogic-unit-test-client/src/main/java/com/marklogic/test/unit/TestManager.java

Lines changed: 116 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
import java.util.ArrayList;
1010
import java.util.List;
11+
import java.util.stream.Collectors;
12+
import java.util.stream.Stream;
1113

1214
/**
1315
* Provides methods for talking to the marklogic-unit-test REST extension.
@@ -81,12 +83,13 @@ public TestSuiteResult run(TestModule testModule) {
8183
* @return
8284
*/
8385
public TestSuiteResult run(TestModule testModule, boolean runTeardown, boolean runSuiteTeardown, boolean calculateCoverage) {
84-
RequestParameters params = buildRequestParameters(testModule.getSuite(), FORMAT_NONE, runTeardown, runSuiteTeardown, calculateCoverage);
85-
86-
String test = testModule.getTest();
87-
if (test != null) {
88-
params.add("tests", testModule.getTest());
89-
}
86+
RequestParameters params = new RunParameters()
87+
.withTestNames(testModule.getTest())
88+
.withFormat(FORMAT_NONE)
89+
.withRunSuiteTeardown(runSuiteTeardown)
90+
.withRunTeardown(runTeardown)
91+
.withCalculateCoverage(calculateCoverage)
92+
.toRequestParameters(testModule.getSuite());
9093

9194
String xml = getServices().post(params, (AbstractWriteHandle) null, new StringHandle()).get();
9295
return unitTestXmlParser.parseTestSuiteResult(xml);
@@ -96,15 +99,17 @@ public TestSuiteResult run(TestModule testModule, boolean runTeardown, boolean r
9699
* @return a JUnitTestSuite for every suite found in the modules database
97100
*/
98101
public List<JUnitTestSuite> runAllSuites() {
99-
return runAllSuites(true, true, false);
102+
return runAllSuites(new RunParameters());
100103
}
101104

102105
/**
103106
* @param runTeardown
104107
* @param runSuiteTeardown
105108
* @param calculateCoverage
106109
* @return a JUnitTestSuite for every suite found in the modules database
110+
* @deprecated since 1.4.0; prefer using {@code RunParameters}
107111
*/
112+
@Deprecated
108113
public List<JUnitTestSuite> runAllSuites(boolean runTeardown, boolean runSuiteTeardown, boolean calculateCoverage) {
109114
List<String> suiteNames = listSuites();
110115
List<JUnitTestSuite> suites = new ArrayList<>();
@@ -119,7 +124,7 @@ public List<JUnitTestSuite> runAllSuites(boolean runTeardown, boolean runSuiteTe
119124
* @return a JUnitTestSuite capturing the results of running the given suite name
120125
*/
121126
public JUnitTestSuite runSuite(String suite) {
122-
return runSuite(suite, true, true, false);
127+
return runSuite(suite, new RunParameters());
123128
}
124129

125130
/**
@@ -128,25 +133,118 @@ public JUnitTestSuite runSuite(String suite) {
128133
* @param runSuiteTeardown
129134
* @param calculateCoverage
130135
* @return
136+
* @deprecated since 1.4.0; prefer using {@code RunParameters}
131137
*/
138+
@Deprecated
132139
public JUnitTestSuite runSuite(String suite, boolean runTeardown, boolean runSuiteTeardown, boolean calculateCoverage) {
133-
RequestParameters params = buildRequestParameters(suite, FORMAT_JUNIT, runTeardown, runSuiteTeardown, calculateCoverage);
140+
RequestParameters params = new RunParameters()
141+
.withFormat(FORMAT_JUNIT)
142+
.withRunSuiteTeardown(runSuiteTeardown)
143+
.withRunTeardown(runTeardown)
144+
.withCalculateCoverage(calculateCoverage)
145+
.toRequestParameters(suite);
146+
134147
String xml = getServices().post(params, (AbstractWriteHandle) null, new StringHandle()).get();
135148
return unitTestXmlParser.parseJUnitTestSuiteResult(xml);
136149
}
137150

138-
protected RequestParameters buildRequestParameters(String suite, String format, boolean runTeardown, boolean runSuiteTeardown, boolean calculateCoverage) {
139-
RequestParameters params = new RequestParameters();
140-
params.add("func", "run");
141-
params.add("suite", suite);
142-
params.add("format", format);
143-
params.add("runsuiteteardown", String.valueOf(runSuiteTeardown));
144-
params.add("runteardown", String.valueOf(runTeardown));
145-
params.add("calculatecoverage", String.valueOf(calculateCoverage));
146-
return params;
151+
/**
152+
* Run a single suite with the given parameters.
153+
*
154+
* @param params
155+
* @return
156+
* @since 1.4.0
157+
*/
158+
public JUnitTestSuite runSuite(String suiteName, RunParameters params) {
159+
String xml = getServices().post(params.toRequestParameters(suiteName), (AbstractWriteHandle) null, new StringHandle()).get();
160+
return unitTestXmlParser.parseJUnitTestSuiteResult(xml);
161+
}
162+
163+
/**
164+
* Run all suites using the given parameters.
165+
*
166+
* @since 1.4.0
167+
*/
168+
public List<JUnitTestSuite> runAllSuites(RunParameters params) {
169+
return this.listSuites().stream().map(suite -> runSuite(suite, params)).collect(Collectors.toList());
170+
}
171+
172+
/**
173+
* Runs each suite identified by {@code suiteNames}, using the parameters in the given {@code RunParameters}
174+
* instance.
175+
*
176+
* @since 1.4.0
177+
*/
178+
public List<JUnitTestSuite> runSuites(List<String> suiteNames, RunParameters params) {
179+
return suiteNames.stream().map(suiteName -> runSuite(suiteName, params)).collect(Collectors.toList());
147180
}
148181

149182
public void setUnitTestXmlParser(ServiceResponseUnmarshaller unitTestXmlParser) {
150183
this.unitTestXmlParser = unitTestXmlParser;
151184
}
185+
186+
/**
187+
* Simplifies constructing a set of request parameters to pass to the marklogic-unit-test REST extension.
188+
*
189+
* @since 1.4.0
190+
*/
191+
public static class RunParameters {
192+
193+
private String[] testNames;
194+
private boolean runSuiteTeardown = true;
195+
private boolean runTeardown = true;
196+
private boolean calculateCoverage = false;
197+
private String format = "junit";
198+
199+
public RunParameters() {
200+
}
201+
202+
public RunParameters(String... testNames) {
203+
this();
204+
withTestNames(testNames);
205+
}
206+
207+
public RunParameters withTestNames(String... testNames) {
208+
this.testNames = testNames;
209+
return this;
210+
}
211+
212+
public RunParameters withFormat(String format) {
213+
this.format = format;
214+
return this;
215+
}
216+
217+
public RunParameters withRunSuiteTeardown(boolean runSuiteTeardown) {
218+
this.runSuiteTeardown = runSuiteTeardown;
219+
return this;
220+
}
221+
222+
public RunParameters withRunTeardown(boolean runTeardown) {
223+
this.runTeardown = runTeardown;
224+
return this;
225+
}
226+
227+
public RunParameters withCalculateCoverage(boolean calculateCoverage) {
228+
this.calculateCoverage = calculateCoverage;
229+
return this;
230+
}
231+
232+
public RequestParameters toRequestParameters(String suiteName) {
233+
RequestParameters params = new RequestParameters();
234+
params.add("run", "func");
235+
if (suiteName != null) {
236+
params.add("suite", suiteName);
237+
}
238+
if (format != null) {
239+
params.add("format", format);
240+
}
241+
if (testNames != null) {
242+
params.add("tests", Stream.of(testNames).collect(Collectors.joining(",")));
243+
}
244+
params.add("runsuiteteardown", String.valueOf(runSuiteTeardown));
245+
params.add("runteardown", String.valueOf(runTeardown));
246+
params.add("calculatecoverage", String.valueOf(calculateCoverage));
247+
return params;
248+
}
249+
}
152250
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.marklogic.test.unit;
2+
3+
import com.marklogic.client.DatabaseClient;
4+
import com.marklogic.client.DatabaseClientFactory;
5+
6+
public class ClientUtil {
7+
8+
private static DatabaseClient client;
9+
10+
/**
11+
* Simple utility for creating a client for this project's test application. Using this until we get a real
12+
* test-app in place and can then use spring-test for loading properties from gradle.properties and
13+
* gradle-local.properties.
14+
*
15+
* @return
16+
*/
17+
public static DatabaseClient getClient() {
18+
if (client == null) {
19+
client = DatabaseClientFactory.newClient("localhost", 8008,
20+
new DatabaseClientFactory.DigestAuthContext("admin", "admin"));
21+
}
22+
return client;
23+
}
24+
}
Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,20 @@
11
package com.marklogic.test.unit;
22

3-
import com.marklogic.client.DatabaseClient;
4-
import com.marklogic.client.DatabaseClientFactory;
53
import org.junit.jupiter.api.Test;
64

75
import java.util.List;
86

7+
import static org.junit.jupiter.api.Assertions.assertEquals;
8+
99
/**
1010
* Example of how all the test suites can be run by themselves, e.g. as part of a custom Gradle task.
1111
*/
1212
public class RunSuiteTest {
1313

1414
@Test
1515
public void test() {
16-
DatabaseClient databaseClient = DatabaseClientFactory.newClient("localhost", 8008,
17-
new DatabaseClientFactory.DigestAuthContext("admin", "admin"));
18-
19-
try {
20-
List<JUnitTestSuite> suites = new TestManager(databaseClient).runAllSuites();
21-
String report = new DefaultJUnitTestReporter().reportOnJUnitTestSuites(suites);
22-
System.out.println(report);
23-
} finally {
24-
databaseClient.release();
25-
}
16+
List<JUnitTestSuite> suites = new TestManager(ClientUtil.getClient()).runAllSuites();
17+
String report = new DefaultJUnitTestReporter().reportOnJUnitTestSuites(suites);
18+
assertEquals("42 tests completed, 0 failed", report.trim());
2619
}
2720
}

marklogic-unit-test-client/src/test/java/com/marklogic/test/unit/SampleParameterizedTest.java

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
11
package com.marklogic.test.unit;
22

3-
import com.marklogic.client.DatabaseClient;
4-
import com.marklogic.client.DatabaseClientFactory;
5-
import org.junit.jupiter.api.AfterAll;
63
import org.junit.jupiter.api.extension.ExtensionContext;
74
import org.junit.jupiter.params.ParameterizedTest;
85
import org.junit.jupiter.params.provider.Arguments;
96
import org.junit.jupiter.params.provider.ArgumentsProvider;
107
import org.junit.jupiter.params.provider.ArgumentsSource;
118

12-
import java.io.FileReader;
13-
import java.util.Properties;
149
import java.util.stream.Stream;
1510

1611
import static org.junit.jupiter.api.Assertions.fail;
@@ -22,14 +17,6 @@
2217
public class SampleParameterizedTest implements ArgumentsProvider {
2318

2419
private static TestManager testManager;
25-
private static DatabaseClient databaseClient;
26-
27-
@AfterAll
28-
public static void releaseDatabaseClient() {
29-
if (databaseClient != null) {
30-
databaseClient.release();
31-
}
32-
}
3320

3421
@ParameterizedTest
3522
@ArgumentsSource(SampleParameterizedTest.class)
@@ -54,16 +41,7 @@ public void test(TestModule testModule) {
5441
*/
5542
@Override
5643
public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
57-
Properties props = new Properties();
58-
props.load(new FileReader("gradle.properties"));
59-
final String host = props.getProperty("mlHost");
60-
final int port = Integer.parseInt(props.getProperty("mlRestPort"));
61-
final String username = props.getProperty("mlUsername");
62-
final String password = props.getProperty("mlPassword");
63-
64-
databaseClient = DatabaseClientFactory.newClient(host, port,
65-
new DatabaseClientFactory.DigestAuthContext(username, password));
66-
testManager = new TestManager(databaseClient);
44+
testManager = new TestManager(ClientUtil.getClient());
6745
return Stream.of(testManager.list().toArray(new TestModule[]{})).map(Arguments::of);
6846
}
6947
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.marklogic.test.unit;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import java.util.Arrays;
6+
import java.util.List;
7+
8+
import static org.junit.jupiter.api.Assertions.assertEquals;
9+
import static org.junit.jupiter.api.Assertions.assertFalse;
10+
11+
public class SelectTestsToRunTest {
12+
13+
@Test
14+
void selectTestsInSuite() {
15+
JUnitTestSuite suite = new TestManager(ClientUtil.getClient())
16+
.runSuite("Assertions", new TestManager.RunParameters("assert-all-exist.xqy", "assert-equal.xqy"));
17+
18+
assertEquals("Assertions", suite.getName());
19+
assertEquals(2, suite.getTestCases().size());
20+
assertFalse(suite.hasTestFailures());
21+
assertEquals(0, suite.getErrors());
22+
assertEquals(0, suite.getFailures());
23+
assertEquals(21, suite.getTests(), "This should really be called 'assertions', as marklogic-unit-test " +
24+
"is measuring the number of successful test assertions returned by a non-failed test. The two " +
25+
"selected test modules together contain 21 successful assertions.");
26+
27+
List<JUnitTestCase> testCases = suite.getTestCases();
28+
assertEquals("assert-all-exist.xqy", testCases.get(0).getName());
29+
assertEquals("assert-equal.xqy", testCases.get(1).getName());
30+
}
31+
32+
@Test
33+
void selectSubsetOfSuites() {
34+
TestManager mgr = new TestManager(ClientUtil.getClient());
35+
TestManager.RunParameters params = new TestManager.RunParameters();
36+
37+
List<JUnitTestSuite> suites = mgr.runSuites(Arrays.asList("Assertions", "Helpers"), params);
38+
39+
assertEquals(2, suites.size());
40+
assertEquals("Assertions", suites.get(0).getName());
41+
assertFalse(suites.get(0).hasTestFailures());
42+
assertEquals("Helpers", suites.get(1).getName());
43+
assertFalse(suites.get(1).hasTestFailures());
44+
}
45+
}

0 commit comments

Comments
 (0)