2010-06-03 21 views
61

Hôm nay tôi thấy một trường hợp thử nghiệm JUnit với xác nhận java thay vì xác nhận JUnit — Có lợi thế hay bất lợi đáng kể nào để ưu tiên cái khác không?khẳng định so với JUnit Assertions

+4

Tôi nghĩ câu hỏi này nên được mở cửa trở lại: câu trả lời hàng đầu cực kỳ hữu ích. – jakebeal

+0

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

Trả lời

78

Trong JUnit4 ngoại lệ (thực sự Lỗi) được ném bởi xác nhận JUnit cũng giống như lỗi được ném bởi từ khóa java assert (AssertionError), vì vậy nó giống hệt như assertTrue và khác với dấu vết ngăn xếp bạn không thể ' t nói sự khác biệt. Điều đó đang được nói, khẳng định phải chạy với một lá cờ đặc biệt trong JVM, khiến nhiều kiểm tra xuất hiện chỉ vì ai đó quên cấu hình hệ thống với cờ đó khi các kiểm tra JUnit được chạy - không tốt. Nói chung, vì lý do này, tôi cho rằng sử dụng JUnit assertTrue là thực hành tốt hơn, vì nó đảm bảo chạy thử, đả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 xác nhận JUnit sẽ thay đổi trong tương lai (chẳng hạn như hooking 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ị.

24

Tôi thích xác nhận JUnit hơn vì chúng cung cấp API phong phú hơn tuyên bố được xây dựng trong assert và, quan trọng hơn không cần phải được bật rõ ràng không giống như assert, yêu cầu đối số JVM -ea.

+0

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

0

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

+2

Bạn sẽ sử dụng JUnit cho khung chạy thử nghiệm. Asserts thực sự là một phần nhỏ của giá trị mà JUnit cung cấp cho bạn. JUnit không có 'Assert' sẽ yêu cầu thêm bản mẫu. 'khẳng định' mà không có JUnit sẽ yêu cầu bạn viết toàn bộ khung công tác. – Yishai

+0

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

+0

@CheesePls "báo cáo xác nhận cũ thường xuyên" thực tế là gần đây hơn xác nhận 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 không được đưa vào Java cho đến 1.4SE. Vì vậy, nếu bạn phải làm việc trong một môi trường với công nghệ cũ hơn, bạn có thể dựa vào JUnit vì các lý do tương thích.

11

Khi 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 thông tin thậm chí nhiều hơn nếu bạn thêm tham số thông điệp tới assertEquals

+2

thử 'assert 1 == 2:" 1 không phải là 2 ";'. –

+0

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

+0

@ThomasW khi -ea không được bật không phải là thử nghiệm. Các xác nhận 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 một khung làm việc là gì, và trong trường hợp maven phụ thuộc maven, một phụ thuộc maven phải nằm trong phạm vi kiểm tra. Chúng tôi có hai mặt ở đây: Bạn thích gì hơn? ** Đầu tiên **: Sử dụng khung làm phụ thuộc vào 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 nằm trong thư mục src/main nhưng không biên dịch ở đó vì maven có junit chỉ trong phạm vi kiểm tra hoặc ** Mặt thứ hai **: Sử dụng công cụ dựng sẵn. –

5

tôi muốn nói sử dụng JUnit khẳng định trong các trường hợp thử nghiệm và sử dụng xác nhận 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, như là hiển nhiên, và nếu nó 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.

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