JUnit의 실패와 오류의 차이점은 무엇입니까?


93

저는 대규모 코드 기반에서 JUnit 테스트를 실행하고 있으며, 가끔 "오류"가 발생하고 다른 경우에는 "실패"가 발생한다는 사실을 깨달았습니다. 차이점이 뭐야?

답변:


116

좋아, 나는 방금 패턴을 발견했고 그것을 알아 냈다고 생각한다 (내가 틀렸다면 나를 고쳐라). 실패는 테스트 케이스가 실패 할 때 발생하는 것 같습니다. 즉, 어설 션이 올바르지 않습니다. 오류는 실제로 테스트를 실행하는 동안 발생하는 예기치 않은 오류 (예외 등)입니다.


5
확장 java.lang.AssertionError이 발생하면 테스트 오류 대신 테스트 실패로 표시됩니다. 자신의 답변이 정확하기 때문에 받아들이는 것을 고려해야합니다.
— ponzao

예, 그게 바로 차이입니다. 실용적인 관점에서 보면 "차이가 없습니다". 오류나 실패가 발생하면 수정해야한다는 점입니다. 따라서 JUnit에서 "실패"와 "오류"를 별도로 계산하는 것은 실수 였을 것입니다. JUnit 4는 두 가지를 결합합니다 (아래 답변에서 설명).
— Jeff Grigg 2013 년

예외가 예상되는 경우, 당신은을 주석해야 @Test와 함께 expected = SomeException.class.
— Downhillski

@JeffGrigg 실용적인 차이가 있습니다. 여러 테스트 케이스에서 하나의 동작이 의존하는 경우, 나머지는 모두 잡히지 않은 런타임 예외를 던지면서 해당 동작을 주장하는 테스트 케이스 하나만 작성할 수 있습니다. 이는 나머지 테스트 케이스가 실행하기 위해 특정 동작에 여전히 의존하고 있음에도 불구하고 다른 것을 테스트하고 있음을 의미합니다. 해당 동작이 깨지면 하나의 테스트 케이스 만 실패를보고하고 나머지는 오류를보고하며, 이로부터 많은 테스트 케이스가 통과하지 못했지만 정확히 하나의 버그를 수정해야 함을 알 수 있습니다.
— RonJRH

org.junit.Assert.assertEquals () 실패하면 JUnit4 HTML 보고서에서 ERROR로 간주됩니다. 이것은 (지금까지 내가 알고 있었던) 당신의 진술과 모순됩니다. 이것에 더 많은 빛을 주시겠습니까?
— Krishnom

15

테스트에서 Junit의 Assertion 프레임 워크를 통해 버블 링되지 않는 예외가 발생하면 오류로보고됩니다. 예를 들어 NullPointer 또는 ClassNotFound 예외는 오류를보고합니다.

String s = null;
s.trim();

또는,

try {

    // your code
} catch(Exception e) {
    // log the exception
    throw new MyException(e);
}

다음은 실패를보고합니다.

Assert.fail("Failure here");

또는,

Assert.assertEquals(1, 2);

또는:

throw new AssertionException(e);

사용중인 Junit 버전에 따라 다릅니다. Junit 4-는 실패와 오류를 구분하지만 Junit 4는 실패로만 단순화합니다.

다음 링크는 더 흥미로운 입력을 제공합니다.

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


이것은 정확하지 않습니다. 테스트 실패와 테스트 오류의 구분은 JUnit 4에서 사라지지 않았습니다. 방금 테스트했습니다. 링크 된 기사는 오해의 소지가 있습니다. "JUnit 4는 실패만을 사용하여 더 간단하게 만든다"라고 말했지만 JUnit 4는 java.lang.AssertionError를 테스트 실패로 전환하므로 junit.framework.AssertionFailedError를 사용할 필요가 없다는 점을 강조해야합니다. 이점은 프로젝트를 JUnit에 연결하지 않고도 프로덕션 코드에서 테스트 어설 션 작성을 시작할 수 있다는 것입니다. 테스트 오류와 테스트 실패를 구분하는 것도 매우 유용하며 제거하면 뒤로 물러날 것입니다.
— RonJRH

