✨ 테스트의 중요성

1. 테스트를 왜 해야할까?
기능이 요구사항대로 잘 동작하고 있는지 확인하기 위해서
아무리 훌륭한 개발자여도 한번에 완벽한 코드를 구현할 수 없다. 🫠
테스트 방법
- 테스트 코드를 만들어 테스트 진행
- Swagger, Postman 등을 통해 여러 케이스들을 확인해보며 테스트를 진행
- QA 과정을 통해 UI, Front, Server 까지 한번에 테스트
local → dev → QA → (staging) → live
1. 버그를 조기에 발견 할 수 있다.
버그들을 개발 단계에서 미리 확인하고 수정할 수 있다.
2. 코드 품질을 개선 할 수 있다.
- 테스트 코드를 작성하기 어려운 기능들이 존재하는데 테스트 코드를 쉽게 만들기 위해 서비스 코드를 개선하게 된다.
3. 배포단계에서의 안정성을 보장해준다.
CICD(지속적 통합, 지속적 배포)가 적용이 되어있는 프로젝트는 특정 Branch에 Merge를 할때 마다 자동으로 서버 배포가 진행이 되는데 테스트 코드가 없다면 기능에 문제가 없는지 확실한 보장을 못해준다.
4. 코드 리팩토링이 쉬워지고 개선 하는것에 주저함이 없어진다.
5. 시간이 지날 수록 테스트를 해야하는 기능들이 많아진다.
서비스가 발전함에 따라 추가/변경되는 기능들이 너무 많아 사람이 테스트하기에는 중요도에 비해 시간을 할애하기 어려워진다.
충분한 테스트 코드로 기존 코드가 잘 동작하고 있다는 것을 확인해야한다. → 회귀 테스트
📌 지속 가능한 소프트웨어를 만들기 위해 테스트 코드는 필수이다.
2. 테스트 코드 작성의 원칙
1. FIRST 원칙
- F(Fast): 테스트 코드는 빠르게 실행되어야 한다.
- I(Isolated): 테스트는 독립적 이어야한다.
- R(Repeatable): 테스트 코드는 반복실행해도 항상 동일한 결과여야한다.
- S(Self-validating): 테스트 코드는 그 자체로 스스로 검증되어야 한다.
- T(Timely): 테스트 코드는 즉시 작성되어야 한다.
2. 테스팅 7원칙
- 테스트는 결함의 존재를 찾는 행위이다.
- 완벽한 테스트는 불가능하다. → 유저가 어떤 예외케이스를 발생 시킬지 예측할 수 없다.
- 테스트 구성은 가능한 빠르게 시작한다.
- 결함은 집중된다.
- 살충제 역설 → 동일한 테스트가 반복되면 새로운 결함을 발견할 수 없다. 테스트 코드도 지속적인 유지보수가 필요하다.
- 테스트는 정황에 의존적이다. → 서비스의 특성을 파악하고 그에 맞는 테스트를 진행해야한다.
- 오류가 부재함은 궤변이다. → 테스트의 목적은 많은 문제(결함)를 찾는 것에 있다.
3. 테스트
1. 단위 테스트(Unit Test)
- 범위: 함수, 메서드, 클래스 등 코드의 최소 단위에 대한 테스트
2. 통합 테스트(Integration Test)
- 범위: 여러 단위가 결합된 상태를 테스트하며, DB, 파일 시스템, 외부 API 등 일부 실제 의존성도 포함
4. 테스트 코드는 어떻게 작성해야할까?
경험에서 오는 문제 해결법(예외 처리)이 주니어와 시니어를 가르는 가장 큰 차이다.
- 한 가지 기능에 대해서 여러가지 상황을 생각하며 케이스를 구성
- 각 테스트 및 케이스들은 반드시 독립적으로 수행되어야 한다.
- 의미없는 테스트 코드 작성을 지양하자
📌 모든 케이스를 커버할 순 없지만, 최대한 커버해야 비교적 안전하고 유지보수가 가능한 소프트웨어 제작이 가능하다.