Rose
Rose
🎻 루키 파트너
🚀 SNS 챌린지 달성자

Cursor로 TDD 하면서 Regression Test 까지 하기

소개

Cursor로 TDD를 하면서 회귀 테스트(Regression Test)까지 모두 해보고 싶었습니다.(욕심😅 )

  • 회귀테스트는 프로그램 수정이나 새 기능 개발, 오류 수정 시 원래 동작하던 기능이 동작하지 않거나, 새로운 버그가 드러나는 것을 테스트하는 것입니다.

진행 방법

먼저 TDD를 위한 설정을 했습니다. Jest를 설치하고 환경 파일을 만들었습니다.

<백엔드 .env.test 파일>
# Test Environment Variables
NODE_ENV=test

# Test Database
DATABASE_URL="...."
TEST_DATABASE_URL="...."

# JWT Keys for Testing
# 테스트용 (빠른 만료, 약한 보안 OK)
JWT_ALGORITHM="RS256"
JWT_PRIVATE_KEY="..."
JWT_PUBLIC_KEY="..."
JWT_EXPIRES_IN="15m"   # 테스트에서 만료 시나리오 검증용
JWT_REFRESH_EXPIRES_IN="1h"
JWT_ISSUER="myapp-test"
JWT_AUDIENCE="test-users"

# Email Configuration (Mocked in tests)
EMAIL_FROM="[email protected]"
EMAIL_HOST="smtp.test.com"
EMAIL_PORT=587
EMAIL_USER="[email protected]"
EMAIL_PASS="test-password"
EMAIL_SECURE=false
MOCK_EXTERNAL_SERVICES=true

# Security & Auth
BCRYPT_ROUNDS=1  # 테스트 속도 향상
CORS_ORIGIN="https://localhost:5173/"

# n8n Workflow Integration
N8N_WEBHOOK_URL="...."
N8N_WORKFLOW_ID="...."
FILE_UPLOAD_TIMEOUT=30000
MAX_UPLOAD_SIZE=10485760

# File Upload Testing
MOCK_N8N_WORKFLOW=true
MOCK_GOOGLE_DRIVE=true       # 실제 Google Drive 업로드 비활성화

# Rate Limiting (Relaxed for tests)
RATE_LIMIT_WINDOW_MS=60000
RATE_LIMIT_MAX_REQUESTS=1000

# Logging (Minimal for tests)
LOG_LEVEL="error"
LOG_TO_FILE=false

# Server
PORT=3000
HOST="localhost"

# Admin
ADMIN_USERNAME=".."
ADMIN_PASSWORD=".."
JOIN_PASSWORD=".."

# Test Flags
DISABLE_AUTH=false
DISABLE_RATE_LIMITING=true
-------------
<프론트 엔드 .env.test 파일>
# 백엔드 API 연결
VITE_API_BASE_URL="https://localhost:3000/api"  # 테스트 시 백엔드 주소

# 테스트 환경 식별
NODE_ENV=test
VITE_APP_TITLE="Spring Book Club - Test"

다음에는 현재까지 TDD를 하지 않고 개발했기 때문에 현재 개발된 내용에 대해서 모두 테스트를 작성하고, 테스트 실행을 지시했습니다.

1. 단위 테스트 (Unit Tests) 
bash# 백엔드 단위 테스트
cd backend
npm test

# 프론트엔드 단위 테스트  
cd frontend
npm test

# 개발 서버 실행 안해도 됨!
2. 통합 테스트 (Integration Tests) - 백엔드만 필요한 경우
bash# 백엔드 API 통합 테스트
cd backend
npm run test:integration

# 테스트 내에서 서버를 자동으로 시작/종료
3. E2E 테스트 - 둘 다 실행 필요
bash# 수동으로 서버 시작
cd backend && npm run dev &    # 백그라운드 실행
cd frontend && npm run dev &   # 백그라운드 실행

# E2E 테스트 실행
npm run test:e2e

이렇게 테스트를 실행하면 제가 지금까지 개발한 것 중에서 오류를 수정할 줄 알았더니. 웬걸.

테스트 스크립트의 오류나 테스트 환경 오류를 열심히 수정하는 커서..😅

그래도 마이너 오류 수정은 있었습니다.

근데 매번 이런 프롬프트를 쓰기 싫은 겁니다.

