JUnit 4 vs TestNG - Cập nhật 2013 - 2014 [đã đóng cửa]


88

JUnit 4 và TestNG từng được so sánh với nhau. Ưu và nhược điểm của hai khung thử nghiệm là gì?


Nếu bạn đang xem so sánh tính năng, có một bài viết hay của mkyong trên jUnit 4 Vs testNG Nếu bạn muốn tham khảo so sánh cách sử dụng. Có một bài viết hay của Kapil Hy vọng sẽ giúp ích!
Anshu

71
Tôi thấy những câu hỏi như thế này cực kỳ hữu ích trên SO ... Tôi muốn nói cảm ơn bạn đã mạo hiểm hỏi nó và chúc mừng bạn đã không đóng nó!
user1445967

Cách để đi ngược lại sự thích của khán giả: D
ctekk

2
Gặp lại câu hỏi này sau bao nhiêu năm. Điều buồn cười là - tôi ngửi thấy mùi âm mưu! Câu hỏi của tôi hoàn toàn tập trung vào các chức năng khác nhau, sau đó có một chỉnh sửa "cộng đồng" đã chỉnh sửa câu hỏi của tôi thành "ưu và nhược điểm" và sau đó câu hỏi bị đóng do dựa trên ý kiến. Lmao.
ctekk

Câu trả lời:


29

Tôi đã so sánh TestNG và JUnit4 ngày hôm nay và lợi thế chính mà tôi có thể chỉ ra với kinh nghiệm hạn chế của mình trong các khuôn khổ thử nghiệm là TestNG có cách xử lý các bài kiểm tra tham số thanh lịch hơn với khái niệm nhà cung cấp dữ liệu.

Theo như tôi có thể nói với JUnit4, bạn phải tạo một lớp thử nghiệm riêng biệt cho từng bộ thông số bạn muốn thử nghiệm (chạy với @RunWith(Parameterized.class)). Với TestNG, bạn có thể có nhiều nhà cung cấp dữ liệu trong một lớp kiểm tra, vì vậy bạn cũng có thể giữ tất cả các bài kiểm tra của mình cho một lớp trong một lớp kiểm tra duy nhất.

Cho đến nay, đó là điều duy nhất mà tôi có thể chỉ ra là lợi ích của TestNG so với JUnit4.

Intellij IDEA bao gồm hỗ trợ TestNG và JUnit ngay lập tức. Tuy nhiên, Eclipse chỉ hỗ trợ JUnit bên ngoài và cần cài đặt plugin TestNG để nó hoạt động.

Tuy nhiên, một vấn đề khó chịu hơn mà tôi gặp phải với TestNG là các lớp kiểm tra của bạn cần phải mở rộng PowerMockTestCasenếu bạn đang sử dụng PowerMock để giả lập các phụ thuộc trong các bài kiểm tra của mình. Rõ ràng có nhiều cách để cấu hình đối tượng-nhà máy mà khung thử nghiệm của bạn cần biết khi sử dụng PowerMock thông qua một phương pháp đặc biệt hoặc thông qua testng.xmlđịnh nghĩa bộ, nhưng những cách đó dường như đã bị hỏng vào lúc này. Tôi không thích có các lớp thử nghiệm mở rộng các lớp khung công tác thử nghiệm, có vẻ hơi khó.

Nếu bạn không sử dụng PowerMock, đây không phải là vấn đề tất nhiên, nhưng nhìn chung, tôi có ấn tượng rằng JUnit4 được hỗ trợ tốt hơn.


5
Không phải là có các triển khai thay thế của các bài kiểm tra tham số, ví dụ: code.google.com/p/junitparams Và nếu bạn không thích bất kỳ cách nào trong số đó, bạn có thể viết riêng - đó là điều tôi thích về khả năng mở rộng của JUnit. ;)
Esko Luontola

17

Dựa trên kinh nghiệm của tôi với cả hai framework, testng có một vài tính năng tiện lợi mà nhóm JUnit đã từ chối triển khai trong vài năm. Tôi thích nó hơn JUnit vì lý do này. Chuyển đổi sang testng rất dễ dàng vì về cơ bản nó hỗ trợ khá nhiều thứ trong JUnit (thậm chí có cả plugin chuyển đổi cho eclipse), việc chuyển đổi trở lại JUnit không quá tuyệt vời vì những tính năng bị thiếu này.

  • Trong testng, @BeforeClasscác phương thức không tĩnh và thực thi trước khi các bài kiểm tra trong lớp đó chạy hơn là khi lớp kiểm tra được tải (hành vi JUnit). Tôi đã từng có một dự án JUnit trong đó tất cả các bài kiểm tra cơ sở dữ liệu (vài chục) đều khởi tạo cơ sở dữ liệu ngay khi bắt đầu, đó là một hành vi khá ngu ngốc. Đã có rất nhiều tranh luận về và chống lại điều này trong cộng đồng JUnit. Ý chính của nó là mọi phương pháp thử nghiệm nên có bộ cố định thử nghiệm riêng của nó và do đó bạn không nên có phương thức beforeAll kiểu không tĩnh vì điều đó sẽ cho phép bạn lén lút đặt một biến thể hiện một lần và sau đó sử dụng nó trong tất cả các thử nghiệm của bạn. Hợp lệ, nhưng thực sự khó chịu cho các bài kiểm tra tích hợp. TestNG cung cấp cho người dùng sự lựa chọn ở đây. Theo thiết kế, Junit không gây khó chịu.

  • Các nhà cung cấp dữ liệu Testng linh hoạt hơn một chút so với JUnit tương đương. Bạn có thể chỉ định mỗi lần kiểm tra mà phương thức của nhà cung cấp dữ liệu sẽ cung cấp đầu vào thay vì có một kích thước phù hợp với tất cả các phương pháp tiếp cận cho toàn bộ lớp như trong JUnit. Vì vậy, bạn có thể có các nhà cung cấp dữ liệu trường hợp tích cực và tiêu cực cho các bài kiểm tra của bạn trong một lớp. Rất vui khi có.

  • Bạn có thể đánh dấu một lớp bằng @Testtrong testng, có nghĩa là: mọi phương thức public đều là một bài kiểm tra. Trong Junit, bạn cần sao chép / dán @Testtrên mọi phương thức.

