2016-01-25 12 views
15

Vì vậy, tôi có một bộ, một cái gì đó như thế này:Một thử nghiệm quan sát để báo cáo kết quả kiểm tra cá nhân trong JUnit Suite

@RunWith(Suite.class) 
@Suite.SuiteClasses({TestClass1.class, TestClass2.class, TestClass3.class}) 
public class TestSuite { 

    static List<ExtentTest> extentTestList = new ArrayList<>(); 

    @ClassRule 
    public static ExtentWatcher extentWatcher = new ExtentWatcher() { 
     @Override 
     protected void starting(Description description) { 
      extentTestList.addAll(extentWatcher.getTests()); 
     } 
     @Override 
     protected void finished(Description description) { 
      extentWatcher.flushReports(extentTestList); 
     } 
    }; 
} 

Đoạn mã trên hoạt động, nhưng vấn đề là nó kết quả trong Watcher tôi báo cáo kết quả của Suite, không phải các bài kiểm tra riêng lẻ. Ngoài ra, nếu thử nghiệm không thành công, bộ phần mềm vẫn báo cáo là đã qua. Watcher của tôi là một cái gì đó như thế này:

public class ExtentWatcher extends TestWatcher { 

    // A little set up to give the report a date in the file name 
    private DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); 
    private Date date = new Date(); 
    private String fileDate = dateFormat.format(date); 
    private String reportName = "./Test_Report_" + fileDate + ".html"; 
    public ExtentReports extent; 
    ArrayList<ExtentTest> testList = new ArrayList<>(); 

    public ExtentWatcher() { 
     extent = createReport(); 
    } 

     // If test passed, watcher will record this with Extent Reports 
     @Override 
     protected void succeeded(Description description) { 
      ExtentTest test = extent.startTest(description.getDisplayName()); 
      test.log(LogStatus.PASS, "Test Run Successful"); 
      testList.add(test); 
     } 

     // Likewise in case of failure 
     @Override 
     protected void failed(Throwable e, Description description) { 
      ExtentTest test = extent.startTest(description.getDisplayName()); 
      test.log(LogStatus.FAIL, "Test Failure: " + e.toString()); 
      testList.add(test); 
     } 

    /** 
    * These methods do the legwork - this file is based off of an example I found @ www.kieftsoft.nl/?p=81 
    * Eventually we can add some screenshot logic here, but just a clean test report and version info will do 
    */ 

    private ExtentReports createReport() { 
     // Create the report - Extent just needs a little config 
     ExtentReports extent = new ExtentReports(reportName, false); 
     extent.config().reportName("Test Report: " + fileDate); 
     return extent; 
    } 

    public void flushReports(List<ExtentTest> testList) { 
     // This ends the test and then sends (flushes) everything to the html document 
     for(ExtentTest test : testList) extent.endTest(test); 
     extent.flush(); 
    } 

    public List<ExtentTest> getTests() { 
     return testList; 
    } 
} 

Mã này hoạt động tốt khi chú thích như @Rule cho một bài kiểm tra cá nhân (với một báo cáo cho mỗi bài kiểm tra riêng rẽ, không mong muốn), nhưng theo trên, đây không phải là làm việc trên cấp độ Suite và tôi thực sự không chắc chắn cách làm cho nó hoạt động. Tôi đã nghĩ rằng tôi có thể thu thập một danh sách tất cả các bài kiểm tra, và trong bộ phần mềm, kết thúc các bài kiểm tra và tuôn ra chúng, điều này sẽ cho phép ExtentReport cung cấp cho tôi một báo cáo về tất cả các bài kiểm tra. Tuy nhiên, tôi không thể nhận được kết quả thử nghiệm riêng lẻ - tôi sẽ nhận lại một kiểm tra, với tên hiển thị() = tên Suite.

Làm cách nào tôi có thể theo dõi các thử nghiệm riêng lẻ, sau đó xả chúng khi tất cả đã hoàn tất và để cho ExtentWatcher quản lý việc vượt qua/thất bại trên cơ sở thử nghiệm, thay vì chỉ một lần cho bộ?

+0

Tính năng này có hoạt động sau khi thêm flushReport vào thành công và không thành công không? – Karthik

+0

Không liên quan đến vấn đề - tại sao bạn không cập nhật lên phiên bản mới nhất? – Karthik

