테스트 생성을 위한 AI: 도움이 되는 부분과 함정이 있는 부분

AI는 테스트를 빠르게 작성합니다. 하지만 실제처럼 보이지만 잘못된 것을 검증하는 테스트를 작성하기도 합니다. 테스트 커버리지는 올라가는 것처럼 보일 수 있지만, 코드는 여전히 망가진 상태로 남을 수 있습니다.

AI는 특정 작업에 매우 유용합니다. 다음과 같은 용도로 사용하세요:

  • 좋은 예시로부터 확장하기. 완벽한 테스트를 하나 작성하면, AI는 당신의 스타일과 똑같은 테스트를 10개 더 작성할 수 있습니다.
  • 반복적인 타이핑 처리하기. setup 블록, teardown, 그리고 factory helper 작성에 활용하세요.
  • 초기 스캐폴딩(scaffolding) 생성하기. 빈 파일에서 시작하는 것보다 편집기에서 작업을 더 빠르게 시작할 수 있게 해줍니다.

위험은 AI가 "계약(contract)"을 결정하게 내버려 두는 순간 시작됩니다.

AI에게 함수를 주고 테스트를 요청하면, AI는 코드를 읽고 현재 코드가 수행하는 동작을 테스트합니다. 코드가 '해야 하는' 동작을 테스트하는 것이 아닙니다. 이는 폐쇄 루프(closed loop)를 만듭니다. AI는 가정을 세우고, 코드를 작성한 뒤, 그 가정과 일치하는 테스트를 작성합니다.

버그가 운영 환경(production)에서 발생하는 이유는 테스트 스위트가 버그의 편에 서 있었기 때문입니다.

다음 세 가지 함정을 주의하세요:

  1. 구현 중심의 테스트(Implementation-shaped tests) AI는 비즈니스 규칙 대신 로직 경로를 테스트하는 경우가 많습니다. 내부의 작은 세부 사항을 변경하기만 해도, 결과가 여전히 올바름에도 불구하고 테스트가 깨집니다. 이는 리팩터링을 악몽으로 만듭니다.

  2. 얕은 엣지 케이스(Shallow edge cases) AI는 null, 빈 문자열, 0 등을 테스트하는 데 능숙합니다. 이는 당연한 것들입니다. AI는 "도메인 경계(domain edges)"를 찾아내지 못합니다. 당신의 특정 시간대(timezone) 버그, 데이터베이스의 특이점, 또는 고유한 비즈니스 규칙을 알지 못합니다.

  3. 취약한 모킹(Brittle mocks) AI는 모든 것을 모킹(mock)하려 합니다. 이는 두 가지 문제를 야기합니다:

  • 모킹이 잘못됨: 실제와 일치하지 않는 가짜 API 버전을 흉내 냅니다.
  • 모킹이 구현을 고착화함: 최종 결과물을 테스트하는 대신, 코드가 다른 함수를 어떻게 호출하는지를 테스트하게 됩니다.

AI를 올바르게 사용하는 방법:

"의도(intent)"를 AI의 손이 닿지 않는 곳에 두세요.

  • 계약을 먼저 작성하세요. 모든 테스트에 대해 평이한 문장으로 한 문장을 작성합니다. 예: "만료된 코드는 원래 금액을 반환해야 한다."
  • 그 문장들을 AI에게 전달하세요. 단언문(assertion)은 AI가 작성하게 하되, 의미는 당신이 제공해야 합니다.
  • 경계에서 모킹하세요. 외부 API나 데이터베이스만 모킹하세요. 내부 모듈은 실제 버전을 사용하세요.
  • 도메인 엣지 케이스 하나를 직접 작성하세요. 함수 작성을 마칠 때마다, 당신을 불안하게 만드는 요소를 하나 적어보세요. 그것을 AI를 위한 프롬프트로 사용하세요.

AI는 생산성 도구이지, 사고를 대체하는 도구가 아닙니다. 테스트의 본문을 작성하는 데 AI를 사용하되, 테스트의 목적이 무엇인지 결정하게 해서는 안 됩니다.

Source: https://dev.to/nazar_boyko/ai-for-test-generation-where-it-helps-and-where-it-lies-jhm

Optional learning community: https://t.me/GyaanSetuAi