Tôi đã tìm thấy việc sử dụng thích hợp (hoặc ít nhất là tài liệu) của JUnit rất khó hiểu. Câu hỏi này phục vụ cho cả hai tham chiếu trong tương lai và là một câu hỏi thực tế.Sự nhầm lẫn JUnit: sử dụng 'extends TestCase' hoặc '@Test'?
Nếu tôi đã hiểu một cách chính xác, có hai phương pháp chính để tạo và chạy thử nghiệm JUnit:
Cách tiếp cận A (JUnit 3 kiểu): tạo ra một lớp mà kéo dài TestCase, và bắt đầu phương pháp thử với từ test
. Khi chạy lớp như một JUnit Test (trong Eclipse), tất cả các phương thức bắt đầu với từ test
sẽ tự động chạy.
import junit.framework.TestCase;
public class DummyTestA extends TestCase {
public void testSum() {
int a = 5;
int b = 10;
int result = a + b;
assertEquals(15, result);
}
}
Cách tiếp cận B (JUnit 4 kiểu): tạo ra một lớp 'bình thường' và thêm vào trước một chú thích @Test
đến phương pháp này. Lưu ý rằng bạn KHÔNG phải khởi động phương thức với từ test
.
import org.junit.*;
import static org.junit.Assert.*;
public class DummyTestB {
@Test
public void Sum() {
int a = 5;
int b = 10;
int result = a + b;
assertEquals(15, result);
}
}
Trộn hai dường như không phải là ý tưởng hay, xem ví dụ: this stackoverflow question:
Bây giờ, câu hỏi của tôi (s):
- phương pháp ưa thích là gì, hoặc khi bạn sẽ sử dụng một thay vì của người kia?
- Phương pháp B cho phép thử nghiệm ngoại lệ bằng cách mở rộng chú thích @Test như trong
@Test(expected = ArithmeticException.class)
. Nhưng làm thế nào để bạn kiểm tra ngoại lệ khi sử dụng phương pháp A? Khi sử dụng phương pháp A, bạn có thể nhóm một số các lớp học thử nghiệm trong một bộ kiểm tra như thế này:
TestSuite suite = new TestSuite("All tests");
suite.addTestSuite(DummyTestA.class);
suite.addTestSuite(DummyTestAbis.class);
Nhưng điều này không thể được sử dụng với phương pháp B (vì mỗi lớp con nên phân lớp TestCase). Cách thích hợp để nhóm các xét nghiệm cho phương pháp tiếp cận B là gì?
Edit: Tôi đã thêm các phiên bản JUnit cho cả hai phương pháp tiếp cận
Câu trả lời hữu ích và kỹ lưỡng, nhưng tôi hoàn toàn không hiểu "kiểm tra thông báo ngoại lệ". Kiểm tra với một chuỗi hardcoded sẽ là một cơn ác mộng bảo trì. Bạn phải có nghĩa là "kiểm tra các thuộc tính của loại ngoại lệ cụ thể của bạn". – thSoft
@thSoft: nó không thường xuyên mà nó được sử dụng, nhưng đôi khi tôi muốn đảm bảo rằng các phương pháp ngoại lệ đề cập đến lĩnh vực vi phạm, ví dụ. Sau đó, một 'assertTrue (e.getMessage(). Chứa (" foo ")) đơn giản có thể hữu ích. –
Ngay cả trong JUnit4 đây là một thành ngữ quan trọng khi bạn phải kiểm tra tin nhắn hoặc một số tài sản khác của ngoại lệ (chẳng hạn như nguyên nhân). Phương thức 'expected' chỉ kiểm tra kiểu. – Yishai