2010-06-30 64 views
40

Class dưới kiểm tra MyClass.java JUnit tên trường hợp thử nghiệm giải pháp thay thế:Naming ước JUnit hậu tố hoặc tiền tố thử nghiệm

TestMyClass.java 
MyClassTest.java 

http://moreunit.sourceforge.net dường như sử dụng "Test" như mặc định tiền tố nhưng tôi đã thấy cả hai công dụng. Cả hai dường như được công nhận khi chạy toàn bộ dự án như kiểm tra đơn vị trong nhật thực vì nó là chú thích bên trong các lớp được phân tích cú pháp cho @Test. Tôi đoán maven cũng vậy.

Được ưu tiên hơn?

Trả lời

72

một lý do khác cho hậu tố - ít nhất là trong ngôn ngữ tiếng Anh:

một lớp thường đại diện cho a danh từ, đây là mô hình của một khái niệm. Một ví dụ của một trong các bài kiểm tra của bạn sẽ là 'bài kiểm tra MyClass'. Ngược lại, một phương pháp sẽ mô hình hóa một số loại hành động, như 'test [the] calculate [method]'.

Bởi vì điều này, tôi muốn luôn luôn sử dụng 'hậu tố' cho các lớp học thử nghiệm và tiền tố cho các phương pháp kiểm tra:

the MyClass test   --> MyClassTest 
test the calculate method --> testCalculate() 
+0

Cách thực hiện điều này từ quan điểm thiết kế là những gì tôi đang tìm kiếm. – aron

46

Tôi thích sử dụng hậu tố - điều đó có nghĩa là xem danh sách tệp trong thư mục đơn giản hơn: bạn không phải bỏ qua bốn chữ cái đầu tiên để nhận được điều gì đó có ý nghĩa. (Tôi giả sử bạn có các thử nghiệm trong một thư mục khác với mã sản xuất rồi.)

Điều này cũng có nghĩa là khi bạn sử dụng Open Type (Ctrl-T) trong Eclipse, bạn sẽ thấy cả mã sản xuất và thử nghiệm của nó cùng một lúc ... đó cũng là một lời nhắc nhở nếu bạn không thấy một lớp thử nghiệm :)

6

Trước JUnit 4 nó đã được phổ biến để đặt tên cho các lớp học thử nghiệm của bạn SomethingTest và sau đó chạy JUnit trên tất cả các lớp phù hợp với *Test.java. Những ngày này chú thích JUnit 4, bạn chỉ cần chú thích các phương pháp thử nghiệm của bạn với @Test và được thực hiện với nó. Các lớp kiểm tra của bạn có thể sẽ nằm trong một cấu trúc thư mục khác với nguồn thực tế của bạn (nguồn trong các lớp kiểm tra src/ trong test/) vì vậy các tiền tố/hậu tố này phần lớn không có liên quan.

+9

Chúng không. Giả sử chúng ta có một mô hình cho một trình kết nối và lớp này được đặt tên là 'Connector', hơn mô hình cho một thử nghiệm để kiểm tra một cá thể kết nối sẽ là một' ConnectorTest'. Đối với tôi điều đó khá rõ ràng. Bạn đúng từ quan điểm kỹ thuật thuần túy nhưng đặt tên phải liên quan đến thiết kế. –

+1

Làm sáng tỏ để biết lịch sử. +1 – aron

+0

@Andreas_D, điều đó đúng. Thông thường, một lớp kiểm tra đơn vị sẽ tập trung vào việc thử nghiệm một lớp java để kiểm tra đơn vị cho 'Connector' sẽ nằm trong' ConnectorTest', do đó, trong phần hindsight của câu trả lời của tôi, tiền tố/hậu tố vẫn có một số giá trị. – krock

4

Không xúc phạm bất kỳ ai, nhưng tôi nghĩ rằng "công bằng" ít được biết đến nhiều hơn JUnit, rất phổ biến và đã thiết lập quy ước thử nghiệm các lớp thử nghiệm "Thử nghiệm".

