2012-11-01 22 views
11

Tôi có một giao diện, ví dụ .:Sử dụng lại các triển khai thử nghiệm trong JUnit 4?

public interface Thing { 
    FrobResult frob(FrobInput); 
} 

Và một số triển khai các giao diện đó (ví dụ NormalThing, ImmutableThing, AsyncThing) mà tôi đang cố gắng thử nghiệm.

Nhiều phương pháp thử nghiệm của tôi thực sự đảm bảo rằng giao diện được triển khai chính xác và do đó được nhân đôi trên mỗi lần triển khai Thing. Trong JUnit 3, một giải pháp phổ biến cho việc này là tạo một lớp cơ sở (mở rộng TestCase) mà sau đó được phân lớp theo từng lớp thực hiện. Nhưng đây có phải là cách tiếp cận chính xác cho JUnit 4 không?

lựa chọn thay thế có thể xảy ra trong (Tôi tin) thứ tự tăng dần ưu tiên:

  1. cut'n'paste các phương pháp kiểm tra trùng lặp. Không phải là DRY chút nào, nhưng tôi đoán ít đáng lo ngại trong các bài kiểm tra hơn là trong mã sản xuất.

  2. Tạo lớp trừu tượng với các phương thức @Test và phân lớp nó cho từng lớp thử nghiệm triển khai. (Thường thấy với các bài kiểm tra JUnit 3 - đây có phải là cách tốt để đi vào JUnit 4 không?)

  3. Đặt các phương thức thử nghiệm chung vào một lớp trợ giúp và gọi nó trên mỗi lần thực hiện. (Thành phần thay vì thừa kế.)

Cách tốt nhất để thực hiện # 3 là gì? Có thể thử nghiệm @RunWith(Parameterized.class) được tham số hóa với từng triển khai? Hoặc là có một cách tốt hơn để thực hiện điều này?

+0

Có, đó là cách tiếp cận chính xác để tạo lớp cơ sở, sau đó được phân lớp theo từng lớp triển khai trong JUnit4. – DaveFar

+0

@DaveBall: Bạn có nhớ đăng câu trả lời đó không? –

+1

# 3 sẽ đẹp hơn nhiều và tôi đồng ý với nhận xét dưới đây của bạn rằng cảm giác như thế này là có thể. –

Trả lời

5

Có, đó là cách tiếp cận chính xác để tạo lớp cơ sở sau đó được phân lớp theo từng lớp triển khai trong JUnit4.

Tôi thích lớp kiểm tra cơ sở cho giao diện là trừu tượng, tức là "thay thế" 2 của bạn, vì tôi đã có kinh nghiệm tốt trong việc bắt chước phân cấp thừa kế từ mã sản xuất cho mã thử nghiệm. Vì vậy, nếu bạn có giao diện I và triển khai S1, S2S3, bạn thực hiện các lớp thử nghiệm trừu tượng TestI và các lớp học thử nghiệm TestS1, TestS2TestS3.

Các trường hợp kiểm tra nên nói, tức là kể một câu chuyện. Bằng cách chọn - như mọi khi - tên phương thức cẩn thận và chỉ sử dụng kiểu phân loại hành vi sạch, thì sự thừa kế không làm xáo trộn điều này.

+0

Đó cũng là suy nghĩ đầu tiên của tôi, mặc dù nó có vẻ như có một số cách mới mẻ và sáng bóng để trộn lẫn các phương pháp thử nghiệm, vì nó có vẻ giống như một trường hợp phổ biến. +1 nhưng sẽ đợi người khác gọi điện trước khi cho bạn dấu kiểm. –

1

Tôi sử dụng phương pháp # 2 cho các trường hợp kiểm tra JUnit và TestNG. Điều này là thuận tiện nhất và dễ bảo trì. Nó cũng thẳng về phía trước để chọn (kể từ khi nó có nguồn gốc từ OOD để có lớp cơ sở có phương pháp phổ biến). Đối với tôi, các lớp kiểm tra đơn vị không khác với các lớp dự án thông thường ... vì vậy tôi áp dụng các cân nhắc thiết kế tương tự.

+1

Đúng là các lớp kiểm tra cần cân nhắc thiết kế, nhưng tôi sẽ không nói rằng chúng không khác với các lớp dự án thông thường. Nhưng một trong hai cách, sở thích của tôi là để làm theo * Hiệu quả Java * Mục 16: Ủng hộ thành phần trên thừa kế. Thừa kế (mà thực sự là về việc tạo ra một mối quan hệ "là-một") thường là một cách nghèo để thực hiện tái sử dụng mã. –

+0

Vâng tất cả đều phụ thuộc ... thông thường tôi sử dụng bố cục và thừa kế với nhau. Một số chức năng cơ bản chỉ thuộc về cấu trúc phân cấp mà tôi đặt vào lớp cơ sở và một số chức năng có thể được sử dụng lại bên ngoài cấu trúc phân cấp của tôi (tức là thành phần thư viện/thành phần). Vì vậy, bạn nên sử dụng # 2 và # 3 cách tiếp cận với nhau (tôi cũng đã thêm vào câu trả lời của tôi ở đây) :) – user1697575

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