Хуан Альтмайер Пиццорно и Эмери Бергер из лаборатории PLASMA Массачусетского университета в Амхерсте.
CoverUp автоматически генерирует тесты, которые гарантируют, что будет проверено больше вашего кода (то есть увеличивает покрытие кода). CoverUp также может создать набор тестов с нуля, если у вас его еще нет. Новые тесты основаны на вашем коде, что делает их полезными для регрессионного тестирования.
CoverUp разработан для тесного взаимодействия с тестовой средой pytest. Для создания тестов сначала измеряется покрытие вашего пакета с помощью SlipCover. Затем он выбирает части кода, которые требуют дополнительного тестирования (то есть код, который еще не исследован). Затем CoverUp вступает в диалог с LLM, предлагая провести тесты, проверяя результаты, чтобы убедиться, что они работают, и увеличивать покрытие (снова используя SlipCover), а также повторно предлагать внести коррективы при необходимости. Наконец, CoverUp дополнительно проверяет, хорошо ли интегрируются новые тесты, пытаясь устранить любые обнаруженные проблемы.
Технические подробности и полную оценку см. в нашем документе arXiv CoverUp: создание тестов на основе LLM с учетом покрытия (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 создает тесты с именем test_coverup_N.py
, где N
— число, в каталоге tests
.
Здесь у нас есть 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%
$
Всего за минуту 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 должен их выполнить. Для обеспечения максимальной безопасности и минимизации риска повреждения вашей системы мы рекомендуем запускать CoverUp с помощью Docker.
На графике показано сравнение CoverUp с CodaMosa, современным генератором тестов на основе поиска, основанным на генераторе тестов Pingguin. Для этого эксперимента и CoverUp, и CodaMosa создавали тесты «с нуля», то есть игнорируя любой существующий набор тестов. Столбцы показывают разницу в процентах покрытия между CoverUp и CodaMosa для различных модулей Python; зеленые столбцы выше 0 означают, что CoverUp достиг более высокого покрытия.
Как видно из графика, CoverUp обеспечивает более высокий охват, чем CodaMosa, для большинства модулей.
Это ранний выпуск CoverUp. Пожалуйста, наслаждайтесь этим и простите за любые сбои, поскольку мы работаем над его улучшением. Мы приветствуем отчеты об ошибках, отчеты об опыте и запросы новых функций (пожалуйста, откройте проблему).