[英]What is the best way to automatically generate JUnit results in xml?
我目前正在JUnit中編寫一系列測試。 我需要自動將結果導出為XML。 我在閱讀,最好的方法是擴展RunListener類並以這種方式編寫XML。 下面是我到目前為止所做的一些示例,但我正在努力解決如何提取已運行的每個測試的信息。 “描述”類似乎沒有任何有用的get方法,我覺得我可能會以錯誤的方式解決這個問題。
有人可以協助如何從描述中獲取有用的信息(例如,測試通過/失敗,測試持續時間,測試名稱等)或者就我實際應該做什么給我一些建議?
public class XmlListener extends RunListener {
private final PrintStream fWriter;
public XmlListener(JUnitSystem system) {
this(system.out());
}
public XmlListener(PrintStream writer) {
this.fWriter = writer;
}
@Override
public void testRunStarted(Description description) {
fWriter.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
}
@Override
public void testRunFinished(Result result) {
fWriter.append("\t\t</suite>\n");
fWriter.append("\t</suites>\n");
fWriter.append("</result>\n");
printHeader(result.getRunTime());
printFailures(result);
printFooter(result);
}
@Override
public void testStarted(Description description) {
fWriter.append("\t\t\t<case>\n");
fWriter.append("\t\t\t\t<timestamp>" + "</timestamp>\n");
fWriter.append("\t\t\t\t<className>" + "</className>\n");
fWriter.append("\t\t\t\t<testName>" + "</testName>\n");
}
@Override
public void testFinished(Description description) {
fWriter.append("\t\t\t\t<duration>" + "</duration>\n");
fWriter.append("\t\t\t</case>\n");
Iterator it = description.getAnnotations().iterator();
while (it.hasNext()) {
fWriter.append(it.next().toString());
}
}
@Override
public void testFailure(Failure failure) {
fWriter.append('E');
}
@Override
public void testIgnored(Description description) {
fWriter.append('I');
}
/**
* private methods
* @return
*/
private PrintStream getWriter() {
return fWriter;
}
protected void printHeader(long runTime) {
getWriter().println();
getWriter().println("Time: " + elapsedTimeAsString(runTime));
}
protected void printFailures(Result result) {
List<Failure> failures= result.getFailures();
if (failures.size() == 0)
return;
if (failures.size() == 1)
getWriter().println("There was " + failures.size() + " failure:");
else
getWriter().println("There were " + failures.size() + " failures:");
int i= 1;
for (Failure each : failures)
printFailure(each, "" + i++);
}
protected void printFailure(Failure each, String prefix) {
getWriter().println(prefix + ") " + each.getTestHeader());
getWriter().print(each.getTrace());
}
protected void printFooter(Result result) {
if (result.wasSuccessful()) {
getWriter().println();
getWriter().println("\t</suites>\n");
getWriter().println("</result>\n");
getWriter().println(" (" + result.getRunCount() + " test" + (result.getRunCount() == 1 ? "" : "s") + ")");
} else {
getWriter().println();
getWriter().println("FAILURES!!!");
getWriter().println("Tests run: " + result.getRunCount() + ", Failures: " + result.getFailureCount());
}
getWriter().println();
}
/**
* Returns the formatted string of the elapsed time. Duplicated from
* BaseTestRunner. Fix it.
*/
protected String elapsedTimeAsString(long runTime) {
return NumberFormat.getInstance().format((double) runTime / 1000);
}
}
更新 - Ant構建文件
<?xml version="1.0" encoding="UTF-8"?>
<project name="COTPlus" default="main" basedir=".">
<property name="src.dir" location="src" />
<target name="test" >
<junit printsummary="on" haltonfailure="false">
<formatter type="xml" />
<batchtest todir="/test-reports">
<fileset dir="${src.dir}" includes="**/ExampleTest.java" />
</batchtest>
</junit>
</target>
<target name="main" depends="test">
<description>Main target</description>
<echo>${src.dir}</echo>
</target>
</project>
您可以使用Ant腳本來獲取XML結果
<target name="test" >
<javac srcdir="/src"
destdir="/bin"
classpath="/lib/junit.jar" />
<junit haltonfailure="false">
<formatter type="xml" />
<batchtest todir="/test-reports">
<fileset dir="/bin" includes="tests/ExampleTest.class" />
</batchtest>
</junit>
</target>
這將在/ test-reports文件夾中生成一個xml。 有關Ant構建的更多詳細信息http://ant.apache.org/manual/tasksoverview.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.