Câu hỏi Sự khác biệt giữa thất bại và lỗi trong JUnit là gì?


Tôi đang chạy thử nghiệm JUnit trên một cơ sở mã lớn, và tôi đã nhận ra rằng đôi khi tôi nhận được "lỗi" trong khi thời gian khác tôi nhận được "Thất bại". Có gì khác biệt?


76
2017-08-06 17:00


gốc




Các câu trả lời:


Ok, tôi vừa mới nhận thấy một mẫu và nghĩ rằng tôi đã tìm ra nó (sửa tôi nếu tôi sai). Dường như với tôi rằng 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à xác nhận của bạn không chính xác. Lỗi là các lỗi không mong muốn xảy ra khi cố gắng chạy thử nghiệm - ngoại lệ, v.v.


95
2017-08-06 17:05



Bạn là chính xác, thưa bạn. - Jesse Jashinsky
Mặc dù nếu có bất cứ điều gì mở rộng java.lang.AssertionError được ném nó sẽ được hiển thị dưới dạng lỗi kiểm tra thay vì lỗi kiểm tra. Bạn nên xem xét chấp nhận câu trả lời của riêng bạn bởi vì nó là chính xác. - ponzao
Vâng, đó chính xác là sự khác biệt. Và từ quan điểm thực dụng thì "không có sự khác biệt" - trong đó nếu bạn gặp lỗi hoặc thất bại, thì bạn cần sửa nó. Vì vậy, nó có lẽ là một sai lầm để đếm "thất bại" và "lỗi" riêng biệt trong JUnit. JUnit 4 kết hợp cả hai (như được giải thích trong câu trả lời dưới đây). - Jeff Grigg
Và nếu ngoại lệ được mong đợi, bạn nên chú thích @Test với expected = SomeException.class. - Zhenyang Hua
@ JeffGrigg có một sự khác biệt thực dụng. Nếu một hành vi đang được dựa vào trong nhiều trường hợp thử nghiệm, tôi vẫn có thể viết chỉ một trường hợp thử nghiệm xác nhận rằng hành vi, trong khi ném vô tình, có khả năng chạy ngoại lệ thời gian trong tất cả các phần còn lại. Điều này nói rằng phần còn lại của các trường hợp thử nghiệm đang thử nghiệm một cái gì đó khác mặc dù họ vẫn còn phụ thuộc vào hành vi cụ thể đó để chạy. Khi hành vi đó bị hỏng, chỉ có một trường hợp thử nghiệm sẽ báo cáo lỗi trong khi phần còn lại báo cáo lỗi, và từ điều này tôi có thể thấy rằng tôi có chính xác một lỗi cần sửa mặc dù nhiều trường hợp kiểm tra không vượt qua. - RonJRH


Nếu thử nghiệm của bạn ném một ngoại lệ mà không được kích thích thông qua khung Assertion trong Junit, nó được báo cáo là một lỗi. Ví dụ, một NullPointer, hoặc một ngoại lệ ClassNotFound sẽ báo cáo một 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 một thất bạ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ẽ tạo ra sự khác biệt giữa một thất bại và một lỗi, nhưng Junit 4 đơn giản hóa nó thành thất bại mà thôi.

Liên kết sau cung cấp các đầu vào thú vị hơn:

http://www.devx.com/Java/Article/31983/1763/page/2


13
2018-04-11 15:45



Điều này là không chính xác. Sự khác biệt giữa thất bại kiểm tra và lỗi kiểm tra không biến mất trong JUnit 4. Tôi vừa thử nghiệm nó. Bài viết liên kết đã gây hiểu nhầm. Nó cho biết "JUnit 4 làm cho nó đơn giản hơn bằng cách chỉ sử dụng thất bại" nhưng cần nhấn mạnh rằng JUnit 4 biến java.lang.AssertionError thành các lỗi kiểm tra, do đó bạn không phải sử dụng junit.framework.AssertionFailedError. Lợi ích là bạn có thể bắt đầu viết các xác nhận kiểm tra trong mã sản xuất mà không có dự án liên kết với JUnit. Sự khác biệt giữa lỗi kiểm tra và lỗi thử nghiệm cũng vô cùng hữu ích và sẽ là một bước lùi nếu bị loại bỏ. - RonJRH
RonJRH, bạn có thể thấy các lỗi trong báo cáo junit mặc định của mình không? - Neel
Có Neel. Tôi vừa thử nó. Không chắc chắn chính xác sự liên kết của hình ảnh ở đây nhưng điều này cho thấy kết quả của thử nghiệm của tôi: imagebucket.net/abpxucddkvn1/Capture.PNG - RonJRH


Dưới đây kiểm tra giải thích sự khác biệt giữa Lỗi kiểm tra so với lỗi kiểm tra.

Tôi đã nhận xét dòng mà ném lỗi kiểm tra và thất bạ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 nhận được ngoại lệ và kiểm tra lỗi khi giá trị kết quả mong đợi không khớp với giá trị thực tế của bạn


4
2017-08-04 01:42





Từ "Thử nghiệm đơn vị thực dụng trong Java 8 với JUnit":

Assertions (hoặc asserts) trong JUnit là các lời gọi phương thức tĩnh mà bạn thả vào thử nghiệm của bạn. Mỗi khẳng định là một cơ hội để xác minh rằng một số điều kiện đúng. Nếu điều kiện khẳng định không đúng, kiểm tra sẽ dừng lại ở đó, và JUnit báo cáo một thất bạ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 ném và không bị bắt. Trong trường hợp này, JUnit báo cáo lỗi kiểm tra.)


2
2018-01-14 21:10





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

lỗi đếm được tăng lên khi nó là trường hợp của AssertionError nếu không (bất kỳ Throwable) được tính là thất bại.


1
2017-09-08 09:16