[TIL] jest와 supertest 모듈을 이용한 테스트 코드 구현하기
테스트가 필요한 이유
- 제품의 안정성을 높인다.
- 기능 추가 및 수정으로 인한 부작용(Side-effect)를 줄일 수 있다.
- 불안감 없이 코드 작성을 할 수 있도록 도와준다.
- 결과적으로 생산성을 매우 높여 준다.
- 디버깅을 쉽게 해준다.
- 개발 과정에서 반복적인 작업들을 하지 않도록 도와준다
- 더 깔끔하고 재사용성이 좋은 코드 작성을 가능하게 해준다.
테스트 코드 종류
- Unit Test - 작은 규모 (클래스 또는 메소드 수준)의 기능 테스트
- Integration Test - 여러가지 기능을 합쳤을 때 생길 수 있는 문제 (외부 라이브러리까지 묶어서 검증, DB 접근, 전체 코드 등등) 테스트
- Acceptance Test - 사용자의 스토리 (시나리오)에 맞춰 수행하는 테스트 (비지니스적인 관점)
- E2E (End-to-end) Test: 테스트하고자 하는 기능에서 필요로 하는 모든 컴포넌트들이 올바르게 협업해서 최종적으로 원하는 결과를 내는지 확인하는 테스트 (기술적인 관점)
Layered Architecture에서의 테스트 코드
- Mock Functions: 특정 methods를 mocking하기 위해 사용됌. 즉, 테스트에서 시간 또는 비용이 많이 들거나 의존성이 있는 코드를 실제로 실행하지 않고 호출 여부, 입력한 값의 일치 여부와 같은 정보를 확인하기 위해 사용되는 가짜 객체
- DI (Dependency Injection): 객체들간의 의존성을 사용하려는 객체로 전달하려는 것을 의미. 즉, 하나의 객체가 다른 객체에게 의존성을 제공하는 방법. => Mock functions를 이용한 Mocking을 수행할 수 있도록 도와줌
* Constructor Injection: DI를 구현하기 위한 방법 중 하나. 객체의 생성자를 호출할 때, 의존성을 전달하여 해당하는 객체는 전달받은 의존성을 이용해 코드를 실행함.
- Unit Test
- jest: layer별 테스트
- Repository layer test
- Service layer test
- Controller layer test
- Integration Test
- Supertest + jest: API별 Request & Response 테스트