2012-03-05 2 views
7

私は現在、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> 
+3

あなたのプロジェクトにはmavenを使用していますか?あなたはMavenで無料で確実なレポートを入手できます。これらのレポートには、非常に詳細なXMLレポートが含まれています。 –

答えて

4

あなたは、XMLは/テスト・レポートフォルダに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> 

この結果を取得するのAntスクリプトを使用することができます。 Antビルドに関する詳細はこちらhttp://ant.apache.org/manual/tasksoverview.html

+0

これを試しましたが、ClassNotFoundExceptionが発生します。 antタスクが実行されているように見え、ファイルを見つけることができますが、欠落しているクラスについて不平を言っています。私はこれを修正する方法をグーグルで試しましたが、運はありません。上記のファイルを添付しています。 – BON

+0

.javaファイルをコンパイルする必要があります。私は私の答えを更新します – outofBounds

関連する問題