인프런 커뮤니티 질문&답변

leeseongju님의 프로필 이미지
leeseongju

작성한 질문수

Practical Testing: 실용적인 테스트 가이드

Presentation Layer 테스트 (1)

teardown 시 @AfterEach 주의

작성

·

453

0

혹시나 저와 같은 이슈를 만나셨을 분이 있으실까봐 글을 남깁니다.

강의 36:36 에서 강사님께서 teardown 을 정의해주실 때 @AfterEach 를 사용해서 매 테스트가 종료될때마다 db 를 깔끔하게 지워주도록 정의해주셨습니다.

해당 클래스( ProductServiceTest.class) 에서 실행할 때는 문제가 되지 않고 정상적으로 작동을 합니다.

그러나 다른 테스트(ex, OrderServiceTest.class) 에서는 @BeforeEach 를 사용해서 teardown 을 구현했는데 이 때문에 간극이 생겨 전체 테스트 를 돌렸을때 ProductServiceTest.class 에서 에러 가 발생합니다.

따라서 @BeforeEach 로 변경하여서 해결할 수 있었습니다.

답변 2

1

박우빈님의 프로필 이미지
박우빈
지식공유자

안녕하세요, leeseongju 님! :)

네, 맞습니다. 테스트 데이터의 클렌징 시점은 테스트 간 독립성을 보장하기 위해 모든 테스트에서 동일하게 맞춰주는 것이 좋습니다.

그리고 추가적으로, @BeforeEach 로 클렌징을 하는 것 보다는 @AfterEach 로 클렌징을 하는 것을 추천드리는데요.
매 테스트 클래스에서 테스트 수행 이전에 이미 만들어져 있는 데이터를 클렌징하려고 하면, 어디부터 어디까지 클렌징을 해야할지 그 범위가 애매할 수 있습니다.
테스트에 사용하려는 픽스처 데이터에 관련된 것들만 클렌징하면 되지 않나 라고 생각할 수도 있지만, 프로젝트의 복잡도가 높을수록 알게모르게 내부적으로 서로 영향을 끼치는 데이터들도 생길 수 있기 때문입니다.
작업하는 사람에 따라 클렌징 작업을 누락하고 테스트 코드를 작성할 가능성도 높고요.

따라서 테스트에 사용한 데이터를 테스트 이후에 각 테스트에서 모두 클렌징해주도록 구성하는 것이 좀 더 나은 방법이라고 생각합니다.

도움이 되셨기를 바랍니다.
감사합니다. :)

leeseongju님의 프로필 이미지
leeseongju
질문자

안녕하세요 우빈님

친절한 답변 너무 감사드립니다. 그리고 팁도 알려주셔서 정말 감사드립니다.

다만 궁금한 부분이 있는데

 

매 테스트 클래스에서 테스트 수행 이전에 이미 만들어져 있는 데이터를 클렌징하려고 하면, 어디부터 어디까지 클렌징을 해야할지 그 범위가 애매할 수 있습니다.

 

라고 말씀하셨는데, 간단한 예시를 들어주실 수 있으실까요???

글로만 보았을때는 와닷지가 않습니다 ㅠㅠ

답변 너무 감사드립니다.

0

안녕하세요, 인프런 AI 인턴입니다.

JUnit에서 제공하는 @AfterEach 어노테이션은 각 테스트 메서드가 실행된 후에 실행되어야 하는 정리(cleanup) 코드를 정의할 때 사용합니다. @AfterEach는 Class 내에 존재하는 각각의 테스트가 종료될 때마다 실행되기 때문에, 테스트 간의 독립성을 보장하기 위한 용도로 사용됩니다. leeseongju님의 케이스처럼 다른 테스트 클래스에서 상태를 공유하는 경우, 하나의 클래스에서 @AfterEach를 사용한 테스트의 결과가 다른 테스트 클래스에 영향을 미칠 수 있습니다.

OrderServiceTest.class에서 @BeforeEach를 사용했다면, 간극이 생겨 ProductServiceTest.class에서 에러가 발생한 경우 다음과 같은 가능성을 생각해 볼 수 있습니다:

  1. 공유하는 리소스(DB 등)의 상태가 예상치 못하게 변경되어, ProductServiceTest.class의 테스트가 실패했을 수 있습니다.
  2. @BeforeEach@AfterEach가 서로 다른 테스트 클래스에서 동일한 상태에 대해 조작을 가하기 때문에 테스트의 결과가 변경된 것일 수 있습니다.

일반적으로 테스트 간의 상태를 공유하는 것은 좋지 않으며, 각 테스트 메서드가 독립적으로 실행될 수 있도록 설계하는 것이 바람직합니다. 테스트 상태의 관리나 초기화는 매우 중요하기 때문에 사용하는 리소스와 테스트 케이스의 특성에 따라 @BeforeEach, @AfterEach, @BeforeAll, @AfterAll등의 어노테이션을 적절히 활용해야 합니다.

참고 링크: Spring Boot Testing

leeseongju님의 프로필 이미지
leeseongju

작성한 질문수

질문하기