Mặc dù JUnit4 đã bỏ đi với sự cần thiết phải tuân thủ cả quy ước đặt tên lớp và phương pháp (resp. "Postfix Test" và "prefix test"), tôi nghĩ cả hai vẫn hữu ích cho sự rõ ràng.

Hãy tưởng tượng kinh dị của việc có src/kiểm tra/java /.../ MyClass.myMethod() thử nghiệm bởi src/main/java /.../ MyClass.myMethod() ...

Đôi khi, nó rất hữu ích để phân kỳ từ các quy ước JUnit3 - Tôi thấy rằng các phương thức thiết lập đặt tên sau khi chúng làm gì ("createTestFactory()") và chú thích chúng "@Trước khi" rõ ràng hơn nhiều so với "setUp() chung".

Điều này đặc biệt hữu ích khi một số hành động thiết lập không liên quan cần được thực hiện - chúng có thể nằm trong các phương thức riêng biệt, mỗi phương thức được gắn thẻ @Trước. Điều này truyền đạt sự độc lập của các hành động rất độc đáo.

+2

Một ý tưởng tuyệt vời từ BDD (http://blog.dannorth.net/introducing-bdd): thay vì đặt tên cho các phương thức thử nghiệm "@Test testFailOnNull() {...}", sử dụng động từ "nên": "@Test shouldFailOnNull() {...} ". Tôi thấy điều này truyền đạt rất nhiều thông tin một cách chính xác. Nó tránh lặp lại "kiểm tra" và đọc tốt hơn "@Test failOnNull() {...}". –

1

Tôi cũng sử dụng MyClassTest_XXX khi tôi muốn chia thử nghiệm thành nhiều lớp.Điều này rất hữu ích khi thử nghiệm một lớp lớn và tôi muốn các bài kiểm tra được nhóm lại hợp lý. (Không thể kiểm soát mã kế thừa để kịch bản này xuất hiện.) Sau đó, tôi có một cái gì đó như KitchenSinkTest_ForArray, KitchSinkTest_ForCollection, v.v.

3

Tôi thích sử dụng cú pháp TestClassName hơn. Khi sử dụng cú pháp khác, tôi gặp khó khăn khi xác định đó là bài kiểm tra và đó là lớp thực sự trong trình soạn thảo khi tôi mở cả hai. Phải tìm bốn chữ cái cuối cùng trong tên là mệt mỏi và các chữ cái này không phải lúc nào cũng được hiển thị.

Đối với tôi, cú pháp khác dẫn đến nhiều sự hoán đổi sai giữa các tệp mỗi ngày và điều đó tốn thời gian.

2

Tôi nghĩ điều quan trọng là bạn cảm thấy thoải mái với các bài kiểm tra của mình nếu bạn đang làm việc một mình. Nhưng nếu bạn đang ở trong một nhóm, bạn nên ngồi xuống và nhận được một cái gì đó cố định. Cá nhân tôi có xu hướng sử dụng hậu tố cho các lớp và tiền tố cho các phương pháp và cố gắng để các nhóm của tôi thích ứng với quy ước này.

0

Tôi đề xuất MyClassTests.

Các lớp phải là cụm từ danh từ, vì vậy thường được sử dụng MyClassTest và ít phổ biến hơn MyClassTests hoặc MyClassTestCase hoặc MyClassTestFixture tất cả công việc. Về mặt kỹ thuật, một thể hiện của một lớp kiểm tra JUnit đại diện cho một test fixture, nhưng TestFixture là một chút quá tiết đối với tôi.

Tôi nghĩ rằng MyClassTests truyền đạt ý định một cách tốt nhất vì thường có nhiều phương pháp thử trong một lớp, mỗi loại đại diện cho một thử nghiệm (trường hợp kiểm thử).

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