package org.testng.reporters; import org.testng.IReporter; import org.testng.ISuite; import org.testng.ISuiteResult; import org.testng.ITestContext; import org.testng.ITestResult; import org.testng.collections.Lists; import org.testng.collections.Maps; import org.testng.internal.Utils; import org.testng.internal.annotations.Sets; import org.testng.xml.XmlSuite; import java.io.File; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; public class JUnitReportReporter implements IReporter { @Override public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String defaultOutputDirectory) { String outputDirectory = defaultOutputDirectory + File.separator + "junitreports"; Map<Class<?>, Set<ITestResult>> results = Maps.newHashMap(); for (ISuite suite : suites) { Map<String, ISuiteResult> suiteResults = suite.getResults(); for (ISuiteResult sr : suiteResults.values()) { ITestContext tc = sr.getTestContext(); addResults(tc.getPassedTests().getAllResults(), results); addResults(tc.getFailedTests().getAllResults(), results); addResults(tc.getSkippedTests().getAllResults(), results); } } for (Map.Entry<Class<?>, Set<ITestResult>> entry : results.entrySet()) { Class<?> cls = entry.getKey(); Properties p1 = new Properties(); p1.setProperty("name", cls.getName()); Date timeStamp = Calendar.getInstance().getTime(); p1.setProperty(XMLConstants.ATTR_TIMESTAMP, timeStamp.toGMTString()); List<Properties> testCases = Lists.newArrayList(); int failures = 0; int testCount = 0; int totalTime = 0; for (ITestResult tr: entry.getValue()) { if (tr.getStatus() != ITestResult.SUCCESS) failures++; Properties p2 = new Properties(); p2.setProperty("classname", tr.getMethod().getMethod().getDeclaringClass().getName()); p2.setProperty("name", tr.getMethod().getMethodName()); long time = tr.getEndMillis() - tr.getStartMillis(); p2.setProperty("time", "" + time); totalTime += time; testCount++; testCases.add(p2); } p1.setProperty("failures", "" + failures); p1.setProperty("errors", "" + 0); p1.setProperty("name", cls.getName()); p1.setProperty("tests", "" + testCount); p1.setProperty("time", "" + totalTime); try { p1.setProperty(XMLConstants.ATTR_HOSTNAME, InetAddress.getLocalHost().getHostName()); } catch (UnknownHostException e) { // ignore } // // Now that we have all the information we need, generate the file // XMLStringBuffer xsb = new XMLStringBuffer(""); xsb.setXmlDetails("1.0", "UTF-8"); xsb.addComment("Generated by " + getClass().getName()); xsb.push("testsuite", p1); for (Properties p : testCases) { xsb.addEmptyElement("testcase", p); } xsb.pop("testsuite"); String fileName = "TEST-" + cls.getName() + ".xml"; Utils.writeFile(outputDirectory, fileName, xsb.toXML()); } // System.out.println(xsb.toXML()); // System.out.println(""); } private void addResults(Set<ITestResult> allResults, Map<Class<?>, Set<ITestResult>> out) { for (ITestResult tr : allResults) { Class<?> cls = tr.getMethod().getMethod().getDeclaringClass(); Set<ITestResult> l = out.get(cls); if (l == null) { l = Sets.newHashSet(); out.put(cls, l); } l.add(tr); } } }