Claude와 성질 기반 테스팅을 활용한 버그 발견

Anthropic는 대규모 소프트웨어 프로젝트에서 버그를 효율적으로 식별할 수 있는 AI 에이전트를 개발했다. 이 에이전트는 자동으로 일반적인 코드 성질을 추론하고 성질 기반 테스팅(PBT)을 적용함으로써 작동한다. 퍼지 테스팅과 유사한 기술을 활용해, NumPy, SciPy, Pandas와 같은 주요 Python 패키지에서 버그를 발견했다.

성질 기반 테스팅 vs. 예제 기반 테스팅

성질 기반 테스팅은 특정한 수동으로 정의된 예제를 검증하는 대신, 코드의 일반적인 불변성 또는 성질이 다양한 입력에 대해 성립하는지 검증하는 데 초점을 맞춘다.

  • 예제 기반 테스트: 개발자가 특정 입력(예: [2, 10, 5, 4])을 정의하고 출력이 기대 결과(예: [2, 4, 5, 10])와 일치하는지 검증한다. 이 접근 방식은 개발자가 예상하지 못한 극단적인 케이스를 놓치기 쉽다.
  • 성질 기반 테스트: 개발자가 일반적인 성질(예: "JSON 역직렬화는 직렬화의 역함수이다")과 입력 도메인을 지정한다. 프레임워크는 자동으로 수많은 유효한 입력을 생성하여 성질을 위반하는 반례를 찾는다.

Anthropic의 에이전트는 타입 주석, 문서 문자열, 함수 이름, 주석을 읽어 이러한 성질을 추론하고, Hypothesis 라이브러리를 사용하여 테스트를 작성함으로써 이 과정을 자동화한다.

성질 기반 테스팅 에이전트 워크플로우

에이전트는 사용자 정의 Claude Code 명령어로 구현된다. 타겟(예: Python 파일, 모듈, 특정 함수)을 입력받아 다섯 단계 반복 프로세스를 따르며 작동한다:

  1. 분석: 코드와 문서를 읽어 타겟과 코드베이스 내의 관계를 이해한다.
  2. 제안: 분석에 기반한 성질을 제안한다.
  3. 구현: Hypothesis를 사용해 성질 기반 테스트를 작성한다.
  4. 반성: 테스트를 실행하고 결과를 평가한다. 테스트가 실패하면 진짜 버그인지, 아니면 테스트 자체를 조정해야 하는지 판단한다. 성공한 경우, 테스트가 단순한지 의미 있는지 평가한다.
  5. 보고: 버그의 유효성이 확신되면 형식화된 버그 보고서를 생성한다.

장기적인 추론을 관리하기 위해 에이전트는 할 일 목록을 활용한다. 연구팀은 Opus 4.1과 Sonnet 4.5가 Sonnet 4보다 자가 반성 능력이 크게 향상되었음을 확인했다.

실제 성능 및 검증

연구팀은 100개 이상의 인기 있는 PyPI 패키지에서 에이전트를 테스트했다. 평가는 두 단계로 진행되었다:

단계 1: 초기 평가 (Opus 4.1)

Claude Opus 4.1이 생성한 984개의 버그 보고서 중, 50개를 수동 검토한 결과 56%가 유효한 버그였으며, 32%는 유효하고 보고 가능한 버그였다. 정밀도를 높이기 위해 팀은 15점 체계를 개발해 버그를 등급화했다. 이 체계를 적용했을 때 상위 점수 보고서의 86%가 유효했으며, 81%는 유효하고 보고 가능한 버그였다.

단계 2: 개선된 평가 (Sonnet 4.5)

팀은 Sonnet 4.5를 사용해 10개의 핵심 패키지에 대해 여러 번 에이전트를 실행하고, 더 정교한 평가 에이전트를 활용해 정확성과 심각도를 확인한 후 최종 인간 전문가 검토를 진행했다.

사례 연구: 발견된 버그

에이전트가 발견한 몇몇 버그는 주요 라이브러리에 보고되고 수정되었다:

  • NumPy: 에이전트는 numpy.random.wald가 때때로 음수를 반환함을 발견해, 월드 분포의 성질을 위반했다. 수정은 치명적인 취약성 문제를 해결하여 더 수치적으로 안정적인 공식을 만들었으며, 상대 오차를 거의 10자리 수준으로 감소시켰다.
  • aws-lambda-powertools: 에이전트는 slice_dictionary()가 반복적으로 첫 번째 청크를 반환하는 문제를 발견했다. 이는 반복자가 증가되지 않았기 때문이다. 이 문제는 딕셔너리를 자르고 다시 구성했을 때 원래 딕셔너리가 반환되어야 한다는 성질을 테스트함으로써 식별되었다.
  • cloudformation-cli-java-plugin: 에이전트는 item_hash().sort() 메서드를 인라인으로 사용해 None을 반환하기 때문에 모든 리스트에 동일한 해시를 생성한다는 문제를 발견했다. 이는 서로 다른 입력에 대해 서로 다른 해시가 생성되어야 한다는 성질을 테스트함으로써 포착되었다.
  • tokenizers: 에이전트는 EncodingVisualizer.calculate_label_colors()에서 누락된 닫는 괄호를 발견해, 잘못된 HSL CSS를 생성했다. 이는 출력이 HSL 색상 코드에 대한 정규식과 일치하는지 테스트함으로써 발견되었다.

python-dateutil에서 유일리안 달력과 관련된 한 보고된 이슈는 유지보수자들에 의해 무효로 표시되었으며, 이는 에이전트가 유지보수자가 정의해야 하는 미묘하거나 암묵적인 가정을 포함한 코드에서는 어려움을 겪는다는 한계를 보여준다.

미래 방향성

Anthropic는 에이전트 기반 PBT가 인간 테스팅과 중요한 보완이 될 것이라고 보고 있으며, 특히 LLM이 맥락에서 성질을 더 잘 식별할 수 있게 되면서 더욱 그렇다. 연구팀은 다음 단계로 자동 패치 생성이 자연스러운 발전이라고 제안한다. 정확성 성질이 완전히 명시될 수 있다면 버그 수정이 더 간단해지며, LLM이 유지보수자 검토를 위해 고품질 패치를 제안할 수 있을 것으로 기대된다.

Sources

관련

  • Dispatch
  • Dispatch
  • Dispatch
  • 프로젝트
  • Dispatch