Code with Finding: |
class JUnitReportReporter {
@Override
public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites,
String defaultOutputDirectory) {
Map<Class<?>, Set<ITestResult>> results = Maps.newHashMap();
Map<Class<?>, Set<ITestResult>> failedConfigurations = Maps.newHashMap();
ListMultiMap<Object, ITestResult> befores = Maps.newListMultiMap();
ListMultiMap<Object, ITestResult> afters = Maps.newListMultiMap();
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);
addResults(tc.getFailedConfigurations().getAllResults(), failedConfigurations);
for (ITestResult tr : tc.getPassedConfigurations().getAllResults()) {
if (tr.getMethod().isBeforeMethodConfiguration()) {
befores.put(tr.getInstance(), tr);
}
if (tr.getMethod().isAfterMethodConfiguration()) {
afters.put(tr.getInstance(), tr);
}
}
}
}
// A list of iterators for all the passed configuration, explanation below
// ListMultiMap<Class<?>, ITestResult> beforeConfigurations = Maps.newListMultiMap();
// ListMultiMap<Class<?>, ITestResult> afterConfigurations = Maps.newListMultiMap();
// for (Map.Entry<Class<?>, Set<ITestResult>> es : passedConfigurations.entrySet()) {
// for (ITestResult tr : es.getValue()) {
// ITestNGMethod method = tr.getMethod();
// if (method.isBeforeMethodConfiguration()) {
// beforeConfigurations.put(method.getRealClass(), tr);
// }
// if (method.isAfterMethodConfiguration()) {
// afterConfigurations.put(method.getRealClass(), tr);
// }
// }
// }
// Map<Object, Iterator<ITestResult>> befores = Maps.newHashMap();
// for (Map.Entry<Class<?>, List<ITestResult>> es : beforeConfigurations.getEntrySet()) {
// List<ITestResult> tr = es.getValue();
// for (ITestResult itr : es.getValue()) {
// }
// }
// Map<Class<?>, Iterator<ITestResult>> afters = Maps.newHashMap();
// for (Map.Entry<Class<?>, List<ITestResult>> es : afterConfigurations.getEntrySet()) {
// afters.put(es.getKey(), es.getValue().iterator());
// }
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<TestTag> testCases = Lists.newArrayList();
int failures = 0;
int errors = 0;
int testCount = 0;
float totalTime = 0;
for (ITestResult tr: entry.getValue()) {
TestTag testTag = new TestTag();
boolean isSuccess = tr.getStatus() == ITestResult.SUCCESS;
if (! isSuccess) {
if (tr.getThrowable() instanceof AssertionError) {
failures++;
} else {
errors++;
}
}
Properties p2 = new Properties();
p2.setProperty("classname", cls.getName());
p2.setProperty("name", getTestName(tr));
long time = tr.getEndMillis() - tr.getStartMillis();
time += getNextConfiguration(befores, tr);
time += getNextConfiguration(afters, tr);
p2.setProperty("time", "" + formatTime(time));
Throwable t = getThrowable(tr, failedConfigurations);
if (! isSuccess && t != null) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
t.printStackTrace(pw);
testTag.message = t.getMessage();
testTag.type = t.getClass().getName();
testTag.stackTrace = sw.toString();
testTag.errorTag = tr.getThrowable() instanceof AssertionError ? "failure" : "error";
}
totalTime += time;
testCount++;
testTag.properties = p2;
testCases.add(testTag);
}
p1.setProperty("failures", "" + failures);
p1.setProperty("errors", "" + errors);
p1.setProperty("name", cls.getName());
p1.setProperty("tests", "" + testCount);
p1.setProperty("time", "" + formatTime(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.addComment("Generated by " + getClass().getName());
xsb.push("testsuite", p1);
for (TestTag testTag : testCases) {
if (testTag.stackTrace == null) {
xsb.addEmptyElement("testcase", testTag.properties);
}
else {
xsb.push("testcase", testTag.properties);
Properties p = new Properties();
if (testTag.message != null) {
p.setProperty("message", testTag.message);
}
p.setProperty("type", testTag.type);
xsb.push(testTag.errorTag, p);
xsb.addCDATA(testTag.stackTrace);
xsb.pop(testTag.errorTag);
xsb.pop("testcase");
}
}
xsb.pop("testsuite");
String outputDirectory = defaultOutputDirectory + File.separator + "junitreports";
Utils.writeUtf8File(outputDirectory, getFileName(cls), xsb.toXML());
}
// System.out.println(xsb.toXML());
// System.out.println("");
}
}
|