Автоматический генератор модульных тестов с открытым исходным кодом и тестирование мутаций на основе LLM для автоматического тестирования программного обеспечения
ОБНОВЛЕНИЕ 18 июля 2024 г.
Мы рады поделиться нашей дорожной картой с описанием предстоящих функций и улучшений Mutahunter!
Посмотрите здесь: Дорожная карта
Мы будем рады услышать ваши отзывы, предложения и любые мысли по поводу мутационного тестирования. Присоединяйтесь к обсуждению и поделитесь своим мнением о дорожной карте или другими идеями, которые у вас есть. ?
Функции
Генератор модульных тестов: улучшение покрытия строк и мутаций (WIP)
Начало работы с мутационным тестированием
Примеры
Интеграция CI/CD
Mutahunter может автоматически генерировать модульные тесты для увеличения охвата строк и мутаций, используя модели большого языка (LLM) для выявления и заполнения пробелов в покрытии тестами. Он использует модели LLM для внедрения контекстно-зависимых ошибок в вашу кодовую базу. Этот подход, основанный на искусственном интеллекте, производит меньше эквивалентных мутантов, мутантов с более высоким потенциалом обнаружения ошибок, а также мутантов с более высокой связью и семантическим сходством с реальными ошибками, обеспечивая комплексное и эффективное тестирование.
Автоматическое создание модульных тестов: генерирует модульные тесты для увеличения покрытия строк и мутаций, используя LLM для выявления и заполнения пробелов в покрытии тестов. Дополнительные сведения см. в разделе «Генератор модульных тестов».
Независимый от языка: совместим с языками, которые предоставляют отчеты о покрытии в форматах Cobertura XML, Jacoco XML и lcov. Расширяется на дополнительные языки и среды тестирования.
Контекстно-зависимые мутации LLM: использует модели LLM для создания контекстно-зависимых мутантов. Исследования показывают, что мутанты, созданные с помощью LLM, обладают более высоким потенциалом обнаружения ошибок, меньшим количеством эквивалентных мутантов, а также более высокой связью и семантическим сходством с реальными ошибками. Он использует карту всего вашего репозитория git для создания контекстно-релевантных мутантов с помощью repomap помощника. Поддерживает самостоятельные LLM, Anthropic, OpenAI и любые модели LLM через LiteLLM.
Мутации на основе различий: запускает мутационные тесты для измененных файлов и строк на основе последних изменений фиксации или запроса на извлечение, гарантируя, что проверяются только соответствующие части кода.
LLM Анализ выживших мутантов: автоматически анализирует выживших мутантов для выявления потенциальных слабых мест в наборе тестов, уязвимостей и областей для улучшения.
Этот инструмент генерирует модульные тесты для увеличения охвата как строк, так и мутаций, вдохновленный статьями:
Улучшение автоматизированного модульного тестирования с использованием больших языковых моделей в Meta: — Использует LLM для выявления и заполнения пробелов в тестовом покрытии.
Эффективная генерация тестов с использованием предварительно обученных моделей большого языка и мутационного тестирования: — Генерирует тесты, которые обнаруживают и уничтожают мутанты кода, обеспечивая надежность.
## перейти к примерам/java_maven## удалить некоторые тесты из BankAccountTest.javamutahunter gen-line --test-command "mvn test -Dtest=BankAccountTest" --code-coverage-report-path "target/site/jacoco/jacoco. xml" --coverage-type jacoco --test-file-path "src/test/java/BankAccountTest.java" --source-file-path "src/main/java/com/example/BankAccount.java" --model "gpt-4o" --target-line-coverage 0.9 --max-attempts 3 Покрытие линии увеличено с 47,00% до 100,00%. Покрытие мутаций увеличено с 92,86% до 92,86%.
# Установите пакет Mutahunter через GitHub. Требуется Python 3.11+.$ pip install muthaunter# Работайте с GPT-4o в вашем репозитории$export OPENAI_API_KEY=ваш-ключ-идет-сюда# Или работайте с моделями Anthropic$export ANTHROPIC_API_KEY=ваш-ключ-идет-сюда# Запустить Мутахантер в конкретном файле. # Отчет о покрытии должен соответствовать тестовой команде. $ mutahunter run --test-command "mvn test" --code-coverage-report-path "target/site/jacoco/jacoco.xml" --coverage-type jacoco -- модель «ГПТ-4о-мини». . . . .-. .-. . . . . . . .-. .-. .-.|/| | | | |-| |-| | | || | |- |(' ` `-' ' ` ' ' ` `-' ' ` ' `-' ' '2024-07-29 12:31:22,045 ИНФОРМАЦИЯ:=-=-=-=-=-=-= -=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Общий охват мутаций ? Охват: 63,33% ? Всего мутантов: 30 ??️ Выживших мутантов: 11 ?️ ?️ Убитых мутантов: 19 ?️ Мутантов с ошибкой компиляции: 0 ? Общая стоимость: 0,00167 долларов США ?=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=29 июля 2024 12 :31:22,050 ИНФОРМАЦИЯ: Сгенерирован HTML-отчет:mutation_report.html2024-07-29 12:31:22,058 ИНФОРМАЦИЯ: Сгенерирован HTML-отчет: 1.html2024-07-29 12:31:22,058 ИНФОРМАЦИЯ: Тестирование мутаций завершилось 127 секунд.
Перейдите в каталог примеров, чтобы узнать, как запустить Mutahunter на разных языках программирования:
Проверьте пример Java, чтобы увидеть некоторые интересные примеры тестирования мутаций на основе LLM.
Пример Java
Пример перехода
Пример JavaScript
Пример Python FastAPI
Не стесняйтесь добавлять больше примеров!
Вы можете интегрировать Mutahunter в свой конвейер CI/CD, чтобы автоматизировать тестирование мутаций. Вот пример файла рабочего процесса GitHub Actions:
имя: Mutahunter CI/CD на: push: ветки: - основной pull_request: ветки: - основные задания: mutahunter: запуск: ubuntu-latest шаги: - имя: Репозиторий Checkout использует: действия/checkout@v4 с: fetch-глубина: 2 # необходимо для git diff - имя: Настройка Python использует: действия/setup-python@v5 с: python-версия: 3.11 - имя: Установить Запуск Mutahunter: pip install mutahunter - имя: Настройка Java для вашего проекта использует: действия/setup-java@v2 с: дистрибутив: "adopt" Java-версия: "17" - имя: Установить зависимости и запустить тесты запустить: mvn test - имя: Запустить Mutahunter env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} run: | mutahunter run --test-command "mvn test" --code-coverage-report-path "target/site/jacoco/jacoco.xml" --coverage-type jacoco --model "gpt-4o" --diff - name : PR-комментарий, который использует покрытие мутаций: thollander/[email protected] с: filePath: журналы/_latest/coverage.txt