-
Notifications
You must be signed in to change notification settings - Fork 0
테스트 코드 작성을 통한 협업
단위 테스트 코드를 작성함으로써 구현된 함수(기능)에 대해서 신뢰성을 부여하고자 했습니다.
이 신뢰성을 바탕으로 다른 팀원이 만든 코드가 정상적으로 동작하는 지 체크해야하는 과정 등을 생략함으로써 협업 과정을 수월하게 만들었습니다.
controller <-> service <-> repository
에 구현된 각각의 기능을 이어붙혔을 때 올바르게 동작하는지 확인할 필요가 있었습니다.
그 방법으로 통합 테스트 코드를 작성했습니다.
통합 테스트 코드를 작성하기 이전에는 동작 확인을 위해 postman 과 같은 툴을 이용하여 직접 서버에 요청을 보내고, 해당 요청을 통해 생성된 데이터를 삭제하는 등의 다소 귀찮은 작업을 반복해야 했습니다.
하지만 테스트용 DB 서버를 이용하여 통합 테스트 코드를 작성한 이후에는 위에서 설명한 귀찮은 작업들을 할 필요가 없어졌기 때문에 더 편하고 부담없이 리팩토링을 진행할 수 있었습니다.
서버 구조는 controller
, service
, repository
로 나뉘어 있었습니다. controller
는 service
의 함수들을 의존하고, service
는 repository
를 의존하고 있었습니다.
따라서 각 계층 별로 단위 테스트를 진행하기 위해서는 다른 계층을 의존하고 있는 부분을 제거해야 했습니다. 의존성을 제거하기 위해서 Jest 에서 제공하는 mock 함수를 이용하기로 했습니다.
테스트 하려는 코드가 의존하고 있는 함수들을 mock 함수로 만든다는 것은 의존하고 있는 함수(또는 객체)를 가짜로 만들어 의존성을 제거하고 mock 함수로 만들어진 함수의 동작을 통제할 수 있습니다. 따라서 테스트 하고자 하는 코드에만 오롯이 집중할 수 있게 됐습니다.
또한, Jest 에서 정의하는 mock 함수는 다른 코드에 의해 간접적으로 호출되는 함수의 동작을 감시할 수 있기 때문에 spy 라고도 불립니다. 즉, 단위 테스트를 진행하는 동안 가짜로 만든 mock 함수가 의도된 횟수만큼 호출되는지 등에 대한 정보도 확인이 가능합니다.
이러한 기능을 통해 의존성을 제거함과 동시에, 함수의 동작을 더욱 디테일하게 확인할 수 있습니다.
Repository 계층은 DB 에 직접적으로 CRUD 를 하는 계층입니다. 이 계층을 테스트 하기 위해 제품에 쓰이는 DB 를 사용할 수는 없었습니다.
제품에 쓰이는 DB 를 사용하지는 않지만, DB 에 의도한 동작이 정상적으로 되는지 확인하기 위한 방법을 찾아야 했습니다. 이를 해결하기 위한 방법으로 mongodb-memory-server 패키지를 이용하기로 했습니다.
mongodb-memory-server 패키지는 개발 또는 테스트 용으로 nodejs 내에서 실제 MongoDB 서버를 동작시킵니다. 이렇게 실행된 DB 서버는 기본적으로 메모리에 데이터를 저장합니다.
이를 통해 DB 에 직접적으로 접근해야하는 함수들도 제품에 쓰이는 DB 에 영향을 주지 않고 단위 테스트가 가능해졌습니다.
단위 테스트 코드를 작성함으로써, 각 함수들의 동작을 신뢰할 수 있게 되고 리팩토링도 더욱 편하게 할 수 있게 됐습니다.
하지만 각 단위가 잘 동작한다고 단위들이 연결된 하나의 기능이 제대로 동작한다고 확신할 수는 없었습니다.
따라서 이를 확인하기 위해 통합 테스트 코드를 작성하기로 했고, Nest.js 에서 기본적으로 제공하는 SuperTest 라이브러리를 사용했습니다.
SuperTest 를 통해 마치 사용자의 프로그램 내의 상호작용을 통해 요청을 보낸 것처럼, 테스트 코드 내에서 api 요청을 보낼 수 있었습니다.
최종적으로 SuperTest 와 mongodb-memory-server 를 이용하여 테스트 코드 내부에서 자체적으로 요청을 보내고 DB 에 CRUD 가 되는 과정 전체의 테스트가 가능했습니다.
물론, 제품에 쓰이는 DB 와 독립적인 테스트용 DB 였기 때문에, 배포되고 있는 서비스에 영향을 끼칠 일도 없었습니다.
통합 테스트 코드를 작성함으로써, 해당 기능을 구현하지 않은 다른 팀원도 각 api 가 정상적으로 동작하는지 테스트를 통해 검증이 가능했습니다.
- 📃 기획서
- 📂 Backlog
- 📊 ERD, 폴더 구조
- 🗓️ 회의록