기본 악기와 악보를 DB 시드로 넣고 나니 매퍼 테스트가 시드와 같은 ID에 다른 값을 넣어야 했습니다. 처음에는 고정 데이터를 넣기 직전에 시드 행을 지웠습니다. 깨끗한 DB에서는 동작했습니다. 가입 테스트가 먼저 회원을 커밋해 둔 상태에서는 테스트 본문을 실행하기도 전에 준비 단계가 실패했습니다.
기본 악기를 가리키는 외래 키
실제 HTTP로 가입하는 테스트는 회원 행을 커밋합니다. 그 행은 기본 악기인 단소를 참조합니다. 정상 실행에서는 회원 행을 정리하지만, 테스트가 중간에 멈추면 참조가 남을 수 있습니다. 그 상태에서 매퍼 테스트가 악기를 DELETE하면 MySQL은 외래 키 오류 1451로 막습니다.
이 문제를 검증할 때는 깨끗한 DB를 계속 초기화하는 대신, 시드의 기본 악기를 가리키는 회원 행 1개를 의도적으로 남겼습니다. 다른 테스트 회원과 ID가 겹치지 않도록 한 뒤 기존 픽스처를 실행해, 실패 이유가 실제로 외래 키인지 확인했습니다.
시드 ID를 유지한 값 갱신
악기 픽스처를 INSERT … ON DUPLICATE KEY UPDATE로 바꿨습니다. 기본 악기의 ID가 있으면 같은 행의 값을 테스트용으로 갱신합니다. 회원이 참조하는 행의 ID가 살아 있어 외래 키도 유지됩니다. 갱신은 매퍼 테스트 트랜잭션 안에서 이뤄지므로 테스트가 끝나면 시드 값으로 돌아갑니다. 커밋된 자식이 없던 곡과 장단 픽스처는 같은 트랜잭션에서 곡을 먼저 지우고 장단을 뒤에 지우는 방식을 유지했습니다. MySQL upsert 문서
같은 회원 행을 남겨 둔 채 다시 실행하자, 이전 픽스처에서 실패하던 검사가 새 픽스처에서는 통과했습니다. 이 변경은 테스트 준비를 잔여 데이터에 견디게 만들었습니다. 회원 행 자체를 정리하는 책임은 그 행을 만든 가입 테스트에 있습니다. 실패 조건을 만드는 데이터 한 행과 테스트가 보존해야 하는 부모 행을 따로 다룬 이유입니다.
테스트 데이터와 시드 분리
실제 포트로 보낸 HTTP 요청은 서버의 스레드와 트랜잭션에서 처리됩니다. 테스트 메서드가 롤백해도 서버가 커밋한 행은 남을 수 있습니다. 성장 API의 HTTP 테스트에서는 전용 ID 범위를 쓰고, 앞선 실행이 중간에 멈췄을 경우를 대비해 시작과 종료 때 그 범위의 행을 정리했습니다. 평가 행을 지운 뒤 세션을 지우는 식으로 외래 키가 가리키는 순서도 지켰습니다.
율명 픽스처는 다른 방식으로 고쳤습니다. 마이그레이션이 기준 율명 11개를 ID 1~11에 넣으면서 픽스처가 쓰던 ID 1·2와 겹쳤습니다. 중복 INSERT를 제거하고 기존 참조가 시드 행을 가리키게 했습니다. 매퍼 검사에서는 ID 1을 중, ID 11을 중청중으로 읽었습니다. 값을 바꿔야 했던 악기는 같은 행을 갱신했고, 값이 그대로 필요한 율명은 시드를 재사용했습니다.

댓글
댓글과 반응은 GitHub 계정으로 로그인해 남길 수 있어요.