Skip to content

Commit 67f76a8

Browse files
authored
feat: support files containing testsuites (#3)
* feat: support files containing testsuites * fix(test): improve assertions * chore: release 1.2.0
1 parent 3c62b84 commit 67f76a8

5 files changed

Lines changed: 67 additions & 11 deletions

File tree

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<modelVersion>4.0.0</modelVersion>
55
<groupId>io.codeclou</groupId>
66
<artifactId>java-junit-xml-merger</artifactId>
7-
<version>1.1.0</version>
7+
<version>1.2.0</version>
88
<organization>
99
<name>codeclou.io</name>
1010
<url>http://codeclou.io/</url>

src/main/java/io/codeclou/java/junit/xml/merger/JunitXmlParser.java

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import java.io.File;
4444
import java.io.FileOutputStream;
4545
import java.io.IOException;
46+
import java.util.Collection;
4647

4748
public class JunitXmlParser {
4849

@@ -51,23 +52,48 @@ public class JunitXmlParser {
5152
private Boolean hasCmdLineParameterErrors = false;
5253
private Boolean hasFileNotFoundErrors = false;
5354

54-
protected TestSuite parseTestSuite(File filename) throws ParserConfigurationException, SAXException, IOException {
55+
protected Collection<TestSuite> parseTestSuites(File filename) throws ParserConfigurationException, SAXException, IOException {
5556
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
5657
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
5758
DocumentBuilder builder = dbf.newDocumentBuilder();
5859
Document document = builder.parse(filename);
5960
return transform(document.getFirstChild());
6061
}
6162

62-
public TestSuite transform(Node testSuite) {
63+
public Collection<TestSuite> transform(Node testSuite) {
64+
System.out.println();
65+
Collection<TestSuite> testSuites = new java.util.ArrayList<>();
66+
if (testSuite.getNodeName().equals("testsuites")) {
67+
// Already a collection
68+
for (int i = 0; i < testSuite.getChildNodes().getLength(); i++) {
69+
Node child = testSuite.getChildNodes().item(i);
70+
if (child.getNodeName().equals("testsuite")) {
71+
testSuites.add(transformTestSuite(child));
72+
}
73+
}
74+
} else {
75+
TestSuite t = transformTestSuite(testSuite);
76+
testSuites.add(t);
77+
}
78+
return testSuites;
79+
}
80+
81+
protected TestSuite parseTestSuite(File filename) throws ParserConfigurationException, SAXException, IOException {
82+
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
83+
DocumentBuilder builder = factory.newDocumentBuilder();
84+
Document document = builder.parse(filename);
85+
return transformTestSuite(document.getFirstChild());
86+
}
87+
88+
public TestSuite transformTestSuite(Node testSuite) {
6389
TestSuite t = new TestSuite();
6490
NamedNodeMap attrs = testSuite.getAttributes();
6591
t.setTests(attrs.getNamedItem("tests") != null ? Long.valueOf(attrs.getNamedItem("tests").getNodeValue()) : 0L);
66-
t.setErrors(attrs.getNamedItem("errors") != null ? Long.valueOf(testSuite.getAttributes().getNamedItem("errors").getNodeValue()) : 0L);
67-
t.setFailures(attrs.getNamedItem("failures") != null ? Long.valueOf(testSuite.getAttributes().getNamedItem("failures").getNodeValue()) : 0L);
68-
t.setSkipped(attrs.getNamedItem("skipped") != null ? Long.valueOf(testSuite.getAttributes().getNamedItem("skipped").getNodeValue()) : 0L);
69-
t.setName(testSuite.getAttributes().getNamedItem("name").getNodeValue());
70-
t.setTime(attrs.getNamedItem("time") != null ? Double.valueOf(testSuite.getAttributes().getNamedItem("time").getNodeValue()) : 0.0);
92+
t.setErrors(attrs.getNamedItem("errors") != null ? Long.valueOf(attrs.getNamedItem("errors").getNodeValue()) : 0L);
93+
t.setFailures(attrs.getNamedItem("failures") != null ? Long.valueOf(attrs.getNamedItem("failures").getNodeValue()) : 0L);
94+
t.setSkipped(attrs.getNamedItem("skipped") != null ? Long.valueOf(attrs.getNamedItem("skipped").getNodeValue()) : 0L);
95+
t.setName(attrs.getNamedItem("name").getNodeValue());
96+
t.setTime(attrs.getNamedItem("time") != null ? Double.valueOf(attrs.getNamedItem("time").getNodeValue()) : 0.0);
7197
t.setXml(testSuite);
7298
return t;
7399
}
@@ -119,7 +145,7 @@ protected void run(String[] args) throws Exception {
119145
if (f.getAbsoluteFile().toString().endsWith(".xml")) {
120146
System.out.println("\033[32;1;2mInfo >> adding " + f.getName() + " to TestSuites\033[0m");
121147
try {
122-
suites.getTestSuites().add(parseTestSuite(f));
148+
suites.getTestSuites().addAll(parseTestSuites(f));
123149
} catch (Exception e) {
124150
System.out.println("\033[31;1mError >> the file " + f.getName() + " cannot be read: ignored\033[0m");
125151
e.printStackTrace();

src/test/java/io/codeclou/java/junit/xml/merger/JunitXmlParserTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@
2828
import org.mockito.internal.util.reflection.Whitebox;
2929

3030
import java.io.File;
31+
import java.util.ArrayList;
32+
import java.util.Collection;
33+
import java.util.List;
3134

3235
import static junit.framework.TestCase.assertFalse;
3336
import static org.junit.Assert.*;
@@ -39,6 +42,20 @@ private File getTestFile(String filename) {
3942
return new File(classLoader.getResource(filename).getFile());
4043
}
4144

45+
@Test
46+
public void testParseSuites() throws Exception {
47+
// GIVEN
48+
JunitXmlParser parser = new JunitXmlParser();
49+
// WHEN
50+
Collection<TestSuite> c = parser.parseTestSuites(getTestFile("testsuites.xml"));
51+
List<TestSuite> l = new ArrayList<>(c);
52+
// THEN
53+
assertFalse(c.isEmpty());
54+
assertEquals(2, c.size());
55+
assertEquals(l.get(0).getName(), "ut.io.codeclou.customfield.editor.model.rest.SortModelTestOne");
56+
assertEquals(l.get(1). getName(), "ut.io.codeclou.customfield.editor.model.rest.SortModelTestTwo");
57+
}
58+
4259
@Test
4360
public void testParse() throws Exception {
4461
JunitXmlParser parser = new JunitXmlParser();

src/test/java/io/codeclou/java/junit/xml/merger/model/TestSuitesTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ public void testPojoGetterSetter() {
3939
@Test
4040
public void testToXml() throws Exception {
4141
JunitXmlParser jxml = new JunitXmlParser();
42-
TestSuite suite1 = jxml.transform(XmlHelper.xmlFromString("<testsuite name='foo' time='4.20' errors='1' tests='3' failures='5' skipped='2'></testsuite>".replaceAll("'", "\"")));
43-
TestSuite suite2 = jxml.transform(XmlHelper.xmlFromString("<testsuite name='bar' time='21.01' errors='2' tests='4' failures='3' skipped='6'></testsuite>".replaceAll("'", "\"")));
42+
TestSuite suite1 = jxml.transformTestSuite(XmlHelper.xmlFromString("<testsuite name='foo' time='4.20' errors='1' tests='3' failures='5' skipped='2'></testsuite>".replaceAll("'", "\"")));
43+
TestSuite suite2 = jxml.transformTestSuite(XmlHelper.xmlFromString("<testsuite name='bar' time='21.01' errors='2' tests='4' failures='3' skipped='6'></testsuite>".replaceAll("'", "\"")));
4444
TestSuites suites = new TestSuites();
4545
suites.setName("foobar23");
4646
suites.getTestSuites().add(suite1);

src/test/resources/testsuites.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<testsuites>
3+
<testsuite tests="3" failures="0" name="ut.io.codeclou.customfield.editor.model.rest.SortModelTestOne" time="0.029" errors="0" skipped="0">
4+
<testcase classname="ut.io.codeclou.customfield.editor.model.rest.SortModelTest" name="testIsValid" time="0"/>
5+
<testcase classname="ut.io.codeclou.customfield.editor.model.rest.SortModelTest" name="testToSortCollator" time="0.029"/>
6+
<testcase classname="ut.io.codeclou.customfield.editor.model.rest.SortModelTest" name="testIsDescending" time="0"/>
7+
</testsuite>
8+
<testsuite tests="3" failures="0" name="ut.io.codeclou.customfield.editor.model.rest.SortModelTestTwo" time="0.029" errors="0" skipped="0">
9+
<testcase classname="ut.io.codeclou.customfield.editor.model.rest.SortModelTest" name="testIsValid" time="0"/>
10+
<testcase classname="ut.io.codeclou.customfield.editor.model.rest.SortModelTest" name="testToSortCollator" time="0.029"/>
11+
<testcase classname="ut.io.codeclou.customfield.editor.model.rest.SortModelTest" name="testIsDescending" time="0"/>
12+
</testsuite>
13+
</testsuites>

0 commit comments

Comments
 (0)