# 작업 순서
1. 프론트 엔드 터미널에서 **npm test** 명령어를 실행하여 프로젝트의 **모든 테스트 스위트**가 통과하는지 확인해줘.
2. 테스트 실패 시 실패한 테스트를 분석하고 코드를 수정해. 그리고 다시 **npm test**를 실행해.
3. 백엔드 터미널에서 **npm test** 명령어를 실행하여 프로젝트의 **모든 테스트 스위트**가 통과하는지 확인해줘.
4. 테스트 실패 시 실패한 테스트를 분석하고 코드를 수정해. 그리고 다시 **npm test**를 실행해.
4. 통합 테스트가 통과하는지 확인해 줘.
5. 통합 테스트 실패 시 실패한 테스트를 분석하고 코드를 수정해. 그리고 다시 **npm run test:integration**을 실행해.
6. E2E 테스트가 통과하는지 확인해 줘.
7. E2E 테스트 실패 시 실패한 테스트를 분석하고 코드를 수정해. 그리고 다시 **npm run test:e2e**를 실행해.
8. 프로젝트의 모든 테스트가 성공적으로 통과할 때까지 이 과정을 반복해줘.

# 지시
작업 순서에 따라 에러를 fix 해. 절대 현재의 구현 로직이나 알고리즘을 다운그레이드하지 마. 현재의 접근 방법을 바꾸지 마. 에러만 수정해.

그래서 rule을 하나 만들었습니다.

# 작업 순서
1. 요청하는 기능에 대한 단위 테스트 코드를 작성해. 사용 케이스별 (성공, 실패, 유효성 검사 등) 테스트 케이스를 충분히 포함해야 해. 초기에는 구현 코드가 없으므로 이 테스트는 실패해야 정상이야.
2. 작성된 테스트를 기반으로,요청된 기능 구현 코드를 작성해.
3. 프론트 엔드 터미널에서 **npm test** 명령어를 실행하여 프로젝트의 **모든 테스트 스위트**가 통과하는지 확인해줘.
4. 프론트 엔드 테스트 실패 시 디버그 로그를 더 추가해서 root cause를 파악하고 fix 해. fix 한 후에는 꼭 디버그 로그를 삭제해.
5. 모든 프론트 엔드 **npm test**가 성공할 때까지 3~4를 반복해.
6. 백엔드 터미널에서 **npm test** 명령어를 실행하여 프로젝트의 **모든 테스트 스위트**가 통과하는지 확인해줘.
7. 백엔드 테스트 실패 시 디버그 로그를 더 추가해서 root cause를 파악하고 fix 해. fix 한 후에는 꼭 디버그 로그를 삭제해.
8. 모든 백엔드 **npm test**가 성공할 때까지 6~7을 반복해.
9. 통합 테스트를 **npm run test:integration** 로 실행해서 통과하는지 확인해 줘.
10. 통합 테스트 실패 시 디버그 로그를 더 추가해서 root cause를 파악하고 fix 해. fix 한 후에는 꼭 디버그 로그를 삭제해.
11. 모든 통합 테스트가 성공할 때까지 9~10을 반복해.
12. **npm run test:e2e**를 실행해서 E2E 테스트가 통과하는지 확인해 줘.
13. E2E 테스트 실패 시 디버그 로그를 더 추가해서 root cause를 파악하고 fix 해. fix 한 후에는 꼭 디버그 로그를 삭제해.
14. 모든 E2E 테스트가 성공할 때까지 12~13을 반복해.


# 주의사항
1. 절대 현재의 구현 로직이나 알고리즘을 다운그레이드하지 마. 현재의 접근 방법을 바꾸지 마. 문제가 생기면 정공법으로 에러를 수정해.
2. 테스트가 실패해도 테스트 스크립트를 삭제하지 마. 
3. 테스트 실패 시 디버그 로그를 더 추가해서 root cause를 파악하고 fix 해. fix 한 후에는 꼭 디버그 로그를 삭제해.
4. TDD를 하는 목적은 Regression Test를 항상 하기 위해서야. 테스트 환경 문제 등 테스트 관련 모든 문제를 전부 해결해.
5. 실패해야 하는 테스트케이스가 실패하면 그건 성공으로 기록해.
6. 모든 테스트가 성공할 때까지 반복해.

제가 쓰는 프롬프트는 이것 뿐입니다.

@/.cursor @prd.md @new-feature-tdd.mdc new-feature-tdd에 따라서 사서의 회원 삭제 기능 구현해 줘.

그래서 한 번에 구현되었으면 좋았겠지만, 조금의 씨름은 있었습니다.

일단 백엔드만 구현해줘서
"프론트 엔드에 삭제 버튼이 없는데?"

한 번 씨름해야 했고, 그래도 에러가 나서 한 번 에러 로그를 전달해주었습니다.

다른 버그 도입은 없었습니다.

결과와 배운 점

Cursor로 TDD를 하면서 제일 오래 걸린 것은 테스트 환경 설정이었습니다.

Regression Test까지 완벽하게 하는 것은 욕심인 것 같습니다.

아무래도 그 용도라면 Codex를 써야할 듯 합니다.
(마침 plus plan까지 풀렸습니다.)

도움 받은 글 (옵션)

https://youtu.be/uJimjSDio_Y?si=RXi0UDJn7RZfBgAQ

3
2개의 답글

👉 이 게시글도 읽어보세요