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?
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âu trả lời:
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 assert
từ khóa java (AssertionError) ném ra , vì vậy nó giống hệt assertTrue
và 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 assertTrue
là 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 assertThat
hoặ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ị.
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 assert
tuyê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.
-ea
luô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.
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
assert 1==2: "1 is not 2";
.
assert
có 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.
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.
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?
Assert
sẽ yêu cầu nhiều bản soạn thảo hơn. assert
nếu không có JUnit sẽ yêu cầu bạn viết toàn bộ khuôn khổ.
Đ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.