RonJRH, 기본 junit 보고서에서 오류를 볼 수 있습니까?
— Neel

네 Neel. 방금 시도했습니다. 여기에 이미지를 연결하는 방법은 확실하지 않지만 테스트 결과를 보여줍니다. imagebucket.net/abpxucddkvn1/Capture.PNG
— RonJRH

6

"JUnit을 사용한 Java 8의 Pragmatic Unit Testing"에서 :

JUnit의 어설 션 (또는 어설 션)은 테스트에 드롭하는 정적 메서드 호출입니다. 각 주장은 어떤 조건이 참인지 확인할 수있는 기회입니다. 어설 션 된 조건이 참이 아니면 테스트가 바로 중지되고 JUnit이 테스트 실패를보고합니다.

(JUnit이 테스트를 실행할 때 예외가 발생하고 포착되지 않을 수도 있습니다.이 경우 JUnit은 테스트 오류를보고합니다.)


5

아래 테스트는 테스트 오류와 테스트 실패 의 차이점을 설명합니다 .

테스트 오류와 테스트 실패를 던지는 줄에 대해 설명했습니다.

    @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"
        }

따라서 Junit은 예외가 발생할 때마다 테스트 오류를 ​​표시하고 예상 결과 값이 실제 값과 일치하지 않으면 테스트 실패를 표시합니다.


2

소스 클래스 : 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;
                    }
                }
}

위의 방법에서 아래 줄에서 볼 수 있듯이

tr.getThrowable () instanceof AssertionError

오류 수는 AssertionError의 인스턴스 일 때 증가합니다. 그렇지 않으면 (Throwable) 실패로 간주됩니다.


1

실패는 JUnit 어설 션 메소드가 던진 AssertionErrors에서 발생하거나 AssertionError를 던지거나 @Test어노테이션 에서 선언 한 예외를 던짐으로써 발생 하고 오류는 다른 예기치 않은 예외에서 발생한다는 것이 맞습니다 . 그러나 그들 사이에는 중요한 차이점이 있습니다.

실패는 테스트가 올바르게 실행되었으며 코드에서 결함을 식별했음을 의미합니다.

오류는 코드의 버그를 의미 할 수 있지만 테스트하지 않은 버그입니다. 또한 버그가 테스트 자체에 있음을 의미 할 수도 있습니다.

간단히 말해, 실패는 테스트중인 코드를 다시 작성해야 함을 의미합니다. 오류는 다시 작성해야하는 단위 테스트 일 수 있음을 의미합니다. NullPointerException테스트하지 않은 결함을 감지했기 때문에 오류가 코드에 있었더라도이를 의미 할 수 있으므로 테스트하는 것이 현명 할 수 있습니다.


0

아이러니하게도 junit 및 기타 테스트 관련 프레임 워크 (testng, hamcrest)는 조건을 확인하는 어설 션 작업을 제공하며, 실패하면 "내부에서"java.lang.AssertionError가 발생하고 btw는 java.lang.Error를 확장합니다.

그러나 그것은 물론 완전히 유효한 위의 답변과 모순되지 않습니다. 따라서 특정 테스트 흐름을 실패로 표시하기 위해 AssertionError를 던질 수 있지만 전용 fail () API를 사용하는 것이 더 적절하기 때문에 해당 설명서에 실제로 문서화되어 있는지 확실하지 않습니다. 다른 종류의 Throwable은 실패가 아닌 오류로 간주됩니다.


0

기본적으로 오류는 비정상적인 테스트 실행으로 인한 오류 인 동안 충족되지 않은 어설 션 을 의미 합니다 . 그리고 각 IDE에는 pass , failed 및 오류 테스트에 대해 서로 다른 색상의 기호 아이콘이 있다고 생각 합니다.

자세한 내용은이를 확인 하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.