org.testng.xml.ResultContentHandler Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of testng Show documentation
Show all versions of testng Show documentation
Testing framework for Java
package org.testng.xml;
import static org.testng.reporters.XMLReporterConfig.ATTR_DESC;
import static org.testng.reporters.XMLReporterConfig.ATTR_DURATION_MS;
import static org.testng.reporters.XMLReporterConfig.ATTR_NAME;
import static org.testng.reporters.XMLReporterConfig.ATTR_STATUS;
import static org.testng.reporters.XMLReporterConfig.TAG_CLASS;
import static org.testng.reporters.XMLReporterConfig.TAG_PARAMS;
import static org.testng.reporters.XMLReporterConfig.TAG_SUITE;
import static org.testng.reporters.XMLReporterConfig.TAG_TEST;
import static org.testng.reporters.XMLReporterConfig.TAG_TEST_METHOD;
import org.testng.ITestResult;
import org.testng.collections.Lists;
import org.testng.remote.strprotocol.GenericMessage;
import org.testng.remote.strprotocol.IRemoteSuiteListener;
import org.testng.remote.strprotocol.IRemoteTestListener;
import org.testng.remote.strprotocol.MessageHelper;
import org.testng.remote.strprotocol.SuiteMessage;
import org.testng.remote.strprotocol.TestMessage;
import org.testng.remote.strprotocol.TestResultMessage;
import org.testng.reporters.XMLReporterConfig;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import java.util.List;
/**
* Parses testng-result.xml, create TestResultMessages and send them back to the listener
* as we encounter them.
*
* @author Cedric Beust
*/
public class ResultContentHandler extends DefaultHandler {
private int m_suiteMethodCount = 0;
private int m_testMethodCount = 0;
private SuiteMessage m_currentSuite;
private TestMessage m_currentTest;
private String m_className;
private int m_passed;
private int m_failed;
private int m_skipped;
private int m_invocationCount;
private int m_currentInvocationCount;
private TestResultMessage m_currentTestResult;
private IRemoteSuiteListener m_suiteListener;
private IRemoteTestListener m_testListener;
private List m_params = null;
public ResultContentHandler(IRemoteSuiteListener suiteListener,
IRemoteTestListener testListener, boolean resolveClasses /* ignored */) {
m_suiteListener = suiteListener;
m_testListener = testListener;
}
@Override
public void startElement (String uri, String localName,
String qName, Attributes attributes) {
p("Start " + qName);
if (TAG_SUITE.equals(qName)) {
m_suiteListener.onInitialization(new GenericMessage(MessageHelper.GENERIC_SUITE_COUNT));
m_suiteMethodCount = 0;
m_currentSuite = new SuiteMessage(attributes.getValue(ATTR_NAME),
true /* start */, m_suiteMethodCount);
m_suiteListener.onStart(m_currentSuite);
} else if (TAG_TEST.equals(qName)) {
m_passed = m_failed = m_skipped = 0;
m_currentTest = new TestMessage(true /* start */, m_currentSuite.getSuiteName(),
attributes.getValue(ATTR_NAME), m_testMethodCount,
m_passed, m_failed, m_skipped, 0);
m_testListener.onStart(m_currentTest);
} else if (TAG_CLASS.equals(qName)) {
m_className = attributes.getValue(ATTR_NAME);
} else if (TAG_TEST_METHOD.equals(qName)) {
Integer status = XMLReporterConfig.getStatus(attributes.getValue(ATTR_STATUS));
m_currentTestResult = new TestResultMessage(status, m_currentSuite.getSuiteName(),
m_currentTest.getTestName(), m_className, attributes.getValue(ATTR_NAME),
attributes.getValue(ATTR_DESC),
attributes.getValue(ATTR_DESC),
new String[0], /* no parameters, filled later */
0, Long.parseLong(attributes.getValue(ATTR_DURATION_MS)),
"" /* stack trace, filled later */,
m_invocationCount, m_currentInvocationCount);
m_suiteMethodCount++;
m_testMethodCount++;
if (status == ITestResult.SUCCESS) m_passed++;
else if (status == ITestResult.FAILURE) m_failed++;
else if (status == ITestResult.SKIP) m_skipped++;
} else if (TAG_PARAMS.equals(qName)) {
m_params = Lists.newArrayList();
}
}
@Override
public void characters(char[] ch, int start, int length) {
if (m_params != null) {
String string = new String(ch, start, length);
String parameter = string;
if (parameter.trim().length() != 0) {
m_params.add(parameter);
}
}
}
@Override
public void endElement (String uri, String localName, String qName) {
if (TAG_SUITE.equals(qName)) {
m_suiteListener.onFinish(new SuiteMessage(null, false /* end */, m_suiteMethodCount));
m_currentSuite = null;
} else if (TAG_TEST.equals(qName)) {
m_currentTest = new TestMessage(false /* start */, m_currentSuite.getSuiteName(),
null, m_testMethodCount,
m_passed, m_failed, m_skipped, 0);
m_testMethodCount = 0;
m_testListener.onFinish(m_currentTest);
} else if (TAG_CLASS.equals(qName)) {
m_className = null;
} else if (TAG_TEST_METHOD.equals(qName)) {
switch(m_currentTestResult.getResult()) {
case ITestResult.SUCCESS:
m_testListener.onTestSuccess(m_currentTestResult);
break;
case ITestResult.FAILURE:
m_testListener.onTestFailure(m_currentTestResult);
break;
case ITestResult.SKIP:
m_testListener.onTestSkipped(m_currentTestResult);
break;
default:
p("Ignoring test status:" + m_currentTestResult.getResult());
}
}
else if (TAG_PARAMS.equals(qName)) {
String[] params = new String[m_params.size()];
for (int i = 0; i < m_params.size(); i++) {
// The parameters are encoded as type:value. Since we only care about the
// value (and we don't receive the type anyway), use a dummy character in
// its place
params[i] = "@:" + m_params.get(i);
}
m_currentTestResult.setParameters(params);
m_params = null;
}
}
private static void p(String string) {
if (false) {
System.out.println("[ResultContentHandler] " + string);
}
}
}