diff --git a/pom.xml b/pom.xml index db3b295..302c511 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 io.codeclou java-junit-xml-merger - 1.1.0 + 1.2.0 codeclou.io http://codeclou.io/ diff --git a/src/main/java/io/codeclou/java/junit/xml/merger/JunitXmlParser.java b/src/main/java/io/codeclou/java/junit/xml/merger/JunitXmlParser.java index 2eaba78..daaa866 100644 --- a/src/main/java/io/codeclou/java/junit/xml/merger/JunitXmlParser.java +++ b/src/main/java/io/codeclou/java/junit/xml/merger/JunitXmlParser.java @@ -43,6 +43,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.util.Collection; public class JunitXmlParser { @@ -51,7 +52,7 @@ public class JunitXmlParser { private Boolean hasCmdLineParameterErrors = false; private Boolean hasFileNotFoundErrors = false; - protected TestSuite parseTestSuite(File filename) throws ParserConfigurationException, SAXException, IOException { + protected Collection parseTestSuites(File filename) throws ParserConfigurationException, SAXException, IOException { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); DocumentBuilder builder = dbf.newDocumentBuilder(); @@ -59,15 +60,40 @@ protected TestSuite parseTestSuite(File filename) throws ParserConfigurationExce return transform(document.getFirstChild()); } - public TestSuite transform(Node testSuite) { + public Collection transform(Node testSuite) { + System.out.println(); + Collection testSuites = new java.util.ArrayList<>(); + if (testSuite.getNodeName().equals("testsuites")) { + // Already a collection + for (int i = 0; i < testSuite.getChildNodes().getLength(); i++) { + Node child = testSuite.getChildNodes().item(i); + if (child.getNodeName().equals("testsuite")) { + testSuites.add(transformTestSuite(child)); + } + } + } else { + TestSuite t = transformTestSuite(testSuite); + testSuites.add(t); + } + return testSuites; + } + + protected TestSuite parseTestSuite(File filename) throws ParserConfigurationException, SAXException, IOException { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document document = builder.parse(filename); + return transformTestSuite(document.getFirstChild()); + } + + public TestSuite transformTestSuite(Node testSuite) { TestSuite t = new TestSuite(); NamedNodeMap attrs = testSuite.getAttributes(); t.setTests(attrs.getNamedItem("tests") != null ? Long.valueOf(attrs.getNamedItem("tests").getNodeValue()) : 0L); - t.setErrors(attrs.getNamedItem("errors") != null ? Long.valueOf(testSuite.getAttributes().getNamedItem("errors").getNodeValue()) : 0L); - t.setFailures(attrs.getNamedItem("failures") != null ? Long.valueOf(testSuite.getAttributes().getNamedItem("failures").getNodeValue()) : 0L); - t.setSkipped(attrs.getNamedItem("skipped") != null ? Long.valueOf(testSuite.getAttributes().getNamedItem("skipped").getNodeValue()) : 0L); - t.setName(testSuite.getAttributes().getNamedItem("name").getNodeValue()); - t.setTime(attrs.getNamedItem("time") != null ? Double.valueOf(testSuite.getAttributes().getNamedItem("time").getNodeValue()) : 0.0); + t.setErrors(attrs.getNamedItem("errors") != null ? Long.valueOf(attrs.getNamedItem("errors").getNodeValue()) : 0L); + t.setFailures(attrs.getNamedItem("failures") != null ? Long.valueOf(attrs.getNamedItem("failures").getNodeValue()) : 0L); + t.setSkipped(attrs.getNamedItem("skipped") != null ? Long.valueOf(attrs.getNamedItem("skipped").getNodeValue()) : 0L); + t.setName(attrs.getNamedItem("name").getNodeValue()); + t.setTime(attrs.getNamedItem("time") != null ? Double.valueOf(attrs.getNamedItem("time").getNodeValue()) : 0.0); t.setXml(testSuite); return t; } @@ -119,7 +145,7 @@ protected void run(String[] args) throws Exception { if (f.getAbsoluteFile().toString().endsWith(".xml")) { System.out.println("\033[32;1;2mInfo >> adding " + f.getName() + " to TestSuites\033[0m"); try { - suites.getTestSuites().add(parseTestSuite(f)); + suites.getTestSuites().addAll(parseTestSuites(f)); } catch (Exception e) { System.out.println("\033[31;1mError >> the file " + f.getName() + " cannot be read: ignored\033[0m"); e.printStackTrace(); diff --git a/src/test/java/io/codeclou/java/junit/xml/merger/JunitXmlParserTest.java b/src/test/java/io/codeclou/java/junit/xml/merger/JunitXmlParserTest.java index 51127ab..5ed077a 100644 --- a/src/test/java/io/codeclou/java/junit/xml/merger/JunitXmlParserTest.java +++ b/src/test/java/io/codeclou/java/junit/xml/merger/JunitXmlParserTest.java @@ -28,6 +28,9 @@ import org.mockito.internal.util.reflection.Whitebox; import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import static junit.framework.TestCase.assertFalse; import static org.junit.Assert.*; @@ -39,6 +42,20 @@ private File getTestFile(String filename) { return new File(classLoader.getResource(filename).getFile()); } + @Test + public void testParseSuites() throws Exception { + // GIVEN + JunitXmlParser parser = new JunitXmlParser(); + // WHEN + Collection c = parser.parseTestSuites(getTestFile("testsuites.xml")); + List l = new ArrayList<>(c); + // THEN + assertFalse(c.isEmpty()); + assertEquals(2, c.size()); + assertEquals(l.get(0).getName(), "ut.io.codeclou.customfield.editor.model.rest.SortModelTestOne"); + assertEquals(l.get(1). getName(), "ut.io.codeclou.customfield.editor.model.rest.SortModelTestTwo"); + } + @Test public void testParse() throws Exception { JunitXmlParser parser = new JunitXmlParser(); diff --git a/src/test/java/io/codeclou/java/junit/xml/merger/model/TestSuitesTest.java b/src/test/java/io/codeclou/java/junit/xml/merger/model/TestSuitesTest.java index 0535000..b2362ad 100644 --- a/src/test/java/io/codeclou/java/junit/xml/merger/model/TestSuitesTest.java +++ b/src/test/java/io/codeclou/java/junit/xml/merger/model/TestSuitesTest.java @@ -39,8 +39,8 @@ public void testPojoGetterSetter() { @Test public void testToXml() throws Exception { JunitXmlParser jxml = new JunitXmlParser(); - TestSuite suite1 = jxml.transform(XmlHelper.xmlFromString("".replaceAll("'", "\""))); - TestSuite suite2 = jxml.transform(XmlHelper.xmlFromString("".replaceAll("'", "\""))); + TestSuite suite1 = jxml.transformTestSuite(XmlHelper.xmlFromString("".replaceAll("'", "\""))); + TestSuite suite2 = jxml.transformTestSuite(XmlHelper.xmlFromString("".replaceAll("'", "\""))); TestSuites suites = new TestSuites(); suites.setName("foobar23"); suites.getTestSuites().add(suite1); diff --git a/src/test/resources/testsuites.xml b/src/test/resources/testsuites.xml new file mode 100644 index 0000000..8afac44 --- /dev/null +++ b/src/test/resources/testsuites.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + +