서비스계층의 상품의 등록 수정 삭제 API 테스트중
개별적인 메서드 테스트는 모두 통과했지만, 테스트 클래스 단위로 테스트를 실행하니 오류가 발생했다.
테스트 코드에서는 모두 PK를 1L으로 지정하고 단독적으로 수행할땐 문제없었지만
클래스단위로 순차적으로 테스트가 진행하니 Auto_Increment로 인해 PK값이 맞지않아 테스트가 반복적으로 실패했다.
이런 상황때문에 당연하게 TeadDown 메서드로
DeleteAllInBatch()를 적용했지만, 메서드 실행 후 테이블은 드랍되도 Auto_Increment로인해 올라가던 숫자는 그대로 이어졌다.
원하던건 항상 리파지토리가 텅비어지고 새로 생성되는 엔티티의 PK는 1이길원했지만
텅빈 리파지토리에 PK값이 2...3...값을 가지는 엔티티가 생성됬다...
환경에따라 성공되고 실패되는 테스트는 신뢰성이 떨어지기에 테스트환경의 독립성을 보장해야겠다 생각했다...
구글링을통해 해결한 방법은
@Sql Annotaion을 사용하는것.
클래스단위에 @Sql 적용시 모든 메서드 실행전마다 따로 작성해둔 SQL스크립트가 실행된다.
적어둔 스크립트는 다음과 같다.
처음에 MariaDB에서 사용하던대로 쿼리를 작성하니 스크립트 예외로 계속 실패했다;;
현재 개발단계에서 H2 InMemoryDB를 사용해 H2 Database에 맞는 문법으로 수정 후 테스트를 진행했더니
결과는 성공
이번 문제를 해결하면서 독립적인 테스트 환경 구성에대해 찾아봤는데
Auto_Increment를 의존하는 테스트 코드에 회의적인 의견을 읽게됬는데 애초에 프로덕션 코드부터 PK값을 의존하는 로직을 작성하면 안되는건지 궁금증이 생겼다...
우선은 PK값을 의존하는 프로덕션 코드 테스트시에는 @Sql을 이용해 테스트환경의 독립성을 보장해야겠다
'Error' 카테고리의 다른 글
테스트 환경에서 Cookie를 다루거나 검증해야할때 (0) | 2023.12.08 |
---|---|
스프링 이미지 출력 문제 (0) | 2023.10.06 |
fetch API 사용 과 DTO의 기본생성자 Issue (0) | 2023.08.31 |
JPA 양방향 참조관계 무한 루프 [Infinite recursion] (0) | 2023.08.12 |
LazyInitializationException (0) | 2023.08.12 |