Дайджест мутационного тестирования за июль 2026 года.
Выжившие мутанты как рабочие задания, оценки проходят проверку
На этой странице 17 разделов
Прототип на большой языковой модели (LLM) убил 95,3% вручную проверенных выживших мутантов, меняющих поведение; PHP-библиотека обнаружила 434 выживших, скрывавшихся за стопроцентным покрытием строк; а сломанный канал вывода показал, насколько легко дефектная экспериментальная инфраструктура создаёт впечатляющие результаты. Июльские прототипы показали впечатляющие цифры, но пароль администратора остался у реальности.
Область обзора: работы, впервые ставшие общедоступными в июле, а также июльские события, связанные с публикацией работ, чьи более ранние версии явно отмечены; индексация всё ещё может запаздывать.
Выжившие стали рабочими заданиями
LLMutantKiller передаёт LLM конкретного выжившего мутанта StrykerJS вместе с данными о результатах выполнения и просит написать Jest-тест, который его убьёт. Исследователи отобрали 915 выживших из 13 проектов на JavaScript и TypeScript и вручную классифицировали 815 из них как меняющих поведение. Claude Sonnet 4.6 убил 777, то есть 95,3%; Devstral достиг 62,4%, а Llama 3.3 — 26,5%.
Результат сильный, задача узкая: он не показывает, способна ли система самостоятельно находить ошибки и насколько удобны эти тесты в сопровождении. В исследовании использовалась выборка вручную размеченных выживших из одной экосистемы, а исследования с разработчиками не было. Дата первого публичного появления работы неясна, поэтому считаем её июльским конференционным событием.
TATG отслеживает цели по покрытию ветвей и тестовым утверждениям, ещё не достигнутые сгенерированными тестами, а затем использует выживших для следующего раунда. На 141 Java-методе он сообщает о превосходстве над указанными базовыми системами на 20,14–37,66 процентного пункта по покрытию строк, покрытию ветвей и мутационной оценке. Ограничения: по одному методу за раз, мутационная оценка как конечная метрика и лишь частичное сравнение с проприетарной системой.
Несколько июльских проектов обращались с выжившим как с машиночитаемым тикетом: написать один тест, доказать одно различие или объяснить эквивалентность. Красное число наконец получило работу.
Что происходило в настоящих репозиториях
За стопроцентным покрытием строк скрывались 434 выживших
Passkeys PR #43 начинался со стопроцентного покрытия строк, но при этом имел 434 выживших из 1 560 мутантов и мутационную оценку покрытого кода 72%. После добавления 92 тестов и 178 проверок в актуальном состоянии открытого пул-реквеста осталось 13 выживших из 1 548, то есть примерно 99%; предложенный порог равен 98%, поскольку PHP-движки покрытия PCOV и Xdebug немного расходятся. Общее число мутантов различается, поэтому напрямую сравнивать проценты нельзя.
Cashu добавил мутационную проверку в каждый пул-реквест, а затем убрал её
Cashu добавил плановый запуск Stryker в #733, обязательную проверку пул-реквестов в #754, а затем удалил её в #773. Сигнал ослабили выжившие мутанты, унаследованные от старого кода, устаревшие базовые результаты и запуски по 10–90 минут без обратной связи от бота в пул-реквесте, поэтому оставили плановые прогоны и узкие локальные проверки.
OpenHands выбрал отчёты по запросу
OpenHands PR #16184, влитый 30 июля, добавил отчёты по запросу для всей кодовой базы или только изменённого кода, но не сделал их обязательной проверкой в CI. Пробный запуск на одном файле убил 23 мутанта; в последующей задаче поставили под сомнение около 1 000 добавленных строк lock-файла. Дополнительные зависимости и сопутствующие изменения lock-файла — тоже цена внедрения.
Полевые заметки: полезные, небольшие и с правильными оговорками
| Проект | Что произошло в июле | Статус/урок |
|---|---|---|
| async-test-lib #162 | Кампания с Java-инструментом PIT нашла два дефекта; 80-минутное выполнение и нестабильные результаты вынудили оставить порог обязательной проверки на уровне 74% | Влит |
| roastpilot-cloud #68 | Два выживших мутанта, меняющих поток управления, выявили пути преждевременной остановки; сохранённый базовый результат пришлось защитить от ручного редактирования | Влит |
| Mostro #849 | Убиты десять Rust-мутантов; также проявились проблемы с порядком тестов и памятью | Открыт |
| HyperDX #2755 | Локальный пилот на пяти файлах нашёл пути обработки дат, чьи результаты тесты никогда не проверяли | Открыт |
| Uber H3 #1202 | Предложение Mull; рецензенты усомнились в стоимости запуска для каждого пул-реквеста | Открыт |
| ROCm #10021 | Рецензенты запросили записи о дефектах, область анализа и оценку | Запрошены изменения |
Кампания с ИИ и Java-инструментом PIT привела к семи принятым патчам — Google Truth, OpenNLP, Tika, DKPro JWPL, DataStax CDM, Taikai и Cluecumber, — тогда как ещё пять пул-реквестов закрыли: AssertJ, YDB, ApprovalTests.Java, BungeeCord и Oviva eHealthID. Предложенные тесты иногда дублировали покрытие, пересекали границы абстракций, избыточно фиксировали поведение или не соответствовали стилю проекта. Агенты предложили; сопровождающие решили.
Аудит пришёл вместе с автоматизацией
Обнаружение эквивалентных мутантов показало улучшения — и сразу столкнулось с более строгой проверкой
Две июльские публикации учитывают структуру программы при распознавании эквивалентных мутантов с помощью машинного обучения:
- SGENT сравнивает пары оригинал/мутант с помощью сиамской нейронной сети, построенной по графам структуры кода, порядка выполнения и зависимостей значений. На 189 424 размеченных мутантах из десяти проектов в аннотации сообщается о результате 85,28% по F1 — метрике, которая сочетает точность и полноту.
- RIP-Guided Graph Evidence передаёт LLM сведения о том, достигает ли выполнение места мутации, меняет ли мутация состояние программы и доходит ли изменение до наблюдаемой точки. На выборке из примерно 189 000 Java-мутантов десяти проектов авторы сообщают о приросте примерно на 8–12 пунктов F1 относительно промптинга только с кодом.
Оба подхода перспективны, но наборы данных с преобладанием одного класса или плохо разделёнными примерами обучения и оценки способны выдать распознавание знакомых шаблонов за рассуждение о поведении. Четыре общих автора и почти одинаковые размеры наборов означают, что это связанные исследования, а не независимые репликации.
Затем официальная аннотация «Re-evaluating Detection of Equivalent Mutants Using LLMs» устроила холодный душ. Каждый оценённый метод работал хуже на новых проектах, языках и операторах. Там же сообщается, что одни и те же Java-методы встречались и в обучающих, и в оценочных данных, и описывается упрощённая стратегия: для каждого Java-метода предсказывать наиболее частый класс — «эквивалентен» или «не эквивалентен». На дату сбора материалов полной статьи в открытом доступе не было, поэтому точные величины падения были бы спекуляцией.
Корректный поведенческий свидетель использует публичный интерфейс, проходит на оригинале и надёжно падает на мутанте; ответ классификатора «эквивалентен» остаётся зависящей от набора данных подсказкой для сортировки.
Оценка по-разному ответила на два разных вопроса
Масштабное исследование воспроизводимости с публичным кодом и данными проанализировало более 100 000 Java-тестов, созданных 11 LLM. Покрытие и мутационная оценка могли помогать сравнивать генераторы, когда данная программа считалась правильной. Когда тесты генерировались по уже ошибочному коду, покрытие не позволяло надёжно предсказать, обнаружат ли они ошибку; мутационную оценку в этом сценарии не проверяли, поскольку мутационный анализ предполагает изначально проходящий набор тестов.
Полезная метрика, другой вопрос.
Самым полезным июльским результатом мог оказаться сбой в канале вывода
Adversarial Test-Hardening for AI-Written Code использовал выживших для улучшения Python-тестов. После исправлений в пяти независимых запусках для каждой из четырёх программ доля убитых выживших составила в среднем 78,3%, а статистически оценённый 95-процентный диапазон неопределённости — 59,2–93,5%; протокол и код открыты. Более ранний впечатляющий эффект возник из-за незаметного обрезания вывода и несогласованной процедуры формирования выборки в разных версиях эксперимента. Автор исправил обе проблемы и до повторного запуска публично зафиксировал план скорректированного анализа — потому что инфраструктура, способная придумать эффект, является частью эксперимента.
Mure даёт те же результаты мутационного тестирования глубоких нейросетей при меньших затратах
Mure ускоряет мутационное тестирование глубоких нейронных сетей, повторно используя неизменившиеся ранние слои и заново выполняя только затронутые поздние. Заявлено точное совпадение результатов с обычным полным прогоном и среднее снижение стоимости на 44,54% для 15 моделей; артефакт опубликован. «Без потерь» описывает результат повторного использования, а не качество мутантов или правила их убийства.
Июльский исследовательский радар
| Работа | Июльское событие | Редакционная оценка |
|---|---|---|
| LogMorph | Операторы Prolog, выведенные из 200 вручную классифицированных исправлений среди 7 201 решения | Хорошая предметная основа; похожие распределения выходных значений не доказывают одинаковое поведение. Июльские материалы вышли после майской страницы автора |
| MuGu | Специфичные для безопасности мутации и приоритизация | Заявлены мутационная оценка безопасности 96,3% и сокращение трудозатрат на тестирование на 71,8% в наборах SIR и Defects4J, а не в развёрнутых системах |
| Machine Learning in Mutation Testing | Систематический обзор | Полезный обзор на восьми страницах; две базы данных и отсутствие количественного синтеза |
| Нейронный поиск по дереву Монте-Карло для смарт-контрактов | Июльское журнальное расширение более ранней работы ASCENT | Использует поиск по дереву Монте-Карло для приоритизации тестов; сообщает о сокращении числа запусков тестов на 28–61% в пяти проектах, но не общей стоимости |
| Операторы мутации Terraform | Статья на основе диссертации 2025 года с тем же названием | Полезное расширение предметной области; доказательства специфичны для Terraform |
| Violation-Aware Mutation Testing for Deep-Learning Primitives | Размещение на SSRN | Заслуживающий внимания препринт, а не рецензированное исследование |
| Модельно-ориентированная мутация Java-байткода | Журнальная статья | Расширение публичной работы 2024 года, а не новое направление |
| VIZDETOUR | Преобразования с сохранением визуализации | Сообщается о 47 новых ошибках рендеринга, 39 подтверждены и 18 исправлены; это направление смежно с обычным мутационным тестированием с расчётом мутационной оценки |
| Генерация свойств Solidity | Мутационная оценка применяется к сгенерированным свойствам | Лучшее среднее — 25,99% против 31,75% у свойств, написанных людьми; вклад работы — генерация свойств |
| When Knowledge Changes | Мутирует извлечённые документы, на основе которых модель формирует ответ | Более 28 000 мутантов; 4,9–10,2% нарушили ожидаемые правила согласованности; смежная область |
После проверки происхождения из числа впервые появившихся в июле исключены: мультиязычное исследование, Round-Trip, MuMuTestUp, Test vs Mutant, Argus и Intent-Based Mutation Testing.
Устоявшиеся инструменты: меньше зрелищ, больше эксплуатационных исправлений
Stryker4s 1.0.0 вышел 15 июля, за ним последовали исправления и 1.1.1 30 июля. В нём переписали поддержку Maven и добавили поддержку Mill, Scala 3.9 и генерации байткода для Java 17. В анонсе сопровождающие сообщают, что запуск мутаций для одного Maven-модуля сократился примерно с 16 минут до 12 секунд. Это результат проекта, а не универсальное обещание.
mutmut 3.7.0 теперь сбрасывает кэшированные результаты, если на них могли повлиять изменения самой функции, одной из вызывающих её функций, конфигурации или связанных файлов, отслеживаемых Git. Изменения в файлах без Python-кода по умолчанию вызывают предупреждение и могут принудительно запустить полный повторный анализ.
| Инструмент | Июльское обновление |
|---|---|
| Stryker.NET 4.16.0 | Генератор отчётов в формате GitLab Code Quality; сохранение уже загруженных отчётов на панели |
| PIT 1.25.6, 1.25.7, 1.25.8 | Работа с Quarkus/JaCoCo, обновление библиотеки байткода, исправления работы с большими числами в Java 25 |
| Infection 0.34.1 | Исправления путей Git/PCOV и лимита памяти PHPStan |
| pytest-gremlins 1.9.0 | --gremlin-explain и исправления покрытия/конфигурации; опубликован 1 июля, журнал изменений датирован 29 июня |
| Gomutants 0.5.0 | Исключения вызовов, передача флагов тестов, коды завершения, исправления |
| Mutago 2.7.6–2.7.7 | Исправлены позиции в исходниках и diff, отфильтрованы некорректные Go-мутанты, добавлены запуски для пул-реквестов, ограниченные изменёнными строками; go-mutesting 2.7.9 с частично совпадающей функциональностью в основном направляет пользователей к Mutago |
| mutflow 1.0.4 | Убраны мутации null-проверок Kotlin; исправлены типы в арифметических операциях с double |
| Pest Plugin Mutate 5.0.0 | Совместимость с Pest 5/PHP 8.4 |
| R muttest 0.3.0 | Стандартные JSON/HTML-отчёты для других инструментов и более ясные состояния отсутствия покрытия/сбоя; мутанты, завершившиеся ошибкой, теперь считаются убитыми, поэтому оценка может измениться без усиления тестов |
| MutatoR 0.1.0–0.2.1 | tinytest, выбор с учётом покрытия, исправления очистки и работы в Windows |
| Stryker Bun Runner | Девять выпусков 1.3.x: управление воркерами, ссылки на исходный код из результатов покрытия, исправления гонок отладчика и инкрементальные отчёты |
| Mutation Testing Elements / Stryker Dashboard 0.20.6 | Исправления рендеринга отчётов и цветов терминала, а также исправления безопасности и проверки отчётов |
Популярные, но тихие в июле: StrykerJS, cargo-mutants, Mull, Cosmic Ray, Ruby Mutant, Major и MuJava.
Новые инструменты: мутация выбралась из привычного зоопарка языков
«Новым» считается инструмент, впервые публично представленный в июле в виде реализации или пакета и не имеющий более ранней проверяемой публичной истории. Для большинства характерны версия 0.x, единственный автор, возраст в несколько дней или сочетание этих признаков.
| Инструмент | Объект мутации | Чем интересен | Что важно учесть |
|---|---|---|---|
| Oasis | Terraform/OpenTofu | Разбирает конфигурацию инфраструктуры, применяет предметные изменения, запускает terraform test | Начат 2 июля; v0.0.4 |
| PSMutant | PowerShell/Pester | Мутирует синтаксическое дерево только для строк, выполняемых тестами, и запускает мутанты в одноразовых песочницах; пакет Gallery | Один выпуск 0.1.0 и шесть коммитов |
| active_mutator | Ruby/RSpec/Rails | Запускает только тестовые примеры, покрывающие мутированный код, изолирует каждый запуск и хранит список мутантов, признанных эквивалентными | От RubyGems 0.1.0 до 0.3.0 за три недели |
| Cerebrum | Несколько языков | LLM генерирует патчи в изолированных рабочих каталогах Git и ограничивает их изменённым или покрытым тестами кодом | Достаточно развитый пакет 0.2.0; зависит от модели и облака |
| Stryker Zod mutator | Схемы Zod v4 | Сорок операторов, учитывающих семантику схем | Экспериментальная версия 0.0.x; зависит от недокументированных внутренних API Stryker |
Экспериментальный стенд быстро заполнился: Angelo для Python/pytest, codingconcepts/mutant для Go, mutash для Bash/Bats, rexmut для регулярных выражений, cobmut для GnuCOBOL, unimut для C и mutate4csharp от Microsoft, доступный только в исходниках, без опубликованного пакета. Да, новый мутатор появился даже у COBOL. Наследие по-прежнему живее всех живых.
Для трёх пакетов с кодом публичной истории исходников не было: mutate4js, aegismut и mutant-mcp. Архивы пакетов не раскрывают историю разработки.
Появились и инструменты для ИИ-агентов и проверок изменённого кода: Playwright Mutation Gate инвертирует выбранные проверки, MTT Harness запускает мутационное тестирование с ограниченным охватом для JavaScript, TypeScript и Go, AITG ограничивает Stryker изменённым кодом, а TestForge использует PIT для оценки сгенерированных Java-тестов. Небольшие эксперименты: move-test-gen, DiffProof, Mutinerie, Witness, Quality Kit, Quality Kit Python, ToppleCat, fineness, pytest-mutation-verified и falsify.
После проверки происхождения исключены: Gutcheck, Chaos-MCP, Flawd и QuMu.
Патентный радар: один выданный патент, без новых технических сведений
7 июля Китай выдал Бэйханскому университету патент CN115712574B; официальный поиск доступен на сайте Национального управления интеллектуальной собственности Китая. Его конвейер для ИИ-компонентов использует доли убитых мутантов трёх типов: данных, модели и программы. Но тот же текст появился в CN115712574A ещё в феврале 2023 года: в июле выдали патент, а не представили новый мутационный движок. Поиск по июльским патентным притязаниям не нашёл второго релевантного документа; индексация может запаздывать, и это не юридическая консультация.
Что ещё почитать и послушать
- В разборе языка смарт-контрактов DAML от Trail of Bits три из семи выживших мутантов признали эквивалентными или недостижимыми, а остальные четыре указали на недостающие тесты; код вышел в июне, об обнаружении ошибки не заявлялось.
- Полевой отчёт NEXL о Ruby сообщает, что работа с выжившими при полном покрытии выявила два сбоя из-за переполнения стека; отчёт с первичными данными не приложен.
- Х. Флойд в «Your Tests Pass. So What?» сообщает об убийстве 38 из 105 мутантов, а затем превращает 67 выживших в очередь задач для Claude — с правильными предупреждениями об эквивалентных мутантах и закреплении существующего неверного поведения в новых тестах.
- Заметка Мариано Альвареса о StrykerJS ставит рядом покрытие выше 90% и мутационную оценку 71,42%; закрытая кодовая база не позволяет воспроизвести результат.
- Ruby on Rails Podcast #541 беседует с автором Mutant Маркусом Ширпом о мутационном тестировании кода, написанного агентами.
- Доклад Пьера Доната-Буийю о MutatoR на useR! и пост Якуба Соболевского о muttest 0.3.0 рассказывают об инструментах для R и совместимых отчётах.
- Пост Владислава Дмитриева о Playwright и обсуждение на Reddit сообщают, что тесты заметили 63 намеренно инвертированные проверки, а один отключённый тест оценить не удалось. Это всё ещё не доказывает, что тесты проверяют реальное внешнее поведение приложения.
Ни одной заметной июльской истории, впервые появившейся на Hacker News или Lobsters, не обнаружено.
Что подтвердил июль
- Несколько проектов превратили выживших в конкретные рабочие задания: одно точное изменение, одна задача на написание теста или ревью — а не очередной процент на панели.
- Июльские аудиты ещё раз показали, что поведенческие свидетельства важнее впечатляющих косвенных показателей: утечка данных между обучением и оценкой, плохое разделение наборов данных, редактируемые вручную базовые результаты и обрезанный вывод могут завысить оценку.
- Опыт репозиториев снова показал, что внедрение зависит от пригодности инструмента для конкретной области и полной стоимости: в неё входят вычисления, вызовы моделей, кэширование, зависимости, нестабильные запуски, накопившиеся неразобранные выжившие мутанты и время ревью.
Прогресс, не магия. У магии ужасная воспроизводимость.