안녕하세요. 저희는 오늘의 길 이라는 서비스를 만들고 있는 Web09 조 입니다. 팀 구성원으로는 금장님, 민서님, 원진님, 그리고 저로 구성되어있습니다.

오늘의 길은 맛집 또는 데이트 장소와 같은 정보를 다양한 테마의 지도 및 코스에 담아 사용자들끼리 공유할 수 있는 서비스 입니다.

첫번째 핵심 경험으로 저희는 테스트 코드에 대해서 발표하겠습니다.

팀원들의 다양한 환경 및 CI 환경에서의 테스트를 고려하여 DB 컨테이너를 이용한 테스트 환경을 구성하기 위해 Testcontainers 라는 라이브러리를 이용했습니다.

우선 테스트가 시작되면 DB 컨테이너를 하나 띄우고 모든 테스트가 종료되면 컨테이너를 삭제합니다. 이러한 방식에서 두 가지 문제가 생겼습니다.

첫번째로는 각 테스트 파일 마다 컨테이너가 하나씩 생겨서 리소스 낭비가 심했습니다. 이를 해결하기 위해 컨테이너를 재사용할 수 있는 reuse 라는 메소드를 이용하여 하나의 컨테이너를 재사용할 수 있도록 방식을 개선했습니다.

개선한 과정에서 두번째 문제가 생겼습니다. jest는 하나의 테스트 파일에서는 각 테스트들이 독립적으로 실행이 되었지만, 여러 테스트를 동시에 진행하게 되면 테스트가 병렬적으로 진행되어 DB를 동시에 접근하여 테스트가 통과되지 않는 현상이 있었습니다. 이를 해결하기 위해 jest에 runInBand(런인밴드) 라는 속성을 부여해주었고 여러 파일의 테스트를 직렬적으로 진행할 수 있도록 변경하여 문제를 해결했습니다.

이때, 테스트를 직렬로 수행하면 속도가 저하되지 않을까 고민했었는데, 병렬 테스트 환경을 구성하는 시간을 절약할 수 있기에 속도가 비슷하거나 오히려 개선되었습니다.

오른쪽에 보이는 사진은 컨테이너가 켜지고 테스트가 돌고 컨테이너가 사라지는 모습입니다.

저희 팀은 테스트 전략에 대해서도 많이 고민을 했습니다. 모킹테스트와 통합테스트 중 많은 고민을 하였는데, 통합테스트를 통해 트랜잭션 처리에 관련한 부분을 테스트할 수 있고, 단위테스트로는 작동하지만 합쳤을 때 이것이 잘 작동할까에 대한 확신을 얻기 위해서 통합테스트를 작성하기로 결정했습니다.

또한 팀원이 맡아서 구현한 부분을 확실하게 이해하고 검증하기 위해 본인이 구현한 부분은 테스트를 하지 않고 팀원이 구현한 부분을 테스트 하는 식으로 나눠서 자신이 작성하지 않은 코드도 완벽하게 이해할 수 있었습니다.