2013-04-10 10 views
25

Tôi có một số xét nghiệm như thế này:Làm thế nào thực hiện JUnit để in khẳng định và kết quả

@Test 
public void test01() 
{ 
    Position p = getPositionAt('a', 1); 
    assertNotNull("a1 exists", p); 
    assertNotNull("figure exists a1", p.getFigure()); 

    p = getPositionAt('a', 2); 
    assertNotNull("exists a2", p); 
    assertNull("figure exists a2", p.getFigure()); 

    p = getPositionAt('b', 1); 
    assertNotNull("exists b1", p); 
    assertNull("figure exists b1", p.getFigure()); 
} 

Những gì tôi cần trong khi chạy thử nghiệm là để in mỗi thông điệp khẳng định để stdout và sau đó kết quả của assert.

Đây là yêu cầu định dạng từ lớp thử nghiệm:

a1 exists -success 
figure exists a1 -success 
exists a2 -success 
figure exists a2 -succcess 
exists b1 -succcess 
figure exists b1 -failed 

Nhưng làm thế nào để làm điều đó? Tôi khá mới làm việc với JUnit và không có ý tưởng. Có cách nào sử dụng runnerssuites không? Hoặc tồn tại bất kỳ phương thức assertSuccess(), assertFailed() nào? Cảm ơn mọi gợi ý.

+0

Bằng cách này, thông số 'message' chỉ áp dụng khi xác nhận không thành công, vì vậy thông báo' assertNotNull' của bạn thực sự phải là "a1 không tồn tại "etc ... – Jonathan

+5

bất kỳ lý do cụ thể nào khiến bạn muốn điều này? –

+1

Cả hai nhu cầu của bạn có thể được coi là một mô hình chống trong thế giới thử nghiệm đơn vị. Các xét nghiệm của bạn chỉ nên khẳng định một điều duy nhất, vì vậy không có lý do gì để mong muốn một khẳng định không thất bại.Các bài kiểm tra của bạn nên được tự động với tất cả việc kiểm tra được thực hiện bởi các xác nhận, vì vậy không cần phải có bản in để kiểm tra thủ công. Trong thực tế, có những lý do tốt cho việc đầu tiên, chẳng hạn như chạy các bài kiểm tra theo bảng và cần nhiều cuộc gọi khẳng định để kiểm tra một thực tế logic. Hãy cảnh giác với thứ hai, mặc dù. Tự động hóa là cách duy nhất để chuyển tiếp trong thử nghiệm đơn vị và hồi quy. – user7610

Trả lời

18

Thứ nhất, bạn có hai vấn đề không phải là một. Khi xác nhận không thành công, một ngoại lệ AssertionError được ném. Điều này ngăn cản bất kỳ xác nhận nào vượt quá điểm này từ khi được kiểm tra. Để giải quyết vấn đề này, bạn cần sử dụng số ErrorCollector.

Thứ hai, tôi không tin có bất kỳ cách nào được xây dựng trong JUnit để thực hiện việc này. Tuy nhiên, bạn có thể triển khai các phương pháp của riêng mình để bao bọc các xác nhận:

public static void assertNotNull(String description, Object object){ 
    try{ 
      assertNotNull(description, object); 
      System.out.println(description + " - passed"); 
    }catch(AssertionError e){ 
      System.out.println(description + " - failed"); 

     throw e; 
    } 
} 
+2

không nên là khẳng địnhNotNull trong hàm là TestCase.assertNotNull? – IHeartAndroid

2

Một tùy chọn cuối cùng là ghép nối từng khẳng định với System.out.println tương ứng, mặc dù rõ ràng là ít hơn lý tưởng. Tuy nhiên, nó sẽ giải quyết vấn đề nếu mọi thứ khác thất bại.

10

Tất cả các phương pháp assertXXX có một hình thức cho phép hiển thị một String về lỗi:

assertNotNull("exists a2", p); // prints "exists a2" if p is null

Không có giá trị đặc biệt trong in một thông báo trên thành công.

EDIT

Junit thường cung cấp 2 hình thức của một khẳng định. Để thực hiện theo ví dụ trên, bạn có thể kiểm tra một giá trị null trong 1 trong 2 cách:

assertNotNull(p)

hoặc

assertNotNull("my message on failure", p)

Khung sẽ in các thông báo lỗi với không có nỗ lực khác theo yêu cầu bởi bạn (nó được cung cấp bởi khung công tác).

Để kiểm tra cho trường hợp ngoại lệ bạn sẽ sử dụng mẫu sau:

try{ 
    someCall(); 
catch(Exception e){ 
    fail(): // exception shouldn't happen, use assertTrue(true) if it should 
} 

Một lần nữa, có những phiên bản của các phương pháp này để thêm một thông điệp

Kiểm tra API

+0

Ok, vì vậy tôi có thể di chuyển tin nhắn trước khẳng định, nhưng làm thế nào để nắm bắt nếu khẳng định thông qua hoặc không in được thông báo kết quả? –

+1

bắt ngoại lệ như được hiển thị trong câu trả lời của tôi, nhưng nếu bạn làm như vậy, hãy chắc chắn để rethrow ngoại lệ (hoặc bẫy nó trong một bộ thu lỗi) nếu không bạn sẽ nhận được false dương –

+0

Tôi làm assertTrue ("một số tin nhắn", khẳng định); và tin nhắn vẫn không in. –