저는 대규모 코드 기반에서 JUnit 테스트를 실행하고 있으며, 가끔 "오류"가 발생하고 다른 경우에는 "실패"가 발생한다는 사실을 깨달았습니다. 차이점이 뭐야?
답변:
좋아, 나는 방금 패턴을 발견했고 그것을 알아 냈다고 생각한다 (내가 틀렸다면 나를 고쳐라). 실패는 테스트 케이스가 실패 할 때 발생하는 것 같습니다. 즉, 어설 션이 올바르지 않습니다. 오류는 실제로 테스트를 실행하는 동안 발생하는 예기치 않은 오류 (예외 등)입니다.
@Test와 함께 expected = SomeException.class.
테스트에서 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는 실패로만 단순화합니다.
다음 링크는 더 흥미로운 입력을 제공합니다.
"JUnit을 사용한 Java 8의 Pragmatic Unit Testing"에서 :
JUnit의 어설 션 (또는 어설 션)은 테스트에 드롭하는 정적 메서드 호출입니다. 각 주장은 어떤 조건이 참인지 확인할 수있는 기회입니다. 어설 션 된 조건이 참이 아니면 테스트가 바로 중지되고 JUnit이 테스트 실패를보고합니다.
(JUnit이 테스트를 실행할 때 예외가 발생하고 포착되지 않을 수도 있습니다.이 경우 JUnit은 테스트 오류를보고합니다.)
테스트 오류와 테스트 실패를 던지는 줄에 대해 설명했습니다.
@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은 예외가 발생할 때마다 테스트 오류를 표시하고 예상 결과 값이 실제 값과 일치하지 않으면 테스트 실패를 표시합니다.
소스 클래스 : 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) 실패로 간주됩니다.
실패는 JUnit 어설 션 메소드가 던진 AssertionErrors에서 발생하거나 AssertionError를 던지거나 @Test어노테이션 에서 선언 한 예외를 던짐으로써 발생 하고 오류는 다른 예기치 않은 예외에서 발생한다는 것이 맞습니다 . 그러나 그들 사이에는 중요한 차이점이 있습니다.
실패는 테스트가 올바르게 실행되었으며 코드에서 결함을 식별했음을 의미합니다.
오류는 코드의 버그를 의미 할 수 있지만 테스트하지 않은 버그입니다. 또한 버그가 테스트 자체에 있음을 의미 할 수도 있습니다.
간단히 말해, 실패는 테스트중인 코드를 다시 작성해야 함을 의미합니다. 오류는 다시 작성해야하는 단위 테스트 일 수 있음을 의미합니다. NullPointerException테스트하지 않은 결함을 감지했기 때문에 오류가 코드에 있었더라도이를 의미 할 수 있으므로 테스트하는 것이 현명 할 수 있습니다.
아이러니하게도 junit 및 기타 테스트 관련 프레임 워크 (testng, hamcrest)는 조건을 확인하는 어설 션 작업을 제공하며, 실패하면 "내부에서"java.lang.AssertionError가 발생하고 btw는 java.lang.Error를 확장합니다.
그러나 그것은 물론 완전히 유효한 위의 답변과 모순되지 않습니다. 따라서 특정 테스트 흐름을 실패로 표시하기 위해 AssertionError를 던질 수 있지만 전용 fail () API를 사용하는 것이 더 적절하기 때문에 해당 설명서에 실제로 문서화되어 있는지 확실하지 않습니다. 다른 종류의 Throwable은 실패가 아닌 오류로 간주됩니다.
java.lang.AssertionError이 발생하면 테스트 오류 대신 테스트 실패로 표시됩니다. 자신의 답변이 정확하기 때문에 받아들이는 것을 고려해야합니다.