2012-03-05 24 views
7

Şu anda JUnit'te bir dizi test yazıyorum. Sonuçları otomatik olarak XML olarak vermem gerekiyor. Bunu yapmanın en iyi yolunun RunListener sınıfını genişleterek ve XML'i bu şekilde yazarak olduğunu okumuştum. Aşağıda, şimdiye kadar yaptığımın bir örneği var, ancak çalıştırılan her bir testin nasıl elde edileceği konusunda sorularım var. 'Açıklama' sınıfı, herhangi bir yararlı yöntemlere sahip gibi görünmüyor ve sanırım yanlış yöne gidiyorum gibi hissediyorum.JUnit sonuçlarını otomatik olarak xml olarak oluşturmanın en iyi yolu nedir?

Birisi, açıklamadan (örn. Test başarılı/başarısız, test süresi, test adı vb.) Nasıl yararlı bilgiler edinebileceği konusunda yardımcı olabilir mi, yoksa aslında ne yapmam gerektiğine dair bana bir tavsiyede bulunabilir mi?

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); 
    } 
} 

GÜNCELLEME - Ant yapı dosyası

<?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

Projeniz için maven kullanıyor musunuz? Sen emin maven ile ücretsiz raporlar olsun, ve bunlar çok ayrıntılı XML raporları içerir. –

cevap

4

XML/test raporları Klasör içine bir xml oluşturmak olacaktır

<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> 

bu sonuçtan almak için bir Ant Script kullanabilirsiniz. Antiloklarda Daha Fazla Ayrıntı http://ant.apache.org/manual/tasksoverview.html

+0

Bunu denedim ancak ClassNotFoundException alıyorum. Karınca görevi çalıştırılıyor gibi görünüyor ve dosyayı bulabilir, ancak sonra eksik bir sınıftan şikayet eder. Bunu düzeltmeyi denedim ama şans yok. Yukarıdaki ant yapı dosyasını ekledim. – BON

+0

.java dosyasını önce derlemeniz gerekiyor. Cevabımı Güncelleştireceğim – outofBounds

İlgili konular