테스트 코드
- 개발자가 작성한 코드가 의도한 대로 동작하는 지 확인하기 위해 작성하는 코드
- 코드의 품질, 안정성을 유지
왜 테스트코드를 작성하는가?
- 변경한 코드가 기존 기능이 제대로 동작하는지 보장하는 안전장치 👷
- 문서화 효과 (테스트 코드)
- 코드 품질 향상
- 안정적인 배포
- 코드의 복잡성과 요구사항에 맞춰서 커버리지 설정 (100%일수는 없다)
- 비즈니스 로직에서 핵심적인 부분은 테스트 코드 작성
- 자주 변경되는 코드는 테스트코드를 기준으로 개발
CI/CD Pipeline
- 개발, 테스트, 배포 단계를 자동화한 워크 플로우
- CI : 코드를 정기적으로 통합, 변경사항에 대해 자동화된 테스트 실행
- CD : 통합된 코드 자동 배포
- 자동화된 테스트 실행 (유닛, 통합 테스트)
테스트 방식 : TDD와 BDD
TDD = Test Driven Development
- 개발자 관점
- 유닛 테스트 중심
- 테스트 우선 개발 → 테스트 실패 → 기능 개발 → 테스트 통과
BDD = Behavior Driven Development
- 시나리오 기반 테스트
- 비즈니스 요구사항 중심
- 서비스 최종 검증
테스트의 종류
유닛 테스트 Unit Test
- 작은 단위의 테스트
- JUnit, Spock, Mockito
통합 테스트 Integration Test
- 모듈간의 연동 테스트
- Repository, Service 등의 모듈이 제대로 동작하는지 검증
- 캐싱이 제대로 동작하는지 테스트
- SpringTest(@SpringBootTest, @MockBean), TestContainers
계약 테스트 Contract Test
- MSA 끼리의 API 계약이 올바르게 유지되고 있는지 확인
- FeignClient로 통신하는 부분들이 변경되지 않았는지 확인
- Pact, Spring Cloud Contract
End-to-End 테스트
- 시스템 전체가 통합된 방식으로 동작하는지 확인하는 테스트
- 시나리오 흐름이 정상동작하는지 확인
- Selenium, Cypress, Postman Colleciton
성능 테스트
- 응답시간, 처리속도, 시스템 리소스 사용량 등을 기반으로 어플리케이션 성능 테스트
- 대규모 트래픽, 부하상황에서의 어플리케이션 성능 측정
- JMeter, Gatling, nGrinder
- 개발 코드 단위 작동, 로직 오류 → 유닛 테스트
- MSA 내부 기능 동작 확인 → 통합 테스트
- MSA 간 API 통신 일관성 확인 → 계약 테스트
- 시나리오 기반 서비스 전체 테스트 → End to End 테스트
- 서비스의 성능 확인 → 성능 테스트
테스트 코드 커버리지 추출 JaCoCo
JaCoCo란?
- Java Code Coverage
- 코드 커버리지 오픈 소스 라이브러리
주요 기능
- 라인 커버리지: 테스트가 어떤 코드 라인을 실행했는지를 확인
- 분기 커버리지: 조건문에서 각 분기가 실행되었는지를 확인
- 메소드 및 클래스 커버리지: 각 메소드와 클래스가 얼마나 테스트되었는지 확인
- 리포트 제공: 코드 커버리지 결과를 분석할 수 있는 리포트를 제공