JUnit의 @TestInstance 애너테이션의 용도는?
_____A1: @TestInstance는 JUnit 5에서 테스트 클래스의 인스턴스 생성 방식을 제어하는 애너테이션입니다. 기본적으로는 각 테스트 메서드마다 새로운 테스트 클래스 인스턴스를 생성하지만, @TestInstance를 사용하면 인스턴스 생명주기를 클래스 단위로 변경할 수 있습니다.
Q2: @TestInstance 애너테이션을 사용하는 이유는 무엇인가요?
A2: 테스트 클래스 인스턴스 생명주기를 변경하면, 테스트 메서드 간에 인스턴스 변수를 공유할 수 있어 상태를 유지하거나, 매번 객체를 새로 생성하는 비용을 줄일 수 있습니다. 또한 @BeforeAll, @AfterAll 메서드를 static이 아닌 인스턴스 메서드로 작성할 수 있게 됩니다.
Q3: @TestInstance 애너테이션의 주요 속성은 무엇인가요?
A3:
- value: TestInstance.Lifecycle enum 값을 지정합니다.
- PER_METHOD (기본값): 각 테스트 메서드 실행 시 새로운 인스턴스를 생성합니다.
- PER_CLASS: 테스트 클래스 당 하나의 인스턴스만 생성하여 모든 테스트 메서드가 이를 공유합니다.
Q4: @TestInstance(Lifecycle.PER_CLASS)와 PER_METHOD의 차이는 무엇인가요?
A4:
- PER_CLASS: 테스트 클래스 인스턴스가 한 번만 생성되어 모든 테스트 메서드가 동일한 인스턴스를 공유합니다. 인스턴스 필드를 통해 상태를 공유하거나 변화를 추적할 수 있습니다.
Q5: @TestInstance를 사용할 때 주의할 점은 무엇인가요?
A5: PER_CLASS 생명주기를 사용할 때는 테스트 메서드 간에 상태가 공유되므로 테스트의 독립성이 훼손될 수 있습니다. 따라서 상태가 의도치 않게 변경되어 다른 테스트에 영향을 줄 수 있으니, 상태 관리에 신경 써야 합니다. 또한 멀티스레드 환경에서는 동기화가 필요할 수 있습니다.
Q6: @BeforeAll과 @AfterAll 메서드 작성 시 @TestInstance와 어떤 관계가 있나요?
A6: PER_METHOD에서는 @BeforeAll, @AfterAll 메서드를 반드시 static 메서드로 작성해야 하지만, PER_CLASS에서는 인스턴스 메서드로 작성할 수 있습니다. 즉, @TestInstance(Lifecycle.PER_CLASS)를 사용하면 static 키워드 없이 생명주기 관련 메서드를 작성할 수 있습니다.
요약:
- @TestInstance는 JUnit 5에서 테스트 클래스 인스턴스 생성 방식을 제어한다.
- 기본은 PER_METHOD, 즉 각 테스트마다 새 인스턴스를 생성한다.
- @TestInstance(Lifecycle.PER_CLASS)를 사용하면 테스트 클래스 하나의 인스턴스가 모든 테스트 메서드에서 공유된다.
- 인스턴스 필드를 활용한 상태 공유나 non-static @BeforeAll/@AfterAll 작성이 가능하다.
- 다만 상태 공유로 인한 테스트 간 의존성 문제나 동시 실행 이슈에 유의해야 한다.
기본적으로 JUnit 5는 각 테스트 메서드 실행 시마다 새로운 테스트 클래스 인스턴스를 생성하는 방식을 사용합니다.
이는 테스트 메서드 간에 상태가 공유되는 것을 방지하고, 테스트의 독립성을 보장하기 위한 설계입니다.
하지만 때로는 테스트 클래스 내의 여러 테스트 메서드가 같은 상태를 공유하거나, 초기화 비용이 큰 객체를 재사용해야 할 필요가 있습니다.
이럴 때 @TestInstance 애너테이션을 사용해서 인스턴스 생성 방식을 변경할 수 있습니다.
@TestInstance는 주로 두 가지 모드를 지원합니다: 1. PER_METHOD (기본값) - JUnit이 각 테스트 메서드를 실행할 때마다 새로운 테스트 클래스 인스턴스를 생성합니다.
- 테스트 메서드 간 상태 공유가 없고 독립적인 실행이 보장됩니다.
- @BeforeEach, @AfterEach 같은 메서드에서는 항상 새로운 인스턴스의 상태를 다룹니다.
2. PER_CLASS - 테스트 클래스 당 하나의 인스턴스만 생성하고, 모든 테스트 메서드는 동일한 인스턴스에서 실행됩니다.
- 이를 통해 테스트 메서드 간에 인스턴스 변수 등 상태를 공유할 수 있습니다.
- 초기화 비용이 큰 객체를 필드에 할당하고 재사용하기 유리합니다.
- 그러나 테스트 간 상태가 공유되므로 테스트 독립성에 주의가 필요합니다.
- 또한 PER_CLASS 모드에서는 `@BeforeAll`과 `@AfterAll` 메서드가 정적(static)일 필요가 없으며, 인스턴스 메서드로도 선언할 수 있게 됩니다.
@TestInstance 애너테이션은 JUnit 5 테스트 클래스 인스턴스의 생명 주기(생성 시기와 횟수)를 제어하여, 테스트 메서드 간 상태 공유 여부 및 초기화 전략을 선택하는 역할을 합니다.
PER_CLASS 모드를 선택하면 여러 테스트가 같은 인스턴스를 공유하여 상태 유지가 가능하고, 초기화 비용을 절감할 수 있지만, 테스트 독립성 관리에 신경 써야 합니다.
PER_METHOD 모드는 기본 설정으로 각 테스트를 완전하게 독립적으로 실행합니다.
작성자:
최하윤 [비회원]
| 작성일자: 1년 전
2025-05-26 02:51:22
조회수: 167 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 167 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.