+0

Không, nếu tôi tuôn ra thành công hoặc thất bại, tôi sẽ nhận được báo cáo cho mỗi bài kiểm tra. Tôi hiện đang sử dụng phiên bản mới nhất. –

Trả lời

1

Tôi sử dụng triển khai RunListener, nhật ký kết quả trong tệp. Trước tiên, tôi có một lớp người chạy kiểm tra mà được gọi là cho mỗi bộ kiểm tra:

public Result run(String suite) { 
    Class<?> suiteClass = null; 
    try { 
     suiteClass = Class.forName(suite); 
    } catch (ClassNotFoundException ex) { 
     return null; 
    } 
    JUnitCore core = new JUnitCore(); 
    this.testRun = new TestRun(testLogging, suite); 
    core.addListener(new TestRunListener(testLogging, testRun)); 
    Result result = core.run(suiteClass); 
    return(result); 
} 

lớp TestRun là một lớp tùy chỉnh mà chỉ đơn giản đếm số xét nghiệm có: bắt đầu, trôi qua, thất bại, bỏ qua.

TestRunListener triển khai org.junit.runner.notification.RunListener và theo dõi thông tin về trạng thái thử nghiệm, dựa trên callbacks (ví dụ: testFailure(), testFinished(), v.v.).

@Override 
public void testFailure(Failure failure) throws Exception { 
    classLogger.log(Level.CONFIG, failure.getMessage()); 
    classLogger.log(Level.CONFIG, failure.getTestHeader()); 
    classLogger.log(Level.CONFIG, failure.getTrace()); 
    classLogger.log(Level.CONFIG, failure.getDescription().getDisplayName()); 
    if (failure.getException() != null) { 
    classLogger.log(Level.CONFIG, failure.getException().getMessage()); 
    } 
    super.testFailure(failure); 

    Description description = failure.getDescription(); 
    Test test = processTestResult(TestStatus.FAIL, description); 
    if (test == null) { 
    classLogger.log(Level.SEVERE, "TEST IS NULL:" + description.getDisplayName()); 
    return; 
    } 

    classLogger.log(Level.CONFIG, failure.getMessage()+ " " + description.getDisplayName()); 

    test.setFailureMessage(description.getDisplayName()); 
    test.setFailureException(failure.getException()); 
    LogRecord record = new LogRecord(Level.CONFIG, failure.getMessage()); 
    record.setParameters(new Object[] { test, failure }); 
    testFailuresLogger.log(record); 
} 
0

Đoạn mã trên hoạt động, nhưng vấn đề là nó kết quả trong Watcher tôi báo cáo kết quả của Suite, không phải là kiểm tra cá nhân.

ClassRule được chỉ định trong lớp TestSuite được thực hiện ở cấp lớp và không thể thực thi cho từng bài kiểm tra riêng lẻ. Do đó người quan sát của bạn không báo cáo cho các bài kiểm tra cá nhân.

Vì bạn quan tâm đến việc liệt kê sự kiện cho mỗi cấp độ thử nghiệm riêng lẻ, bạn có thể sử dụng org.junit.runner.notification.RunListener (thay vì người quan sát). Để tránh chỉ định người nghe trong mỗi lớp thử nghiệm, bạn có thể thực hiện bộ thử nghiệm Suite của riêng mình để đăng ký RunListener tùy chỉnh tự động.

Ví dụ:

public class SuiteRunner extends Suite { 
    public SuiteRunner(Class<?> klass) throws InitializationError { 
     super(klass, new JUnit4Builder()); 
    } 

    @Override 
    public void run(RunNotifier notifier) { 
     notifier.addFirstListener(new RunListener() { 
      @Override 
      public void testRunStarted(Description description) throws Exception { 
       // add to watcher 
      } 

      @Override 
      public void testFailure(Failure failure) throws Exception { 
       // add to watcher 
      } 

     }); 
     super.run(notifier); 
    } 
} 

Và rõ Á hậu này trong lớp Suite thử nghiệm của bạn

@RunWith(SuiteRunner.class) 
@Suite.SuiteClasses({ MyTest.class , MyTest2.class }) 
public class TestSuite { 
    @ClassRule 
    public static ExtentWatcher watcher = new ExtentWatcher(); 
} 

Hy vọng nó giúp.

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