일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 미션
- 자바
- 우아한테크코스
- Docker
- 프리코스
- CircuitBreaker
- 세션
- mock
- 스프링 부트
- 의존성
- 서블릿
- Level2
- 우아한세미나
- 백준
- Spring Batch
- AWS
- REDIS
- 코드리뷰
- JPA
- HTTP
- AOP
- 프로그래머스
- 우테코
- 트랜잭션
- Paging
- MSA
- 스프링부트
- yml
- 레벨2
- JUnit5
Archives
- Today
- Total
늘
[테스트 자동화 2] @AfterEachCallBack을 통해 롤백 자동화하기 본문
728x90
이전의 게시글에서 필자의 서비스에서 테스트는 @Tansactional을 통한 롤백을 제거했다.
이후, 매번 테스트에서 아래의 사진처럼 DatabaseCleaner를 주입받아 반복적으로 @AfterEach로 테스트가 끝난 후, 롤백을 진행해 주었다.
최근에 우아한테크코스 리펙토링 미션을 진행하면서 해당 방식에 대해서 알게 되었다. 이후, Junit5의 공식 문서를 확인해봤고 해당 기술에 대해서 알게 되었다.
- BeforeAllCallback - @BeforeAll 적용된 메서드 전에 실행(가장 먼저 실행된다.)
- BeforeEachCallback - @BeforeEach 적용된 메서드전에 실행
- BeforeTestExecutionCallback - 각 테스트가 실행되기 직전에 실행(@Before후에 실행된다.)
- AfterTestExecutionCallback : 각 테스트가 종료 후 실행(@AfterEach전에 실행된다.)
- AfterEachCallback : @AfterEach 적용된 메서드 종료 후 실행
- AfterAllCallback : 모든 테스트 종료 후 실행 (가장 나중에 실행된다.)
BeforeAllCallback과 AfterAllCallBack은 딱 한 번만 실행된다.
아래는 Junit 5의 AfterEachCallBack을 활용하여 자동으로 테스트가 끝난 후에 롤백을 시켜주는 방식이다.
RollbackExtension
public class RollbackExtension implements AfterEachCallback {
@Override
public void afterEach(ExtensionContext context) {
DatabaseCleaner databaseCleaner = SpringExtension.getApplicationContext(context).getBean(DatabaseCleaner.class);
databaseCleaner.tableClear();
}
}
@ServiceTest
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(RollbackExtension.class)
@SpringBootTest
public @interface ServiceTest {
}
이렇게 적용만 해주면 끝! 사용법은 간단했다.
이제 매번 DatabaseCleaner를 Autowired로 선언 안 해줘도 되고 @AfterEach로databaseClear.tableClear()를 실행시키지 않아도 된다. 매번 테스트가 돌고난 후, 자동으로 테이블을 초기화시킬 수 있다.
이를 통해, 아래와 같이 공식팀의 테스트 자동화가 변했다.
- truncate.sql로 매번 레포지토리를 추가해서 롤백하는 방식
- entityManager를 활용해서 자동으로 테이블의 이름을 매핑해서 truncate 시켜주는 방식
- 매 테스트마다 @AfterEach를 선언해서 롤백시켜주는 방식
- @AfterEachCallback을 통해 매 테스트마다 반복적인 작업을 제거
Reference
https://junit.org/junit5/docs/5.4.0/api/org/junit/jupiter/api/extension/AfterEachCallback.html
728x90
'우아한테크코스 4기 > 프로젝트' 카테고리의 다른 글
[Event] 이벤트를 이용한 성능 개선 및 의존성 분리 경험 (2) | 2023.02.17 |
---|---|
JPA(ORM)의 영속성컨텍스트에서 더티체킹이 좋은걸까? Lock을 통해 해결해보자(MVCC를 지원하는 DB를 사용할 때) (0) | 2022.10.22 |
캐시(2) 눈물나는 레디스 적용기 그런데 EmbeddedRedis가 아닌 TestConatiner를 활용한 테스트 격리와 함께 (3) | 2022.10.11 |
캐시(1) Redis란? (5) | 2022.10.09 |
공식팀의 테스트코드 최적화 with 테스트 격리 (0) | 2022.10.08 |
Comments