본문 바로가기

Web/spring

[Spring Junit Test] 2.11. Test Instance Lifecycle

728x90

https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-instance-lifecycle

 

JUnit 5 User Guide

Although the JUnit Jupiter programming model and extension model do not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and custo

junit.org

 

잘못된 해석이 있다면 알려주세요 🐥

 


2.11. Test Instance Lifecycle

 

JUnit은 각 테스트 메소드를 격리된 상태에서 실행하고, 가변적인 테스트 인스턴스 상태로 인한 예기치 않은 부작용을 피하기 위해 각 테스트 메소드마다 테스트 클래스의 새 인스턴스를 생성한다(Test Classes and Methods 참조).

이 "per-method" 테스트 인스턴스 라이프사이클은 JUnit Jupiter의 기본 동작이며, 이전 버전의 JUnit과 유사합니다.

단, 조건에 따라 특정 테스트 메소드가 비활성화된 경우 (예: @Disabled, @DisabledOnOs 등), "per-method" 테스트 인스턴스 라이프사이클 모드가 활성화되어 있어도 테스트 클래스가 여전히 인스턴스화된다.


만약 JUnit Jupiter가 모든 테스트 메소드를 동일한 테스트 인스턴스에서 실행하길 원한다면, 테스트 클래스에 @TestInstance(Lifecycle.PER_CLASS)를 주석으로 달아준다.

이 모드를 사용하면 테스트 클래스마다 새로운 테스트 인스턴스가 생성된다.

따라서, 테스트 메소드가 인스턴스 변수에 저장된 상태에 의존하는 경우,

@BeforeEach 또는 @AfterEach 메소드에서 해당 상태를 재설정해야 할 수 있다.

"per-class" 모드는 기본 "per-method" 모드보다 몇 가지 추가적인 이점이 있다.

특히, "per-class" 모드에서는 static이 아닌 메소드 및 인터페이스 디폴트 메소드에 @BeforeAll 및 @AfterAll을 선언할 수 있다.

"per-class" 모드는 또한 @Nested 테스트 클래스에서 @BeforeAll 및 @AfterAll 메소드를 사용할 수 있게 한다.

Java 16부터는 @Nested 테스트 클래스에서 @BeforeAll 및 @AfterAll 메소드를 static으로 선언할 수 있다.

코틀린 프로그래밍 언어를 사용하여 테스트를 작성하는 경우, "per-class" 테스트 인스턴스 라이프사이클 모드로 전환하여 @BeforeAll 및 @AfterAll 메소드를 구현하는 것이 더 쉬울 수 있다.

 

 

 

2.11.1. 기본 테스트 인스턴스 라이프사이클 변경

@TestInstance로 주석이 달려 있지 않은 테스트 클래스나 인터페이스는 JUnit Jupiter에서 기본 라이프사이클 모드를 사용한다.

표준 기본 모드는 PER_METHOD이지만, 전체 테스트 계획의 실행에 대한 기본값을 변경할 수 있다.

기본 테스트 인스턴스 라이프사이클 모드를 변경하려면 junit.jupiter.testinstance.lifecycle.default 구성 매개변수를 TestInstance.Lifecycle에서 정의된 enum 상수 이름으로 설정하면 된다(대소문자 무시됨).

이는 JVM 시스템 속성으로 제공될 수 있고, Launcher에 전달되는 LauncherDiscoveryRequest의 구성 매개변수로 제공될 수 있으며, JUnit Platform 구성 파일을 통해 제공될 수 있다(자세한 내용은 Configuration Parameters 참조).

예를 들어, 기본 테스트 인스턴스 라이프사이클 모드를 Lifecycle.PER_CLASS로 설정하려면 다음과 같이 JVM을 시작하면 된다.

-Djunit.jupiter.testinstance.lifecycle.default=per_class

JUnit Platform 구성 파일을 통해 기본 테스트 인스턴스 라이프사이클 모드를 설정하는 것이 더 견고한 솔루션이며,

이는 구성 파일을 프로젝트와 함께 버전 관리 시스템에 체크인할 수 있기 때문에 IDE 및 빌드 소프트웨어에서 사용할 수 있다.

JUnit Platform 구성 파일을 통해 기본 테스트 인스턴스 라이프사이클 모드를 Lifecycle.PER_CLASS로 설정하려면 클래스 패스의 루트(예: src/test/resources)에 junit-platform.properties라는 이름의 파일을 만들고 다음 내용을 입력하면 된다.

junit.jupiter.testinstance.lifecycle.default = per_class

기본 테스트 인스턴스 라이프사이클 모드를 변경하면 일관되게 적용하지 않으면 예측할 수 없는 결과 및 취약한 빌드가 발생할 수 있다.

예를 들어, 빌드에서 "per-class" 의미론을 기본값으로 구성하지만 IDE에서 "per-method" 의미론을 사용하여 테스트를 실행하면 빌드 서버에서 발생하는 오류를 디버그하기가 어려울 수 있다.

따라서 JVM 시스템 속성을 통해 기본값을 변경하는 것이 아니라 JUnit Platform 구성 파일을 통해 기본값을 변경하는 것이 권장한다.

728x90