Tôi đang chạy các bài kiểm tra JUnit trên một cơ sở mã lớn và tôi đã nhận ra rằng đôi khi tôi gặp "Lỗi" trong khi những lần khác tôi nhận được "Lỗi". Có gì khác biệt?
Câu trả lời:
Ok, tôi vừa nhận thấy một mẫu và nghĩ rằng tôi đã tìm ra nó (hãy sửa cho tôi nếu tôi sai). Đối với tôi, dường như thất bại là khi các trường hợp thử nghiệm của bạn không thành công - tức là các khẳng định của bạn không chính xác. Lỗi là lỗi không mong muốn xảy ra trong khi cố gắng thực sự chạy thử nghiệm - ngoại lệ, v.v.
@Test
với expected = SomeException.class
.
Nếu thử nghiệm của bạn đưa ra một ngoại lệ không được giải thích thông qua khung công tác Assertion trong Junit, nó sẽ được báo cáo là lỗi. Ví dụ, một NullPointer hoặc một ngoại lệ ClassNotFound sẽ báo lỗi:
String s = null;
s.trim();
hoặc là,
try {
// your code
} catch(Exception e) {
// log the exception
throw new MyException(e);
}
Có nói rằng, sau đây sẽ báo cáo lỗi:
Assert.fail("Failure here");
hoặc là,
Assert.assertEquals(1, 2);
hoặc thậm chí:
throw new AssertionException(e);
Nó phụ thuộc vào phiên bản Junit bạn đang sử dụng. Junit 4- sẽ phân biệt giữa một lỗi và một lỗi, nhưng Junit 4 đơn giản hóa nó chỉ là những thất bại.
Liên kết sau cung cấp nhiều đầu vào thú vị hơn:
Từ "Kiểm tra đơn vị thực dụng trong Java 8 với JUnit":
Các xác nhận (hoặc xác nhận) trong JUnit là các lệnh gọi phương thức tĩnh mà bạn đưa vào các bài kiểm tra của mình. Mỗi khẳng định là một cơ hội để xác minh rằng một số điều kiện là đúng. Nếu một điều kiện đã xác nhận không đúng, quá trình kiểm tra sẽ dừng lại ngay tại đó và JUnit báo cáo lỗi kiểm tra.
(Cũng có thể khi JUnit chạy thử nghiệm của bạn, một ngoại lệ được đưa ra và không được bắt. Trong trường hợp này, JUnit báo cáo lỗi thử nghiệm.)
Tôi đã nhận xét dòng ném lỗi kiểm tra và lỗi kiểm tra.
@Test
public void testErrorVsTestFailure() {
final String sampleString = null;
assertEquals('j', sampleString.charAt(0) );
//above line throws test error as you are trying to access charAt() method on null reference
assertEquals(sampleString, "jacob");
//above line throws Test failure as the actual value-a null , is not equal to expected value-string "jacob"
}
Vì vậy, Junit hiển thị lỗi kiểm tra bất cứ khi nào bạn gặp một ngoại lệ và kiểm tra thất bại khi giá trị kết quả mong đợi của bạn không khớp với giá trị thực của bạn
Lớp nguồn: JUnitReportReporter.java
public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String defaultOutputDirectory) {
//......
for (ITestResult tr : (Set) entry.getValue()) {
TestTag testTag = new TestTag();
boolean isSuccess = tr.getStatus() == 1;
if (!(isSuccess)) {
if (tr.getThrowable() instanceof AssertionError)
++errors;
else {
++failures;
}
}
}
Như bạn có thể thấy dòng dưới đây trong phương pháp trên
tr.getThrowable () instanceof AssertionError
số lỗi được tăng lên khi nó là trường hợp của AssertionError nếu không (bất kỳ Throwable nào) được tính là lỗi.
Bạn nói đúng rằng các lỗi đến từ các AssertionErrors do các phương thức xác nhận JUnit ném ra, hoặc bằng cách ném AssertionError, hoặc do ném một ngoại lệ mà bạn đã khai báo trong @Test
chú thích của mình và các lỗi đến từ các Ngoại lệ không mong muốn khác. Nhưng có một điểm khác biệt quan trọng giữa chúng:
Lỗi có nghĩa là thử nghiệm của bạn đã chạy chính xác và đã xác định được lỗi trong mã của bạn.
Một lỗi có thể có nghĩa là một lỗi trong mã của bạn, nhưng một lỗi mà bạn thậm chí không thử nghiệm. Nó cũng có thể có nghĩa là lỗi nằm trong chính thử nghiệm.
Tóm lại, một thất bại có nghĩa là bạn cần phải viết lại đoạn mã đang được kiểm tra. Một lỗi có nghĩa là nó có thể là bài kiểm tra đơn vị mà bạn cần phải viết lại. Nó có thể có nghĩa là điều này ngay cả khi lỗi xảy ra trong mã của bạn, chẳng hạn như a NullPointerException
, bởi vì bạn đã phát hiện ra một lỗ hổng mà bạn thậm chí không kiểm tra, vì vậy có thể là khôn ngoan khi kiểm tra điều đó.
Trớ trêu thay, junit và các khuôn khổ liên quan đến thử nghiệm khác (testng, hamcrest) cung cấp các hoạt động xác nhận để xác minh điều kiện và nếu nó không thành công thì "chui" một java.lang.AssertionError đang được ném ra, btw mở rộng java.lang.Error.
Nhưng nó không có cách nào mâu thuẫn với các câu trả lời ở trên, tất nhiên là hoàn toàn hợp lệ. Vì vậy, để đánh dấu luồng thử nghiệm cụ thể là thất bại, người ta có thể ném AssertionError, tuy nhiên tôi không chắc nó thực sự được ghi lại trong các sách hướng dẫn tương ứng, vì sử dụng API fail () chuyên dụng sẽ thích hợp hơn. Các loại Throwable khác sẽ được coi là lỗi, không phải lỗi.
Về cơ bản, thất bại đề cập đến các xác nhận chưa được thực hiện trong khi lỗi là do thực hiện kiểm tra bất thường . và tôi nghĩ rằng mỗi IDE có các biểu tượng tượng trưng với các màu khác nhau cho các bài kiểm tra đạt , không đạt và có lỗi .
Để biết thêm thông tin, hãy kiểm tra điều này .
java.lang.AssertionError
được ném ra, nó sẽ được hiển thị là lỗi kiểm tra thay vì lỗi kiểm tra. Bạn nên cân nhắc việc chấp nhận câu trả lời của chính mình vì nó đúng.