ai 코딩 에이전트 테스트 자동화, 생성 코드 믿고 배포하려면 제가 두는 5개 게이트

Claude Code, Cursor, Codex 같은 도구로 만든 코드를 믿고 배포하려면 “AI가 잘 짰겠지”가 아니라 테스트가 자동으로 막아주는 구조가 필요합니다. 결론부터 말하면, 최소 게이트는 타입 체크, 린트, 유닛 테스트, 핵심 E2E 테스트, CI 통과 후 배포입니다.

이 글에는 제휴(어필리에이트) 링크가 포함될 수 있으며, 링크를 통해 가입·구매 시 소정의 수수료를 받을 수 있습니다. 추천은 실제 사용 경험에 기반합니다.

먼저 내 프로젝트의 핵심 사용자 흐름 3개를 적고, 그중 하나를 Playwright와 GitHub Actions로 자동화해 보세요.

저는 AI 코딩 에이전트로 작은 SaaS 기능을 만들 때, 에이전트에게 바로 구현을 맡기기보다 먼저 실패하는 테스트를 만들게 합니다. 그다음 GitHub Actions에서 같은 명령을 다시 돌려, 로컬에서 우연히 통과한 코드를 걸러냅니다.

바로 적용하려면?
현재 프로젝트에 pnpm typecheck && pnpm lint && pnpm test && npx playwright test를 먼저 붙여보세요. AI 에이전트 프롬프트보다 CI 게이트가 먼저입니다.

생성 코드를 배포 전에 막아야 하는 이유

AI 코딩 에이전트는 빠르지만, 프로젝트의 숨은 규칙까지 항상 기억하지는 못합니다. 예를 들어 결제 상태 enum을 하나 빠뜨리거나, 인증이 필요한 API에 권한 체크를 빼먹는 식의 실수가 실제로 자주 나옵니다.

그래서 테스트 자동화의 목적은 “완벽한 코드 보장”이 아닙니다. 깨지면 바로 알 수 있는 안전망을 만드는 것입니다. 특히 Next.js, FastAPI, Rails처럼 프론트와 백엔드가 붙어 있는 앱은 E2E 테스트 하나가 유닛 테스트 열 개보다 빨리 문제를 드러낼 때가 있습니다.

제가 쓰는 기본 워크플로

1. 에이전트에게 테스트부터 쓰게 한다

Claude Code나 Cursor Composer에 기능을 맡길 때는 “구현해줘”보다 “현재 코드 구조를 읽고, 실패하는 테스트를 먼저 추가한 뒤 구현해줘”라고 지시합니다. 이 한 줄이 결과를 꽤 바꿉니다.

예시는 간단합니다. 가상의 Next.js 구독 관리 화면을 만든다고 하면, 먼저 Vitest로 가격 계산 함수를 검증하고, Playwright로 ‘요금제 선택 → 결제 페이지 이동’ 흐름을 확인하게 합니다. 실제 매출이나 전환율과 무관한 예시이며, 프로젝트 구조에 따라 테스트 범위는 달라집니다.

2. 로컬 명령과 CI 명령을 동일하게 둔다

로컬에서는 통과했는데 GitHub Actions에서 깨지는 경우가 많습니다. 그래서 package.json에 명령을 고정해 둡니다.

"scripts": {
  "typecheck": "tsc --noEmit",
  "lint": "next lint",
  "test": "vitest run",
  "e2e": "playwright test",
  "verify": "pnpm typecheck && pnpm lint && pnpm test && pnpm e2e"
}

이후 에이전트에게 “작업이 끝나면 pnpm verify를 실행하고 실패 로그를 읽어 수정해줘”라고 요청합니다. 여기서 중요한 점은 AI가 테스트를 통과했다고 말하는 것이 아니라, 실제 터미널 로그가 남는 구조입니다.

3. PR에서 자동으로 멈추게 한다

GitHub Actions, GitLab CI, CircleCI 중 무엇을 써도 핵심은 같습니다. main 브랜치에 바로 푸시하지 않고 PR에서 테스트가 실패하면 merge 버튼을 누르지 못하게 해야 합니다.

검증 단계 추천 도구 잡아내는 문제 처음 붙일 난이도
타입 체크 TypeScript, pyright 잘못된 인자, 누락된 필드 낮음
린트/포맷 ESLint, Prettier, Ruff 프로젝트 규칙 위반, 위험한 패턴 낮음
유닛 테스트 Vitest, Jest, pytest 함수 로직 오류, 엣지 케이스 중간
E2E 테스트 Playwright, Cypress 로그인, 결제, 폼 제출 흐름 깨짐 중간~높음
배포 후 감시 Sentry, Datadog, Logtail 테스트가 놓친 런타임 오류 중간

