작성
·
453
0
혹시나 저와 같은 이슈를 만나셨을 분이 있으실까봐 글을 남깁니다.
강의 36:36 에서 강사님께서 teardown 을 정의해주실 때 @AfterEach 를 사용해서 매 테스트가 종료될때마다 db 를 깔끔하게 지워주도록 정의해주셨습니다.
해당 클래스( ProductServiceTest.class
) 에서 실행할 때는 문제가 되지 않고 정상적으로 작동을 합니다.
그러나 다른 테스트(ex, OrderServiceTest.class
) 에서는 @BeforeEach 를 사용해서 teardown 을 구현했는데 이 때문에 간극이 생겨 전체 테스트 를 돌렸을때 ProductServiceTest.class
에서 에러 가 발생합니다.
따라서 @BeforeEach
로 변경하여서 해결할 수 있었습니다.
답변 2
1
안녕하세요, leeseongju 님! :)
네, 맞습니다. 테스트 데이터의 클렌징 시점은 테스트 간 독립성을 보장하기 위해 모든 테스트에서 동일하게 맞춰주는 것이 좋습니다.
그리고 추가적으로, @BeforeEach
로 클렌징을 하는 것 보다는 @AfterEach
로 클렌징을 하는 것을 추천드리는데요.
매 테스트 클래스에서 테스트 수행 이전에 이미 만들어져 있는 데이터를 클렌징하려고 하면, 어디부터 어디까지 클렌징을 해야할지 그 범위가 애매할 수 있습니다.
테스트에 사용하려는 픽스처 데이터에 관련된 것들만 클렌징하면 되지 않나 라고 생각할 수도 있지만, 프로젝트의 복잡도가 높을수록 알게모르게 내부적으로 서로 영향을 끼치는 데이터들도 생길 수 있기 때문입니다.
작업하는 사람에 따라 클렌징 작업을 누락하고 테스트 코드를 작성할 가능성도 높고요.
따라서 테스트에 사용한 데이터를 테스트 이후에 각 테스트에서 모두 클렌징해주도록 구성하는 것이 좀 더 나은 방법이라고 생각합니다.
도움이 되셨기를 바랍니다.
감사합니다. :)
0
안녕하세요, 인프런 AI 인턴입니다.
JUnit에서 제공하는 @AfterEach
어노테이션은 각 테스트 메서드가 실행된 후에 실행되어야 하는 정리(cleanup) 코드를 정의할 때 사용합니다. @AfterEach
는 Class 내에 존재하는 각각의 테스트가 종료될 때마다 실행되기 때문에, 테스트 간의 독립성을 보장하기 위한 용도로 사용됩니다. leeseongju님의 케이스처럼 다른 테스트 클래스에서 상태를 공유하는 경우, 하나의 클래스에서 @AfterEach
를 사용한 테스트의 결과가 다른 테스트 클래스에 영향을 미칠 수 있습니다.
OrderServiceTest.class
에서 @BeforeEach
를 사용했다면, 간극이 생겨 ProductServiceTest.class
에서 에러가 발생한 경우 다음과 같은 가능성을 생각해 볼 수 있습니다:
ProductServiceTest.class
의 테스트가 실패했을 수 있습니다.@BeforeEach
와 @AfterEach
가 서로 다른 테스트 클래스에서 동일한 상태에 대해 조작을 가하기 때문에 테스트의 결과가 변경된 것일 수 있습니다.일반적으로 테스트 간의 상태를 공유하는 것은 좋지 않으며, 각 테스트 메서드가 독립적으로 실행될 수 있도록 설계하는 것이 바람직합니다. 테스트 상태의 관리나 초기화는 매우 중요하기 때문에 사용하는 리소스와 테스트 케이스의 특성에 따라 @BeforeEach
, @AfterEach
, @BeforeAll
, @AfterAll
등의 어노테이션을 적절히 활용해야 합니다.
참고 링크: Spring Boot Testing
안녕하세요 우빈님
친절한 답변 너무 감사드립니다. 그리고 팁도 알려주셔서 정말 감사드립니다.
다만 궁금한 부분이 있는데
매 테스트 클래스에서 테스트 수행 이전에 이미 만들어져 있는 데이터를 클렌징하려고 하면, 어디부터 어디까지 클렌징을 해야할지 그 범위가 애매할 수 있습니다.
라고 말씀하셨는데, 간단한 예시를 들어주실 수 있으실까요???
글로만 보았을때는 와닷지가 않습니다 ㅠㅠ
답변 너무 감사드립니다.