본문 바로가기
개발

AI 기반 테스트 코드 작성 가이드 – 개발 생산성을 높이는 방법

by soyooooon 2025. 8. 26.
반응형

 

개발자라면 한 번쯤은 테스트 코드에 대해 고민해 본 적이 있을 겁니다.

“테스트는 꼭 필요하다”는 의견도 있고,
“테스트 짤 시간에 한 번 더 눈으로 확인하면 되지 않나?”라는 말도 자주 들리죠.

테스트 코드는 분명 프로젝트의 안정성과 신뢰성을 지켜주는 중요한 장치입니다.
하지만 직접 작성하려면 시간이 오래 걸리고, 엣지 케이스를 충분히 고려하지 못할 수 있습니다.

 

AI를 활용하면 테스트 작성이 훨씬 빠르고, 부담은 줄어들면서도 다양한 케이스들을 꼼꼼하게 커버할 수 있습니다.

이번 글에서는 제가 생각하는 테스트 전략과, AI로 어떻게 테스트 시간을 단축할 수 있는지를 정리해 보겠습니다.

아래 글에서는 제가 사용하는 라이브러리를 기준으로 설명할 예정입니다. 라이브러리는 크게 중요하지 않으며, 각각의 테스트를 어떤 목적/상황에서 사용했는지를 기준으로 참고하시면 좋을 것 같습니다.


1. 단위 테스트 (Unit Test)

  • 도구 : Vitest
  • 목적 : 개별 함수 단위 로직이 올바르게 동작하는지 검증

🟢 언제 AI에게 맡기면 좋을까?

  • 시간 관련 함수처럼 사람이 모든 케이스를 일일이 짜기 어려운 경우
    • 예: 특정 시간 이전/이후에 다른 값을 반환하는 함수
  • 재사용성이 높은 유틸 함수
    • 변경 위험은 낮지만, 여러 곳에서 호출되므로 한 번 오류가 나면 서비스 전반에 영향을 미치는 경우
  • 수학적 계산이나 문자열 파싱처럼 경우의 수가 많아 실수하기 쉬운 함수

💡 AI 활용 포인트

단위테스트는 input, output이 명확하고 예측 가능하기 때문에 다른 테스트에 비해 테스트하기 쉽습니다. 때문에 AI에게 단순히 “테스트 코드를 작성해 줘”라고만 해도 웬만한 엣지 케이스도 고려하여 테스트 코드를 작성해 줍니다. 하지만 테스트하고자 하는 케이스, 걱정되는 케이스가 있다면 좀 더 구체적으로 맥락을 전달하는 것이 좋습니다.

단위 테스트를 작성할 경우, 한번 함수에 대한 테스트 코드 작성을 완료하고 나면 수정할 일이 적습니다. UI를 테스트하는 것이 아닌 핵심 로직들을 테스트하기 때문입니다. 또한 테스트 중 가장 간단하고 직관적이어서, 저는 단위 테스트 비중을 가장 높게 잡는 편입니다.


2. 통합 테스트 (Integration Test)

  • 도구 : React Testing Library
  • 목적 : 컴포넌트 단위 및 UI 상호작용 검증

🟢 AI가 특히 강력한 순간

  • 분기 케이스가 많은 UI 로직
    • 예: 옵션 선택 여부에 따라 버튼 활성/비활성화가 달라지는 경우
  • 복합 조건이 얽힌 상황
    • 필수값 + 선택값이 혼합되어 있는 경우
    • 특정 조건(예: 최소 2개 선택 필요)을 만족하지 못했을 때 버튼 비활성화
  • 유저 이벤트 시뮬레이션이 중요한 경우
    • click, change, keydown 같은 이벤트가 연속적으로 발생할 때 UI가 어떻게 반응하는지

💡 AI 활용 포인트

AI는 단순한 유저 이벤트부터, 사람이라면 놓칠 수 있는 “구석진” 케이스까지 빠짐없이 커버하는 테스트 코드를 만들어줍니다.

AI에게 구체적으로 “유저 플로우”를 설명해 주면 더 정교한 테스트 코드가 생성됩니다. 예를 들어 아래처럼 프롬프트를 작성했을 때 여러 케이스에 대한 테스트 코드를 반환합니다.

"React 컴포넌트에서 '제출하기' 버튼은 필수 옵션 2개 이상 선택 시 활성화됩니다. 
옵션이 하나만 선택된 경우, 옵션이 아예 선택되지 않은 경우, 
모든 조건을 만족했을 때 각각 버튼의 disabled 상태를 테스트하는 코드를 작성해주세요."
import { render, screen, fireEvent } from "@testing-library/react";
import { OptionsForm } from "./OptionsForm";

