私は現在、JUnitで一連のテストを行っています。結果をXMLとして自動的にエクスポートする必要があります。私はこれを行う最善の方法は、RunListenerクラスを拡張し、そのようにXMLを書くことであることを読んでいました。以下は私がこれまで行ってきたことの例ですが、実行された各テストで情報を抽出する方法には苦労しています。 'Description'クラスは有用なgetメソッドを持っていないようで、私はおそらくこれについて間違った方法で行っているように感じます。XMLでJUnitの結果を自動的に生成する最適な方法は何ですか?
説明から有用な情報を得る方法(例:テストの合格/不合格、テストの継続時間、テスト名など)を助けることができますか?
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);
}
}
UPDATE - 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>
あなたのプロジェクトにはmavenを使用していますか?あなたはMavenで無料で確実なレポートを入手できます。これらのレポートには、非常に詳細なXMLレポートが含まれています。 –