teardown 시 @AfterEach 주의
556
작성한 질문수 10
혹시나 저와 같은 이슈를 만나셨을 분이 있으실까봐 글을 남깁니다.
강의 36:36 에서 강사님께서 teardown 을 정의해주실 때 @AfterEach 를 사용해서 매 테스트가 종료될때마다 db 를 깔끔하게 지워주도록 정의해주셨습니다.
해당 클래스( ProductServiceTest.class) 에서 실행할 때는 문제가 되지 않고 정상적으로 작동을 합니다.
그러나 다른 테스트(ex, OrderServiceTest.class) 에서는 @BeforeEach 를 사용해서 teardown 을 구현했는데 이 때문에 간극이 생겨 전체 테스트 를 돌렸을때 ProductServiceTest.class 에서 에러 가 발생합니다.
따라서 @BeforeEach 로 변경하여서 해결할 수 있었습니다.
답변 2
1
안녕하세요, leeseongju 님! :)
네, 맞습니다. 테스트 데이터의 클렌징 시점은 테스트 간 독립성을 보장하기 위해 모든 테스트에서 동일하게 맞춰주는 것이 좋습니다.
그리고 추가적으로, @BeforeEach 로 클렌징을 하는 것 보다는 @AfterEach 로 클렌징을 하는 것을 추천드리는데요.
매 테스트 클래스에서 테스트 수행 이전에 이미 만들어져 있는 데이터를 클렌징하려고 하면, 어디부터 어디까지 클렌징을 해야할지 그 범위가 애매할 수 있습니다.
테스트에 사용하려는 픽스처 데이터에 관련된 것들만 클렌징하면 되지 않나 라고 생각할 수도 있지만, 프로젝트의 복잡도가 높을수록 알게모르게 내부적으로 서로 영향을 끼치는 데이터들도 생길 수 있기 때문입니다.
작업하는 사람에 따라 클렌징 작업을 누락하고 테스트 코드를 작성할 가능성도 높고요.
따라서 테스트에 사용한 데이터를 테스트 이후에 각 테스트에서 모두 클렌징해주도록 구성하는 것이 좀 더 나은 방법이라고 생각합니다.
도움이 되셨기를 바랍니다.
감사합니다. :)
0
안녕하세요 우빈님
친절한 답변 너무 감사드립니다. 그리고 팁도 알려주셔서 정말 감사드립니다.
다만 궁금한 부분이 있는데
매 테스트 클래스에서 테스트 수행 이전에 이미 만들어져 있는 데이터를 클렌징하려고 하면, 어디부터 어디까지 클렌징을 해야할지 그 범위가 애매할 수 있습니다.
라고 말씀하셨는데, 간단한 예시를 들어주실 수 있으실까요???
글로만 보았을때는 와닷지가 않습니다 ㅠㅠ
답변 너무 감사드립니다.
0
안녕하세요, 인프런 AI 인턴입니다.
JUnit에서 제공하는 @AfterEach 어노테이션은 각 테스트 메서드가 실행된 후에 실행되어야 하는 정리(cleanup) 코드를 정의할 때 사용합니다. @AfterEach는 Class 내에 존재하는 각각의 테스트가 종료될 때마다 실행되기 때문에, 테스트 간의 독립성을 보장하기 위한 용도로 사용됩니다. leeseongju님의 케이스처럼 다른 테스트 클래스에서 상태를 공유하는 경우, 하나의 클래스에서 @AfterEach를 사용한 테스트의 결과가 다른 테스트 클래스에 영향을 미칠 수 있습니다.
OrderServiceTest.class에서 @BeforeEach를 사용했다면, 간극이 생겨 ProductServiceTest.class에서 에러가 발생한 경우 다음과 같은 가능성을 생각해 볼 수 있습니다:
- 공유하는 리소스(DB 등)의 상태가 예상치 못하게 변경되어,
ProductServiceTest.class의 테스트가 실패했을 수 있습니다.
@BeforeEach와@AfterEach가 서로 다른 테스트 클래스에서 동일한 상태에 대해 조작을 가하기 때문에 테스트의 결과가 변경된 것일 수 있습니다.
일반적으로 테스트 간의 상태를 공유하는 것은 좋지 않으며, 각 테스트 메서드가 독립적으로 실행될 수 있도록 설계하는 것이 바람직합니다. 테스트 상태의 관리나 초기화는 매우 중요하기 때문에 사용하는 리소스와 테스트 케이스의 특성에 따라 @BeforeEach, @AfterEach, @BeforeAll, @AfterAll등의 어노테이션을 적절히 활용해야 합니다.
참고 링크: Spring Boot Testing
private 상수 테스트 관련 질문
0
81
1
void는 어떻게 테스트하나요..? void로 애초에 코딩하면 안되나요??
0
123
2
커버리지는 어떻게 활용하시는지 궁금합니다.
0
158
2
테스트 문서화 질문입니다
0
104
2
단위테스트 질문이 있습니다
0
93
2
컨트롤러는 모킹을 한 이유가 궁금합니다.
0
100
2
ERD 가장자리에 있는 도메인 테스트 질문
0
86
2
DTO 검증 필드에 대한 테스트 코드 작성은 어디까지?
0
131
2
OrderCreateRequest DTO에 대해서 궁금한점
0
101
2
고전파의 테스트 대역 사용 대상, 공유 의존성
0
153
2
계층 관련 질문이 있습니다.
0
137
3
'코틀린'에서는 빌더를 따로 쓰지 않는데, 이 때는 어떻게 test fixture를 만드시는지 궁금합니다
1
121
2
혹시 update 로직은 어떻게 테스트하나요? (@Setter?)
0
133
2
단위테스트와 통합테스트의 경계가 궁금합니다.
0
224
2
Service+Repository 통합테스트 관련 질문입니다.
0
149
2
OrderControllerDocsTest 작성 해봤는데요. 날짜 형식이 이상하게 나와요
0
183
2
test 용 .yml
0
89
2
throws Exception
0
78
2
카페키오스크 클래스 문의 ,,
0
87
2
Rest docs 문서용 테스트코드를 따로 작성해야 되나요?
0
171
2
테스트 코드에서 필요한 생성자
0
135
1
tearDown 순서
0
113
2
@Builder 생성자 private
0
132
2
@DisplayName gradle / intellJ
0
90
2





