백엔드 코드(Controller, Service, DTO, Entity, Repository) 및 통합 테스트 코드(tests/integration) 변경 시 반드시 사용. 테스트 코드 점검, 수정, 검증까지 완료해야 작업이 끝난 것으로 간주. app/backend/ 또는 tests/integration/ 하위 파일 수정 후 이 skill을 자동 적용.
백엔드 코드 또는 통합 테스트 코드가 변경되었습니다. 다음 단계를 반드시 수행해야 합니다.
| 유형 | 위치 | 테스트 대상 |
|---|---|---|
| Unit | unit/ |
비즈니스 로직, 엣지 케이스, 예외 처리 |
| Component | component/ |
단일 서비스 전체 레이어, TestContainers MySQL |
| Contract | contract/ |
다른 서비스 API 계약 |
| Integration | tests/integration/ |
도메인: Happy Path, infra/: 보안/인프라 |
| 변경 파일 | 테스트 파일 |
|---|---|
*Service.java |
unit/*ServiceTest.java |
*Controller.java + Service + Repository |
component/*Test.java |
*Client.java (외부 서비스 호출) |
contract/*ContractTest.java |
| API 엔드포인트/응답 구조 | tests/integration/test_*.py |
| 변경 도메인 | Integration 테스트 파일 |
|---|---|
| user-service (인증) | test_auth.py |
| catalog-service (강의) | test_courses.py |
| planner-service (위시리스트) | test_wishlist.py |
| planner-service (시간표) | test_timetable.py |
| planner-service (시나리오) | test_scenario.py |
| planner-service (수강신청) | test_registration.py |
핵심 원칙:
- Unit/Component: 비즈니스 로직, 엣지 케이스, 예외 처리 검증
- Integration: 도메인은 Happy Path,
infra/는 Cross-Cutting Concerns (보안, 인증 전파)- 엄격성 준수:
pytest.skip사용 금지, 느슨한 상태 코드 검증 금지
각 테스트 파일에서 확인:
jsonPath() 또는 response 검증이 올바른지변경된 구조에 맞게 테스트 코드 업데이트.
1. 단일 상태 코드 검증
# ❌ 금지 - 느슨한 검증
assert response.status_code in (200, 400, 409)
# ✅ 필수 - 정확한 상태 코드
assert response.status_code == 201
assert response.status_code == 409, "중복 리소스는 409 Conflict"
2. RESTful 상태 코드 규칙
| 동작 | 상태 코드 |
|---|---|
| POST (리소스 생성) | 201 Created |
| POST (상태 변경) | 200 OK |
| PATCH (부분 수정) | 200 OK |
| GET | 200 OK |
| DELETE | 204 No Content |
| 중복 리소스 | 409 Conflict |
| 잘못된 요청 | 400 Bad Request |
| 리소스 없음 | 404 Not Found |
| 인증 실패 | 401 Unauthorized |
3. Test Skip 금지
# ❌ 금지 - 데이터 없음으로 인한 Skip
if not items:
pytest.skip("데이터 없음")
# ✅ 필수 - 데이터 부재는 곧 테스트 실패
assert items, "테스트를 위한 필수 데이터가 없습니다"
4. DTO 필드 완전 검증
# 필수 필드 존재 확인
assert "id" in data
assert "name" in data
assert "createdAt" in data
# 타입 검증
assert isinstance(data["id"], int)
assert isinstance(data["items"], list)
# 값 검증
assert data["name"] == expected_name
5. 에러 응답도 검증
# 에러 구조 확인 (프론트엔드가 메시지를 표시할 수 있도록)
error = response.json()
assert "message" in error or "error" in error
cd app/backend
./gradlew test
# 1. 개발 컨테이너가 떠있다면 중지
docker compose down
# 2. 테스트용 컨테이너 실행 (tmpfs로 매번 깨끗한 DB)
docker compose -f docker-compose.yml -f docker-compose.test.yml up -d --build
# 3. 서비스 준비 대기 (약 30초)
sleep 30
# 4. Integration 테스트 실행
cd tests/integration
uv sync
uv run pytest -v
# 5. 테스트 완료 후 정리
docker compose -f docker-compose.yml -f docker-compose.test.yml down
Integration 테스트 실행 조건:
./gradlew test 전체 통과