describe("OptionsForm", () => {
  it("옵션이 선택되지 않았을 때 제출 버튼은 비활성화 상태여야 한다", () => {
    render(<OptionsForm />);
    const submitBtn = screen.getByRole("button", { name: /제출하기/ });
    expect(submitBtn).toBeDisabled();
  });

  it("옵션이 하나만 선택된 경우 제출 버튼은 여전히 비활성화 상태여야 한다", () => {
    render(<OptionsForm />);
    fireEvent.click(screen.getByLabelText("옵션 1"));
    const submitBtn = screen.getByRole("button", { name: /제출하기/ });
    expect(submitBtn).toBeDisabled();
  });

  it("필수 옵션이 2개 이상 선택된 경우 제출 버튼이 활성화되어야 한다", () => {
    render(<OptionsForm />);
    fireEvent.click(screen.getByLabelText("옵션 1"));
    fireEvent.click(screen.getByLabelText("옵션 2"));
    const submitBtn = screen.getByRole("button", { name: /제출하기/ });
    expect(submitBtn).toBeEnabled();
  });
});

통합 테스트를 활용하면, 단위 테스트에서는 확인하지 못하는 케이스들을 테스트할 수 있습니다. UI가 변경될 가능성이 있기 때문에, 단위 테스트보다는 테스트 케이스를 적게 작성하며, 대신 중요도가 높은 것들을 위주로 작성합니다.


3. AI로 테스트 코드 작성하기

  • 도구 : CursorAI
  • 모델 : Claude 4 Sonnet

✍️ 작성 절차

  1. 테스트하려는 케이스를 AI에 명확하게 설명
    • "ㅇㅇ 함수에 대한 단위 테스트를 작성해 줘.”
    • "ㅇㅇ 컴포넌트에서 버튼의 활성/비활성 상태를 유저 이벤트 기반으로 검증해 줘.”
  2. AI가 생성한 코드를 검수
    • 불필요한 테스트 케이스가 포함되진 않았는지?
    • 중요한 케이스가 누락되진 않았는지?
    • 과도하게 모킹(mocking)을 사용하지는 않았는지?
  3. 입력/출력값이 올바른지 최종 확인

 

💡 AI는 초안을 빠르게 만들어주고, 개발자는 그걸 다듬어 최종 완성도를 높이는 식으로 역할 분담이 가능합니다.


4. 테스트 코드 작성 효과

4.1 테스트 용이성

  • 엣지 케이스까지 정의 가능 → 빠르고 폭넓은 검증
  • 시간 모킹(mocking)을 통한 특정 시간/요일 테스트
    • 특정 시간 이전/이후 변경되는 화면 검증
    • 직접 테스트하기 어려운 밤, 새벽 시간대에 대한 테스트 케이스 작성 가능

4.2 문서화 효과

  • 테스트 코드 자체가 함수의 동작을 설명하는 살아있는 문서

4.3 리팩터링 안정성 확보

아래는 실제 제가 AI를 통해 테스트 코드를 작성한 후, 해당 함수를 리팩터링 하는 과정에서 fail을 마주한 장면입니다.

자주 쓰이지만 시간과 관련된 로직이라 테스트 코드를 작성한 util 함수가 있었습니다. 코드를 작성하고 나니 개선할 부분이 보여 이를 리팩터링 한 적이 있습니다. 코드 자체는 단순해서, “이 정도면 문제없겠지” 하고 넘어가려던 순간이었죠.

 

그런데 테스트를 돌려보니 바로 fail이 발생했습니다. 자세히 보니 특정 요일과 시간 조건에서만 발생하는 로직 오류였어요. 즉, 실제 운영 환경에서라면 사용자가 특정 시간대에 접속했을 때만 문제가 터졌을 상황이었죠. 이런 유형의 버그는 QA 단계에서도 놓치기 쉽습니다. 왜냐면 실제 시간을 맞춰놓고 테스트하기가 어렵기 때문입니다.

 

영업시간이 17:00 ~ 03:00일 때, 개발자나 QA가 직접 새벽 2시에 로그인해서 확인하기는 사실상 불가능합니다. 하지만 AI가 작성한 테스트 코드에는 이런 경계값(17:00, 03:00, 자정 넘어가는 구간) 케이스들이 이미 포함되어 있었고, 덕분에 미리 발견할 수 있었습니다. 결국 단순히 “안정성 확보”를 넘어서, QA/운영 단계에서 놓칠 수 있는 리스크를 개발 단계에서 차단한 셈이었죠.


✅ 결론

테스트 코드 작성은 “시간이 오래 걸리고 귀찮은 일”이라는 인식이 강했지만, AI를 도입하면 테스트 코드의 단점은 최소화하고, 장점을 극대화할 수 있습니다.

  • 개발자는 핵심 로직에만 집중
  • AI는 빠르고 광범위한 테스트 코드 초안 생성
  • 검수 과정을 통해 안정성과 신뢰성을 확보

물론 AI가 작성한 테스트가 완벽하다는 뜻은 아닙니다. 케이스 누락이나 과도한 모킹 같은 부분은 여전히 사람의 판단이 필요합니다. 하지만 실제 프로젝트 경험을 통해 느낀 건, 테스트를 AI와 협업하는 방식으로 전환했을 때 훨씬 효율적이라는 사실입니다.

 

테스트 코드에 막연함을 느끼셨던 분들이라면, 한 번쯤 도전해 보시는 걸 추천드립니다 👍

반응형