2012-03-05 28 views
7

Tôi hiện đang viết một loạt các bài kiểm tra trong JUnit. Tôi cần tự động xuất kết quả dưới dạng XML. Tôi đã đọc rằng cách tốt nhất để làm điều này là bằng cách mở rộng lớp RunListener và viết XML theo cách đó. Dưới đây là một mẫu của những gì tôi đã làm cho đến nay, nhưng tôi đang đấu tranh với làm thế nào để trích xuất thông tin về mỗi bài kiểm tra đã được chạy. Lớp 'Mô tả' dường như không có bất kỳ phương thức nhận được hữu ích nào và tôi cảm thấy như tôi có thể đang đi sai hướng này.Cách tốt nhất để tự động tạo kết quả JUnit bằng xml là gì?

Ai đó có thể hỗ trợ cách lấy thông tin hữu ích từ mô tả (ví dụ: kiểm tra đã trôi qua/thất bại, thời gian thử nghiệm, tên thử nghiệm, v.v.) hoặc cho tôi một số lời khuyên về những gì tôi thực sự nên làm?

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

CẬP NHẬT - Ant build tập tin

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

Bạn đang sử dụng maven cho dự án của mình? Bạn nhận được các báo cáo chắc chắn miễn phí với maven và các báo cáo này bao gồm các báo cáo XML rất chi tiết. –

Trả lời

4

Bạn có thể sử dụng một Ant Script để có được kết quả 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> 

này sẽ tạo ra một xml vào/thử nghiệm báo cáo Folder. Thông tin chi tiết về kiến ​​trúc Ant http://ant.apache.org/manual/tasksoverview.html

+0

Tôi đã thử điều này nhưng tôi nhận được một ClassNotFoundException. Nhiệm vụ kiến ​​dường như chạy và nó có thể tìm thấy tệp, nhưng sau đó than phiền về một lớp bị thiếu. Tôi đã thử googling làm thế nào để sửa lỗi này nhưng không có may mắn. Tôi đã đính kèm tệp xây dựng kiến ​​của tôi ở trên. – BON

+0

Bạn cần biên dịch tệp .java trước tiên. Tôi sẽ cập nhật câu trả lời của tôi – outofBounds

Các vấn đề liên quan