Back End/테스트코드

[테스트코드] Test Fixture 로 *.sql 파일을 사용해도 될까?

DevPing9_ 2023. 10. 2. 17:12

Test Fixture 세팅

회사에서 레거시 SSR 프로젝트를 FE/BE 가 각각 작업할 수 있도록 분리한적이 있었다.

 

해야할 일이 너무나도 많았다.

 

  1. View 에서 필요한 API 들의 목록을 정리 및 새롭게 작성
  2. 언어를 Java 에서 Kotlin 으로 변경
  3. Spring Framework 5 에서 Spring Boot 2.7.3 으로 변경
  4. JPA, Security 환경 세팅
  5. 모든 API 에 대한 독립 인수테스트 작성
  6. 코드 리팩토링

 

대충 위와 같은데, Kotlin 을 처음 다뤄보던 시기라 환경설정부터 Java 와 다르게 동작하는 경우가 잦았다.

시간의 압박때문에 타협을 본 것 중 하나가 Test Fixture 를 *.sql 파일을 이용하여 작성하였다는 것이다.

 

@Sql(
    value = [
        "classpath:db/stage/products.sql",
    ]
)
@Inherited
annotation class InsertProduct
@Suppress("ClassName", "NonAsciiCharacters")
@DisplayName("유저 상품 조회 인수 테스트")
@InsertProduct
class UserProductsAcceptanceTest : CommonAcceptanceTest() {
    // some test codes
}

 

그리고 그 대가를 곧이어 되돌려 받았다.

 


선생님, 기술부채를 갚으셔야죠?

*.sql 에 작성된 SQL 문을 단순히 실행하는 Test Fixture 는 컴파일 단계에서 에러를 잡을 수 없다.

 

그리고 DB 테이블에 컬럼 변경등이 일어난다면, sql 문을 하나씩 고쳐줘야하는데 여간힘든게 아니다. (컬럼 갯수가 많으면... 🫥)

 

기존 order 테이블 INSERT 문

INSERT INTO `order` (product_id, user, price, created_at, updated_at, arrived_at) VALUES (1, '핑구', 2000, '2019-02-27 09:03:34', '2019-02-27 11:03:34', '2019-02-30 09:03:34')

 

updated_at 이 삭제되고, canceled_at 을 추가해야 함

INSERT INTO `order` (product_id, user, price, created_at, arrived_at, canceled_at) VALUES (1, '핑구', 2000, '2019-02-27 09:03:34', '2019-02-30 09:03:34', '2019-02-30 09:03:36')

 

컬럼이 많을수록, 컬럼의 값이 길어질 수록, 수정해야하는 INSERT 문이 많을 수록 눈물이 주륵주륵 흐른다...

텍스트값에 특수문자가 들어가고, DB Keyword 와 겹치는 값이 있으면 또 이스케이핑 해줘야하지... 하하하...

순서 잘못넣으면 값 자체도 이상하게 들어가는 불상사도 생기고..

 

결국 눈물을 흘리며 Test Fixture 를 객체로 옮기며 작성하고 있다. 


Test Fixture 가 객체면 뭐가좋은데?

역시 뭐래도 제일 좋은 점은 컴파일에러로 변경이 필요한 부분을 인지할 수 있다는 것이다.

 

DB 에 대한 변경사항이 발생하면 엔티티에 수정사항이 생기게 되고,

해당 엔티티를 근간으로 만들어진 Test Fixture 는 당연히 IDE 에 의해 컴파일 단계에서 색출된다.

 

에러 문구도 런타임 때 발생하는 SQL 에러가 아닌, 단순한 언어적 레벨에서 색출되기 때문에 어디를 어떻게 고쳐야할지 인지하기 쉽다.

 

그리고 이스케이핑 안해도 된다 ㅎㅎ..

728x90