TestPilot - это инструмент для автоматического генерирования модульных тестов для пакетов NPM, записанных в JavaScript/TypeScript с использованием большой языковой модели (LLM).
Обратите внимание, что TestPilot представляет собой раннее исследование в использовании LLM для генерации тестов и был доступен в открытом исходном коде, в качестве основы для исследования и исследования. Для повседневного использования функции генерации тестов в чате Copilot, вероятно, дадут лучшие результаты.
TestPilot генерирует тесты для данной функции f , побуждая LLM скелетом теста для f , включая информацию о f , встроенных в комментарии кода, такую как его подпись, кузов f и примеры использования f автоматически добываемой из проектной документации. Ответ модели затем проанализируется и переводится в пробежный модульный тест. Необязательно, тест запускается, и если он не стерж, модель снова побуждается с дополнительной информацией о неудачном тесте, что дает ему возможность уточнить тест.
В отличие от других систем для генерации тестов на основе LLM, TestPilot не требует дополнительного обучения или обучения подкрепления, и никаких примеров функций и связанных с ними тестов не требуется.
Исследовательская статья, описывающая TestPilot подробно, доступна на Arxiv и IEEExplore.
В целом, чтобы иметь возможность запустить TestPilot, вам нужен доступ к LLM в стиле кодекса с API завершения. Установите переменную среды TESTPILOT_LLM_API_ENDPOINT на URL -адрес конечной точки API LLM, которую вы хотите использовать, и TESTPILOT_LLM_AUTH_HEADERS для объекта JSON, содержащего заголовки, которые вам необходимы для аутентификации с помощью API.
Типичные значения для этих переменных могут быть:
TESTPILOT_LLM_API_ENDPOINT='https://api.openai.com/v1/engines/code-cushman-001/completions'TESTPILOT_LLM_AUTH_HEADERS='{"Authorization": "Bearer <your API key>", "OpenAI-Organization": "<your organization ID>"}'Обратите внимание, однако, что вы можете запустить TestPilot в режиме воспроизведения без доступа к API LLM, где ответы модели взяты из вывода предыдущего прогона; Смотрите ниже для деталей.
Вы можете установить TestPilot из предварительно созданного пакета или из Source.
TestPilot является доступным в качестве предварительно созданного пакета NPM, хотя в настоящее время он не опубликован в реестре NPM. Вы можете скачать тарбол из репозитория и установить его обычным способом. Обратите внимание, что это распределение содержит только основную часть TestPilot, а не жгут сравнительного анализа.
src/ каталог содержит исходный код для TestPilot, который записан в TypeScript и компилируется в dist/ Directory. Тесты находятся в test/ ; benchmark/ каталог содержит брандилочный жгут для запуска TestPilot на нескольких пакетах NPM; и ql/ содержит запросы CodeQL, используемые для анализа результатов.
В корневом каталоге оформления этого репозитория запустите npm build , чтобы установить зависимости и создать пакет.
Вы также можете использовать npm run build:watch за автоматической сборкой в любое время, когда вы вносите изменения в код. Обратите внимание, однако, что это не будет автоматически устанавливать зависимости, а также не будет строить бензольный жгут.
Используйте npm run test для запуска тестов. Для удобства это также установит зависимости и запустит сборку.
Если вы установите TestPilot из Source, вы можете использовать жгут бенчмаркинга для запуска TestPilot на нескольких пакетах и проанализировать результаты. Это в настоящее время недоступно, если вы установите TestPilot из предварительно созданного пакета.
Основное использование следующим образом:
node benchmark/run.js --outputDir < report_dir > --package < package_dir > Это генерирует тесты для всех функций, экспортируемых пакетом в <package_dir> , подтверждает их и записывает результаты в <report_dir> .
Обратите внимание, что это предполагает, что зависимости пакетов установлены и выполняются любые шаги сборки (например, с использованием сборки npm i и npm run build ). TestPilot также полагается на mocha , поэтому, если тестовый пакет еще не зависит от него, вы должны установить его отдельно, например, используя команду npm i --no-save mocha .
Рабочий процесс run-experiment.yml Артефакт results-all содержит результаты всех пакетов, в то время как другие артефакты содержат отдельные результаты каждого пакета.
Результаты TestPilot не определенные, поэтому даже если вы запустите его из одной и той же пакета на одной и той же машине несколько раз, вы получите разные результаты. Тем не менее, бензоры записывают достаточное количество данных, чтобы во многих случаях воспроизводить контрольный показатель.
Для этого используйте параметры --api и --responses для повторного использования списков и ответов API из предыдущего прогона:
node benchmark/run.js --outputDir < report_dir > --package < package_dir > --api < api.json > --responses < prompts.json >Обратите внимание, что по умолчанию повторение не удастся, если какое -либо из подсказок не будет найдено в файле ответов. Обычно это происходит, если TestPilot уточняет сбои тестов, поскольку в этом случае подсказка модели зависит от точного сообщения об отказе, которое может быть системным (например, содержащим локальные пути файловой системы) или зависит от версии node.js или других факторов.
Чтобы обойти эти ограничения, вы можете передать --strictResponses false Flag Обработка пропущенных подсказок, рассматривая их как не получая ответа от модели. Это, как правило, не даст тех же результатов, что и начальный запуск, но во многих случаях достаточно.
Запросы CodeQL в ql/queries могут использоваться для анализа результатов запуска эксперимента. См. ql/CodeQL.md для инструкций о том, как настроить CodeQL и запустить запросы.
Этот проект лицензирован в соответствии с условиями лицензии MIT с открытым исходным кодом. Пожалуйста, обратитесь к MIT для полных условий.
TestPilot является исследовательским прототипом и не поддерживается официально. Однако, если у вас есть вопросы или отзывы, пожалуйста, подайте проблему, и мы сделаем все возможное, чтобы ответить.
Мы благодарим Арьяз Эгбали (@aryaze) за его работу над первоначальной версией Testpilot.