2014-09-29 14 views
5

Tôi luôn luôn tự hỏi chính xác ý nghĩa của thực tế và mong đợi trong các thư viện như TestNG là gì.assertCâu hỏi, điều gì là thực tế và những gì được mong đợi?

Nếu chúng ta đọc Java Documents chúng ta thấy:

public static void assertEquals(... actual, ... expected) 
Parameters: 
    actual - the actual value 
    expected - the expected value 

Từ hiểu biết của tôi giá trị expected là tiếng một, vì vậy mà chúng ta mong đợi, và actual một là những gì chúng tôi muốn xác minh. Ví dụ: giả sử chúng tôi muốn thử nghiệm hàm fooBar luôn phải trả về 56.

Trong trường hợp này, tôi sẽ làm: assertEquals(sth.fooBar(), 56). Nhưng với một tìm kiếm nhanh chóng trên GitHub có vẻ như mọi người làm theo cách khác xung quanh, vì vậy assertEquals(56, sth.fooBar()). Nhưng làm thế nào giá trị kỳ vọng là sth.fooBar() khi chúng ta thậm chí không biết giá trị đó? Có vẻ như là sth.fooBar() là giá trị thực tế mà chúng tôi so sánh với dự kiến ​​mà chúng tôi đã biết.

Tôi biết không có sự khác biệt về tính chính xác của thử nghiệm nhưng tôi muốn thực hiện theo cách "chính xác".

+0

Có lẽ họ đã làm điều đó một cách nhanh chóng và không quan tâm đến thứ tự đặt tên nhiều như bạn :) – ControlAltDel

Trả lời

8

Hầu hết các khuôn khổ thử nghiệm (gia đình xUnit) được dựa trên khuôn khổ JUnit. Họ Assert các chức năng trong JUnit có định dạng (expected, actual); nó đã trở thành một hội nghị, và hầu hết các khuôn khổ khác tuân theo quy ước đó.

Một số khung (như TestNG hoặc NUnit 2.4+ cho .NET) đã đảo ngược thứ tự đó (với việc sử dụng mô hình dựa trên ràng buộc cho NUnit) để tăng khả năng đọc ("đảm bảo rằng giá trị thực tế là 56" tự nhiên hơn "đảm bảo rằng 56 là giá trị thực tế").

Điểm mấu chốt là: gắn với quy ước khung của bạn. Nếu bạn sử dụng JUnit, trước tiên hãy đặt giá trị mong đợi. Nếu bạn sử dụng TestNG, trước tiên hãy đặt giá trị thực. Bạn nói đúng, điều đó làm cho không có sự khác biệt trong kết quả kiểm tra khi bạn vô tình đảo ngược các đối số. Nhưng nó tạo ra sự khác biệt lớn trong thông báo mặc định mà bạn nhận được từ một thử nghiệm không thành công. Khi bạn đảo ngượcassertEquals(ShouldBeTrueButReturnsFalse(), true) trong JUnit thất bại, thông điệp mặc định nói "dự kiến ​​[sai] nhưng thấy [đúng]", nơi mà nó cần phải có cho biết "dự kiến ​​[đúng] nhưng thấy [sai]". Điều này là khó hiểu, để nói rằng ít nhất, và bạn không cần phải đối phó với một misdirection có thể của tin nhắn đó.

Một số kiểm tra đơn vị trong liên kết Github mà bạn cung cấp không tuân theo quy ước và có cùng một vấn đề. Đừng làm thế. Gắn bó với quy ước khung của bạn.

3

Câu trả lời rất đơn giản. JUnit có thứ tự ngược lại các đối số. Tham khảo ví dụ dưới đây:

JUnit:

void assertEquals(Object expected, Object actual)

TestNG:

void assertEquals(int actual, int expected)

+0

Tôi không biết điều đó nhưng nó thực sự không trả lời câu hỏi của tôi. (vì vậy tôi đã xóa JUnit khỏi câu hỏi của tôi) – insumity

+0

Câu trả lời vẫn là cùng một người học cách sử dụng JUnit và sau khi chuyển sang TestNG, hãy sử dụng các mẫu tương tự. Và ngược lại. Nhưng đây không phải là nơi để đặt câu hỏi như vậy, bởi vì không có câu trả lời thực sự, chỉ có ý kiến. – talex

-2

Bạn có thể sử dụng:

String expectedTitles[] = {"value-1", "value-2", "value-3". "value-14")}; 
List<String> expectedTitlesList = Arrays.asList(expectedTitles); 
Assert.assertTrue(expectedTitlesList.contains(("value-to-compare"))); 

với maven:

<!-- https://mvnrepository.com/artifact/junit/junit --> 
<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.4</version> 
</dependency> 

<!-- https://mvnrepository.com/artifact/org.hamcrest/hamcrest-all --> 
<dependency> 
    <groupId>org.hamcrest</groupId> 
    <artifactId>hamcrest-all</artifactId> 
    <version>1.3</version> 
</dependency> 
+0

Câu hỏi đặt ra là giải thích đúng cách sử dụng dự kiến ​​và thực tế trong khuôn khổ thử nghiệm. –

1

tôi cũng đã có sự nhầm lẫn như vậy.

Nhưng sự nhầm lẫn là do tìm kiếm Github trả về cú pháp assertEquals cho cả TestNG và junit. Bạn đúng với mong muốn thực tế của bạn là &.

TestNG:assertEquals(Object actual, Object expected)

junit:.assertEquals(Object expected, Object actual)

Ví dụ, trong TestNG kết quả của mã dưới đây

int x=1+2; assertEquals(x,2);

là:

java.lang.AssertionError: expected [2] but found [3] 
Expected :2 
Actual :3 
Các vấn đề liên quan