UMass Amherst의 PLASMA 연구소의 Juan Altmayer Pizzorno와 Emery Berger가 작성했습니다.
CoverUp은 더 많은 코드가 테스트되는지 확인하는 테스트를 자동으로 생성합니다(즉, 코드 적용 범위가 늘어납니다). CoverUp은 아직 테스트 스위트가 없는 경우 처음부터 테스트 스위트를 생성할 수도 있습니다. 새로운 테스트는 코드를 기반으로 하므로 회귀 테스트에 유용합니다.
CoverUp은 pytest 테스트 프레임워크와 긴밀하게 작동하도록 설계되었습니다. 테스트를 생성하려면 먼저 SlipCover를 사용하여 제품군의 적용 범위를 측정합니다. 그런 다음 추가 테스트가 필요한 코드 부분(즉, 발견되지 않은 코드)을 선택합니다. 그런 다음 CoverUp은 LLM과 대화하여 테스트를 요청하고 결과를 확인하여 실행 여부를 확인하고 적용 범위를 늘리며(다시 SlipCover를 사용하여) 필요에 따라 조정을 다시 요청합니다. 마지막으로 CoverUp은 선택적으로 새로운 테스트가 잘 통합되는지 확인하고 발견된 문제를 해결하려고 시도합니다.
기술적인 세부 사항과 전체 평가를 보려면 arXiv 문서인 CoverUp: Coverage-Guided LLM-Based Test Generation (PDF)을 참조하세요.
CoverUp은 PyPI에서 제공되므로 다음과 같이 간단하게 설치할 수 있습니다.
$ python3 -m pip install coverup
CoverUp은 OpenAI, Anthropic 또는 AWS Bedrock 모델과 함께 사용할 수 있습니다. 액세스 세부 정보는 각각 OPENAI_API_KEY
, ANTHROPIC_API_KEY
또는 AWS_ACCESS_KEY_ID
/ AWS_SECRET_ACCESS_KEY
/ AWS_REGION_NAME
등 셸 환경 변수로 정의되어야 합니다.
예를 들어, OpenAI의 경우 계정을 생성하고 잔액이 양수인지 확인한 다음 API 키를 생성하여 "비밀 키"(일반적으로 sk-
로 시작하는 문자열)를 OPENAI_API_KEY
라는 환경 변수에 저장합니다.
$ export OPENAI_API_KEY= < ...your-api-key... >
모듈 이름이 mymod
이고 소스가 src
아래에 있고 테스트가 tests
아래에 있는 경우 CoverUp을 다음과 같이 실행할 수 있습니다.
$ coverup --source-dir src/mymod --tests-dir tests
그런 다음 CoverUp은 tests
디렉터리 아래에 test_coverup_N.py
라는 테스트를 생성합니다. 여기서 N
은 숫자입니다.
여기에서는 CoverUp이 인기 있는 패키지 Flask에 대한 추가 테스트를 생성하도록 했습니다.
$ coverup --package src/flask --tests tests
Measuring coverage... 90.9%
Prompting gpt-4o-2024-05-13 for tests to increase coverage...
(in the following, G=good, F=failed, U=useless and R=retry)
100%|███████████████████████████████████████| 92/92 [01:01<00:00, 1.50it/s, G=55, F=122, U=20, R=0, cost=~$4.19]
Measuring coverage... 94.4%
$
불과 1분 만에 CoverUp은 Flask의 테스트 적용 범위를 90.9%에서 94.4%로 늘립니다.
새로 생성된 각 테스트를 평가하는 동안 CoverUp은 불안정한 테스트를 감지하기 위해 여러 번 실행합니다. --repeat-tests
및 --no-repeat-tests
옵션으로 조정할 수 있습니다. CoverUp이 새로 생성된 테스트가 불안정하다는 것을 감지하면 LLM에 수정을 요청합니다.
CoverUp은 자체적으로 실행될 때 적용 범위를 통과하고 증가시키는 테스트만 제품군에 추가합니다. 그러나 상태를 "오염"시켜 다른 테스트가 실패하도록 하는 방식으로 상태를 변경하는 테스트도 가능합니다. 기본적으로 CoverUp은 pytest-cleanslate 플러그인을 사용하여 테스트를 격리하고 (메모리 내) 테스트 오염을 해결합니다. --no-isolate-tests
옵션을 전달하여 비활성화할 수 있습니다. CoverUp은 오염을 일으키는 테스트 모듈이나 기능( --disable-polluting
)을 찾아 비활성화하거나 실패한 테스트를 간단히 비활성화(``--disable-failing`)하도록 요청할 수도 있습니다.
LLM에서 생성된 테스트를 평가하려면 CoverUp이 이를 실행해야 합니다. 최고의 보안과 시스템 손상 위험을 최소화하려면 Docker와 함께 CoverUp을 실행하는 것이 좋습니다.
그래프는 Pynguin 테스트 생성기를 기반으로 하는 최첨단 검색 기반 테스트 생성기인 CodaMosa와 CoverUp을 비교한 것입니다. 이 실험에서 CoverUp과 CodaMosa는 모두 "처음부터" 테스트를 만들었습니다. 즉, 기존 테스트 모음을 무시했습니다. 막대는 다양한 Python 모듈에 대한 CoverUp과 CodaMosa 간의 적용 범위 백분율 차이를 보여줍니다. 0보다 높은 녹색 막대는 CoverUp이 더 높은 적용 범위를 달성했음을 나타냅니다.
그래프에서 볼 수 있듯이 CoverUp은 대부분의 모듈에서 CodaMosa보다 더 높은 적용 범위를 달성합니다.
이것은 CoverUp의 초기 릴리스입니다. 재미있게 즐겨주시고, 개선을 위해 노력하는 동안 불편을 끼쳐드려 죄송합니다. 버그 보고서, 경험 보고서, 기능 요청을 환영합니다(문제를 열어주세요).