Junit5 공식문서 정리 및 실습_3(테스트)
5.6. 가정
가정은 일반적으로 주어진 테스트의 실행을 계속하는 것이 합리적이지 않을 때마다 사용됩니다. 예를 들어, 테스트가 현재 런타임 환경에 존재하지 않는 것에 의존하는 경우입니다.
- 가정이 유효한 경우, 가정 방법은 예외를 발생시키지 않으며, 테스트 실행은 평소처럼 계속됩니다.
- 가정이 유효하지 않은 경우, 가정 메서드는 org.opentest4j.TestAbortedException테스트를 실패로 표시하는 대신 중단해야 한다는 신호로 유형의 예외를 throw합니다.
JUnit Jupiter에는 JUnit 4에서 제공하는 가정 방법 의 하위 집합이 포함되어 있으며 , Java 8 람다 표현식 및 메서드 참조와 함께 사용하기에 적합한 몇 가지 방법이 추가되었습니다.
모든 JUnit Jupiter 가정은 org.junit.jupiter.api.Assumptions클래스의 정적 메서드입니다 .
가정을 위해 JUnit 4 클래스의 메서드를 사용하는 것도 가능합니다 org.junit.Assume. 구체적으로, JUnit Jupiter는 JUnit 4를 지원하여 AssumptionViolatedException 테스트를 실패로 표시하는 대신 중단해야 한다는 신호를 보냅니다. |
5.7. 예외 처리
JUnit Jupiter는 테스트 예외를 처리하기 위한 강력한 지원을 제공합니다. 여기에는 예외로 인한 테스트 실패를 관리하기 위한 기본 제공 메커니즘, 어설션 및 가정을 구현하는 데 있어서 예외의 역할, 코드에서 throw되지 않는 조건을 구체적으로 어설션하는 방법이 포함됩니다.
2.7.1. 포착되지 않은 예외
JUnit Jupiter에서는 테스트 메서드, 라이프사이클 메서드 또는 확장에서 예외가 발생하고 해당 테스트 메서드, 라이프사이클 메서드 또는 확장에서 포착되지 않는 경우 프레임워크는 해당 테스트 또는 테스트 클래스를 실패로 표시합니다.
실패한 가정은 이 일반적인 규칙에서 벗어납니다.
실패한 단언과 달리 실패한 가정은 테스트 실패로 이어지지 않습니다. 오히려 실패한 가정은 테스트 중단으로 이어집니다.
자세한 내용과 예는 가정을 참조하세요 .
|
다음 예에서 failsDueToUncaughtException()메서드는 .을 throw합니다 ArithmeticException. 예외가 테스트 메서드 내에서 포착되지 않으므로 JUnit Jupiter는 테스트를 실패로 표시합니다.
private final Calculator calculator = new Calculator();
@Test
void failsDueToUncaughtException() {
// The following throws an ArithmeticException due to division by
// zero, which causes a test failure.
calculator.divide(1, 0);
}
throws테스트 메서드에서 절을 지정해도 테스트 결과에는 영향을 미치지 않는다는 점에 유의하는 것이 중요합니다 . JUnit Jupiter는 throws절을 테스트 메서드가 어떤 예외를 throw해야 하는지에 대한 기대나 단언으로 해석하지 않습니다. 테스트는 예외가 예기치 않게 throw되거나 단언이 실패하는 경우에만 실패합니다. |
5.7.2. 실패한 주장
org.junit.jupiter.api.AssertionsJUnit Jupiter의 어설션은 예외를 사용하여 구현됩니다. 프레임워크는 어설션이 실패할 때 throw하는 클래스 의 어설션 메서드 세트를 제공합니다 AssertionError. 이 메커니즘은 JUnit이 어설션 실패를 예외로 처리하는 방법의 핵심 측면입니다. JUnit Jupiter의 어설션 지원에 대한 자세한 내용은 어설션 섹션을 참조하세요.
타사 어설션 라이브러리는 AssertionError실패한 어설션을 신호하기 위해 throw를 선택할 수 있습니다. 그러나 실패를 신호하기 위해 다른 유형의 예외를 throw하도록 선택할 수도 있습니다. 또한 타사 어설션 라이브러리를 참조하세요 .
|
JUnit Jupiter 자체는 실패한 어설션( )과 다른 유형의 예외를 구별하지 않습니다 AssertionError. 모든 포착되지 않은 예외는 테스트 실패로 이어집니다. 그러나 IDE(통합 개발 환경) 및 기타 도구는 throw된 예외가 . 인스턴스인지 확인하여 이 두 가지 유형의 실패를 구별할 수 있습니다 AssertionError. |
다음 예제에서 failsDueToUncaughtAssertionError()메서드는 .을 throw합니다 AssertionError. 예외가 테스트 메서드 내에서 포착되지 않으므로 JUnit Jupiter는 테스트를 실패로 표시합니다.
5.7.3. 예상 예외 주장
JUnit Jupiter는 예상 조건에서 특정 예외가 throw되는지 테스트하기 위한 특수한 어설션을 제공합니다. assertThrows()및 assertThrowsExactly() 어설션은 코드가 적절한 예외를 throw하여 오류 조건에 올바르게 응답하는지 확인하는 데 중요한 도구입니다.
이 assertThrows()방법은 제공된 실행 가능 블록을 실행하는 동안 특정 유형의 예외가 throw되었는지 확인하는 데 사용됩니다. throw된 예외의 유형뿐만 아니라 하위 클래스도 확인하므로 보다 일반화된 예외 처리 테스트에 적합합니다. assertThrows()assertion 메서드는 throw된 예외 객체를 반환하여 해당 객체에 대한 추가 assertion을 수행할 수 있습니다.
사용 중assertThrowsExactly()
이 assertThrowsExactly()메서드는 발생한 예외가 정확히 특정 유형인지 확인해야 할 때 사용되며, 예상 예외 유형의 하위 클래스는 허용하지 않습니다. 이는 정확한 예외 처리 동작을 검증해야 할 때 유용합니다. 와 유사하게 assertThrows(), assertThrowsExactly()assertion 메서드는 발생한 예외 객체를 반환하여 추가 assert를 수행할 수 있도록 합니다.
5.7.4. 예외가 예상되지 않는다는 주장
테스트 메서드에서 발생한 모든 예외로 인해 테스트가 실패하지만, 테스트 메서드 내의 주어진 코드 블록에 대해 예외가 발생 하지 않는다는assertDoesNotThrow() 것을 명시적으로 단언하는 것이 유익할 수 있는 특정 사용 사례가 있습니다. 단언은 특정 코드 조각이 예외를 발생시키지 않는다는 것을 확인하고 싶을 때 사용할 수 있습니다.
타사 어설션 라이브러리는 종종 유사한 지원을 제공합니다. 예를 들어 AssertJ에는 assertThatNoException().isThrownBy(() → …). 또한 참조: 타사 어설션 라이브러리 . |
2.8. 테스트 비활성화
전체 테스트 클래스나 개별 테스트 방법은 주석, 조건부 테스트 실행 에서 설명한 @Disabled주석 중 하나 또는 ExecutionCondition사용자 정의를 통해 비활성화 할 수 있습니다.
클래스 수준에서 적용 하면 @Disabled해당 클래스 내의 모든 테스트 메서드도 자동으로 비활성화됩니다.
테스트 메서드가 를 통해 비활성화되면 @Disabled테스트 메서드와 메서드 수준 라이프사이클 콜백(예: @BeforeEach메서드, 메서드 및 해당 확장 API)의 실행이 방지됩니다. 그러나 테스트 클래스가 인스턴스화되는 것을 방지하지는 않으며 @BeforeAll메서드, @AfterAll메서드 및 해당 확장 API @AfterEach와 같은 클래스 수준 라이프사이클 콜백의 실행도 방지하지 않습니다 .
@Disabled 테스트
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
@Disabled("Disabled until bug #99 has been fixed")
class DisabledClassDemo {
@Test
void testWillBeSkipped() {
}
}
그리고 @Disabled테스트 메서드를 포함하는 테스트 클래스
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
class DisabledTestsDemo {
@Disabled("Disabled until bug #42 has been resolved")
@Test
void testWillBeSkipped() {
}
@Test
void testWillBeExecuted() {
}
}
@Disabled이유를 제공하지 않고도 선언될 수 있습니다 . 그러나 JUnit 팀은 개발자가 테스트 클래스 또는 테스트 메서드가 비활성화된 이유에 대한 간단한 설명을 제공할 것을 권장합니다. 결과적으로 위의 예는 모두 이유의 사용을 보여줍니다. 예를 들어, . 일부 개발 팀은 자동화된 추적성을 위해 이유@Disabled("Disabled until bug #42 has been resolved") 에 문제 추적 번호가 있어야 한다고 요구하기도 합니다 . |
@Disabled 은 @Inherited 가 아니다. 따라서 슈퍼클래스가 있는 @Disabled클래스를 비활성화하려면 서브클래스에서 @Disabled다시 선언해야 합니다 . |
.