상황별 추천 셋업

혼자 만드는 MVP라면

처음부터 복잡한 테스트 피라미드를 만들 필요는 없습니다. TypeScript, ESLint, Vitest, Playwright 1~3개 시나리오, GitHub Actions 정도면 충분히 출발할 수 있습니다. 로그인, 결제, 데이터 저장처럼 돈이나 신뢰와 연결된 흐름만 E2E로 잡아도 체감이 큽니다.

팀에서 AI 에이전트를 같이 쓴다면

PR 템플릿에 “AI가 수정한 범위”, “추가한 테스트”, “수동 확인한 화면”을 적게 하세요. Cursor나 Claude Code가 만든 코드라도 리뷰 기준은 사람 코드와 같아야 합니다. Codecov 같은 커버리지 도구를 붙이면 테스트가 줄어드는 PR을 빨리 발견할 수 있습니다.

기존 레거시 프로젝트라면

전체를 한 번에 테스트하려고 하면 막힙니다. 먼저 버그가 자주 나는 파일, 매출과 연결된 API, 관리자 권한 기능부터 감싸세요. AI에게 “이 파일을 리팩터링하지 말고 현재 동작을 고정하는 characterization test를 작성해줘”라고 요청하면 변경 부담이 줄어듭니다.

자주 막히는 지점과 피하는 법

가장 흔한 실수는 AI가 만든 테스트를 그대로 믿는 것입니다. 에이전트는 구현에 맞춰 너무 쉬운 테스트를 만들 때가 있습니다. 예를 들어 버튼이 존재하는지만 확인하고 실제 저장이 됐는지는 보지 않는 식입니다.

좋은 테스트는 사용자의 결과를 봅니다. “저장 버튼 클릭 후 DB에 값이 있다”, “권한 없는 사용자는 403을 받는다”, “결제 실패 시 구독 상태가 바뀌지 않는다”처럼 검증 문장이 구체적이어야 합니다.

또 하나는 비밀키 처리입니다. CI에 OpenAI API 키, Stripe 키를 넣을 때는 GitHub Secrets를 쓰고, 테스트에서는 가급적 mock server나 sandbox 키를 사용하세요. 실제 결제가 일어나는 테스트는 별도 환경으로 분리하는 편이 안전합니다.

FAQ

AI 코딩 에이전트가 테스트까지 만들면 리뷰를 줄여도 되나요?

아니요. 테스트 작성 속도는 빨라지지만, 어떤 위험을 테스트할지 결정하는 일은 아직 사람이 맡아야 합니다. 특히 인증, 결제, 개인정보 처리 코드는 반드시 직접 확인하는 편이 안전합니다.

Playwright와 Cypress 중 무엇을 고르면 좋나요?

새 프로젝트라면 Playwright를 먼저 추천합니다. 브라우저 지원과 병렬 실행이 좋고 GitHub Actions 예제가 많습니다. 이미 Cypress 테스트가 쌓인 팀이라면 굳이 갈아탈 필요는 없습니다.

테스트가 느려져서 AI 작업 속도가 떨어지면요?

로컬에서는 유닛 테스트와 관련 E2E만 돌리고, PR에서는 전체 테스트를 돌리는 식으로 나누세요. 에이전트에게도 “수정한 영역과 관련된 테스트 먼저 실행, 마지막에 전체 verify 실행”이라고 지시하면 대기 시간이 줄어듭니다.

오늘 바로 할 일

새 도구를 더 붙이기 전에 현재 저장소에서 깨지면 안 되는 사용자 흐름 3개를 적어보세요. 그중 하나를 Playwright로 자동화하고, GitHub Actions에서 PR마다 실행되게 만드는 것이 첫 번째 목표입니다.

AI 코딩 에이전트 테스트 자동화는 거창한 QA 조직이 있어야 가능한 일이 아닙니다. 작은 게이트를 꾸준히 쌓으면, 생성 코드의 속도를 유지하면서도 배포 버튼을 누를 때의 불안을 크게 줄일 수 있습니다.

관련 링크

글쓴이 용기

AI 코딩 에이전트로 직접 빌드하는 개발자. Claude Code·Codex 실사용 후기와 빌더 일지를 씁니다.

지식창고