테스트에서 @Transactional을 사용하자

0️⃣1️⃣·2023년 9월 26일
0

개발

목록 보기
5/7
post-custom-banner

Version

  • H2 1.4.199

Situtation

  • 오래전부터 프로젝트에 멀티 모듈이 구성되어 있음
  • CI 서버에서 수행되는 gradle 테스트들의 시간이 오래 걸림
  • 일부 테스트들이 깨지는 현상이 있었음
org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Referential integrity constraint violation: "FKLLB77HOFD0KVVFLM6795V1NUR: PUBLIC.ORDER FOREIGN KEY(PRODUCT_ID) REFERENCES PUBLIC.PRODUCT(ID) (5518)"; SQL statement:

Analysis

  • H2에 ddl-autocreate-drop로 설정되어 있음
  • 테이블이 drop되는 과정에서, 데이터베이스 외래키 제약 조건을 맞추지 못하는 테스트 데이터들이 존재
  • 테스트 케이스가 워낙 많고, @DatabaseSetup을 쓰고 있는 상황이기 때문에 모든 데이터들을 수정하는 것은 보류

Trial

  • 테스트 데이터들이 정합성에 맞게끔 생성하는 것은 수정 범위가 크고, 비효율적이라고 생각
  • 테스트를 통해서 생성된 데이터들은 해당 클래스 범위에서만 유효하면 되고, 다른 클래스들에서는 보이지 않기 위해서 @Transactional 적용

Result

  • 테스트 클래스의 @Transactional을 적용하여 해당 데이터가 커밋되기전에 롤백하도록 변경
  • 테스트 클래스에서 롤백이 성공되면 아래의 로그를 확인할 수 있음
2023-09-18 23:38:17.234  INFO 93809 --- [           main] o.s.t.c.transaction.TransactionContext   : Rolled back transaction for test: [DefaultTestContext@609640d5 testClass = ...]
post-custom-banner

0개의 댓글