khẳng định và khẳng định JUnit


85

Hôm nay tôi đã thấy một trường hợp thử nghiệm JUnit với một xác nhận java thay vì khẳng định JUnit — Có những ưu điểm hay nhược điểm đáng kể để thích cái này hơn cái kia không?


Có sự khác biệt hoàn toàn thực tế giữa xác nhận JUnit và từ khóa 'khẳng định' trong Java. Đây hoàn toàn không phải là một câu hỏi dựa trên ý kiến.
Thomas W

Câu trả lời:


95

Trong JUnit4, ngoại lệ (thực sự là Lỗi) do một xác nhận JUnit ném ra cũng giống như lỗi do asserttừ khóa java (AssertionError) ném ra , vì vậy nó giống hệt assertTruevà khác với dấu vết ngăn xếp mà bạn không thể phân biệt được.

Điều đó đang được nói, các xác nhận phải chạy với một cờ đặc biệt trong JVM, khiến nhiều bài kiểm tra dường như vượt qua chỉ vì ai đó quên định cấu hình hệ thống với cờ đó khi chạy các bài kiểm tra JUnit - không tốt.

Nói chung, vì điều này, tôi sẽ tranh luận rằng sử dụng JUnit assertTruelà phương pháp tốt hơn, vì nó đảm bảo chạy thử nghiệm, đảm bảo tính nhất quán (đôi khi bạn sử dụng assertThathoặc các xác nhận khác không phải là từ khóa java) và nếu hành vi của JUnit khẳng định sẽ thay đổi trong tương lai (chẳng hạn như kết nối vào một số loại bộ lọc hoặc tính năng JUnit khác trong tương lai) mã của bạn sẽ có thể tận dụng điều đó.

Mục đích thực sự của từ khóa khẳng định trong java là có thể tắt nó mà không bị phạt thời gian chạy. Điều đó không áp dụng cho các bài kiểm tra đơn vị.


26

Tôi thích các xác nhận JUnit hơn vì chúng cung cấp một API phong phú hơn asserttuyên bố tích hợp sẵn và quan trọng hơn là không cần phải kích hoạt rõ ràng assert, điều này yêu cầu -eađối số JVM.


1
-ealuôn luôn được kích hoạt mvn test, không cần -ea. Api phong phú hơn, bắt tốt. Đôi khi tôi nghĩ rằng API bị sử dụng sai trong thử nghiệm vì nó không phải là một phần của ứng dụng (a trong api), tôi thích gọi nó chỉ là các phương thức phong phú hơn.
Grim

19

Khi một thử nghiệm không thành công, bạn sẽ nhận được nhiều thông tin hơn.

assertEquals(1, 2); kết quả trong java.lang.AssertionError: expected:<1> but was:<2>

vs

assert(1 == 2); kết quả trong java.lang.AssertionError

bạn có thể nhận được nhiều thông tin hơn nữa nếu bạn thêm đối số tin nhắn vào assertEquals


9
thử assert 1==2: "1 is not 2";.
Grim

@PeterRader Hãy thử từ khóa khẳng định khi -ea không được bật. Hoặc tốt hơn, sử dụng các xác nhận JUnit luôn hoạt động.
Thomas W

1
@ThomasW khi -ea không được kích hoạt, nó không phải là một thử nghiệm. Các phép thử JUnit không phải lúc nào cũng hoạt động, chúng chỉ hoạt động nếu bạn quyết định sử dụng JUnit là một khung làm việc và trong trường hợp maven là một phụ thuộc maven, một phụ thuộc maven chỉ phải nằm trong phạm vi thử nghiệm. Chúng ta có hai mặt ở đây: Bạn thích gì hơn? Mặt thứ nhất : Sử dụng một khuôn khổ, như một phụ thuộc chỉ trong phạm vi thử nghiệm, phải được tải xuống, nhật thực đó cho phép bạn sử dụng trong các lớp không có trong thư mục src / main-nhưng sẽ không biên dịch ở đó vì maven chỉ có junit trong test- phạm vi hoặc Mặt thứ 2 : Sử dụng công cụ tích hợp sẵn.
Grim

1
@PeterRader Câu hỏi này là về các trường hợp thử nghiệm JUnit. Trong ngữ cảnh đó, nên sử dụng JUnit hoặc lớp xác nhận tương tự, vì chúng luôn được kích hoạt. Cá nhân tôi đã bị phát hiện bởi từ khóa 'khẳng định' của Java không được bật trong quá khứ và không tin rằng các xác nhận không đáng tin cậy có một vị trí trong mã thử nghiệm.
Thomas W

Trong bối cảnh riêng biệt của các xác nhận trong mã tính năng - điều quan trọng để thực hành lập trình mạnh mẽ, mặc dù không thực sự là chủ đề của câu hỏi - cả Spring và Google Guava đều có các lớp xác nhận luôn được bật. Tôi khuyên bạn nên sử dụng rộng rãi những điều này làm điều kiện tiên quyết về tham số & trạng thái để đảm bảo tính đúng đắn. Ngoài ra, trong các khu vực quan trọng về hiệu suất, có thể có một khu vực nhỏ mà Java assertcó thể được ưu tiên hơn - để kiểm tra tính đúng đắn sẽ ảnh hưởng đến hiệu suất và do đó tốt nhất là bị vô hiệu hóa theo mặc định. Tuy nhiên, kinh nghiệm của tôi là hầu hết các xác nhận phải luôn được bật.
Thomas W

8

Tôi muốn nói rằng sử dụng các xác nhận JUnit trong các trường hợp thử nghiệm và sử dụng khẳng định của java trong mã. Nói cách khác, mã thực sẽ không bao giờ có các phụ thuộc JUnit, và nếu đó là một thử nghiệm, nó nên sử dụng các biến thể JUnit của nó, không bao giờ là khẳng định.


0

Tôi sẽ nói nếu bạn đang sử dụng JUnit, bạn nên sử dụng các xác nhận JUnit. assertTrue()về cơ bản giống như assert, Nếu không, tại sao thậm chí sử dụng JUnit?


4
Bạn sẽ sử dụng JUnit cho khung chạy thử nghiệm. Asserts thực sự là một phần nhỏ giá trị mà JUnit mang lại cho bạn. JUnit nếu không có Assertsẽ yêu cầu nhiều bản soạn thảo hơn. assertnếu không có JUnit sẽ yêu cầu bạn viết toàn bộ khuôn khổ.
Yishai

1
Tôi muốn nói nhiều hơn nếu bạn định sử dụng công cụ, hãy SỬ DỤNG CÔNG CỤ. Các câu lệnh khẳng định cũ thông thường có vẻ hơi ngớ ngẩn trong các trường hợp thử nghiệm JUnit. Chúng thuộc về mã thực tế theo ý kiến ​​của tôi.
CheesePls

1
@CheesePls "các tuyên bố xác nhận cũ thông thường" trên thực tế gần đây hơn các khẳng định của JUnit.
dolmen

0

Điều này có thể không áp dụng nếu bạn chỉ sử dụng những thứ sáng bóng và mới, nhưng khẳng định rằng nó đã không được đưa vào Java cho đến 1.4SE. Do đó, nếu bạn phải làm việc trong môi trường với công nghệ cũ hơn, bạn có thể nghiêng về JUnit vì lý do tương thích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.