Một điều khó chịu với cả hai là cách hamcrest được đóng gói với JUnit và cách JUnit được đóng gói với testng. Có những lọ thay thế trong maven không có vấn đề này.

Lo lắng lớn của tôi với cả hai khuôn khổ là cả hai dường như đã ngừng phát triển. Các bản phát hành ngày càng ít thường xuyên hơn và có xu hướng ngày càng có ít tính năng đáng chú ý hơn. Ví dụ, toàn bộ phong trào BDD dường như có ít tác động đến cả hai khuôn khổ. Ngoài ra, JUnit có thể đơn giản đã áp dụng hầu hết những gì tôi đã liệt kê ở trên. Không có lý do kỹ thuật chính xác tại sao JUnit không thể thực hiện bất kỳ điều nào trong số này; những người đứng sau JUnit chỉ chọn không triển khai những điều này. Cả hai dự án dường như cũng thiếu tầm nhìn về định hướng tương lai và họ có vẻ rất vui khi chỉ thực hiện những chỉnh sửa nhỏ trong vài năm qua.


9

Tôi đang tìm lý do chính đáng để chuyển TestNG qua JUnit và tôi thấy trang trình bày này của Tomek Kaczanowski giải quyết câu hỏi này rất tốt. Tomek là tác giả của cuốn sách Kiểm tra đơn vị thực tế, cuốn sách này dường như rất được các nhà phát triển và kiểm thử viên tôn trọng.


1

Nếu bạn làm việc trên dự án Java / Scala và Gradle là công cụ xây dựng mà bạn lựa chọn, hãy nhớ rằng ScalaTestkhung công tác chỉ JUnitRunnerđể chạy các bài kiểm tra scala của bạn. Nói cách khác, bạn có quyền lựa chọn:

  • Java JUnit tests + Scala Tests chạy với JUnitRunner => Tích hợp Gradle tốt hơn
  • Kiểm tra Java testNG + Kiểm tra Scala chạy với Scala Runner => Tích hợp Gradle kém, vì trình chạy kiểm tra scala là một nhiệm vụ hàng loạt theo quan điểm của Gradle.

0

Bạn có thể sử dụng Mockito làm khuôn khổ chế nhạo của mình. Nó tích hợp độc đáo với TestNG. Bạn không phải mở rộng bất kỳ lớp nào để sử dụng Mockito với TestNG. Theo cách này, mã thử nghiệm của bạn ít được ghép nối hơn và nếu vì bất kỳ lý do gì bạn cần sử dụng các khuôn khổ chế tạo khác, bạn có thể dễ dàng làm như vậy.


7
Câu trả lời này chỉ đơn giản là hoàn toàn không liên quan đến câu hỏi ....
Adrian Shum

11
@AdrianShum Tôi nghĩ rằng Konrad đã cố gắng để bình luận về JeroenHoek điểm về tích hợp PowerMock với TestNG, như ông dường như không có "bình luận" đặc ân tôi giả sử ông đưa bình luận của mình như là một câu trả lời
Taoufik Mohdit

1
Câu trả lời này hiểu sai PowerMock là gì. Nó không phải là sự thay thế cho Mockito, mà là một phần bổ sung cho phép Mockito chế nhạo một số thứ mà một mình Mockito không thể làm được (các phương thức tĩnh, các lớp cuối cùng).
stickfigure

0

Tóm lại ..

Nếu phạm vi của bạn bị giới hạn trong các bài kiểm tra đơn vị chi tiết tốt mà không có sự phụ thuộc nào giữa chúng thì JUnit có thể được sử dụng.

Nếu phạm vi của bạn yêu cầu kiểm tra chức năng có thể / không yêu cầu phụ thuộc và chia sẻ dữ liệu (tham số) giữa các thử nghiệm thì hãy chọn TestNG. Ngoài ra, TestNG có thể thực hiện kiểm thử đơn vị tương tự như JUnit. VẬY bạn có thể có một bộ kiểm tra đơn vị và một bộ kiểm tra chức năng.

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.