Есть ли у вас какие-нибудь примеры реальных приложений тестирования мутаций? Работает ли это лучше, чем простые инструменты для покрытия тестов? Или это бесполезно?
Каковы преимущества / недостатки тестирования на мутации в реальном мире?
Да, вот мой вопрос, стоит ли это усилий в реальном мире. Я знаю, что есть некоторые теоретические работы по этому поводу. Но работает ли это на самом деле?
Дело не в том, что тестирование на мутации на самом деле проверяет тесты? Я имею в виду, что если вы можете изменить логику исходного кода и при этом пройти тесты, то, конечно, тесты не совсем правильные? Простите, если я чего-то упускаю ...
Да, мутационное тестирование, такое как покрытие кода, проверяет, достаточно ли ваших тестов.
Разница в том, что покрытие кода / ветки может быть полным, а ваши оракулы - нет, они могут не проверять все условия, даже если все строки программы были выполнены.
Аналогичный вопрос был задан на sqa.stackexchange.com/questions/5255/…, и ответы там говорят не только о стоимости настройки теста на мутацию, но и о его эффективности.
@Grundlefleck: Нет ничего лучше, чем «набор тестов правильный / неправильный». Тест просто ПЫТАЕТСЯ обнаружить отклонение вашей программы от указанного ЖЕЛАНИЯ программиста. Если набор тестов по-прежнему позволяет модифицированной программе пройти их, это означает, что вам помогли дополнительные сведения, чтобы вы могли ПОПРОБОВАТЬ уменьшить отклонение, добавив дополнительные тесты, которые не позволяют пройти измененной программе. Обратите внимание, что вы НЕ МОЖЕТЕ иметь «абсолютно правильные наборы тестов» в том смысле, что они обеспечат нулевое отклонение.
@Jon Limjap: 1) О разнице: традиционная разработка, основанная на тестах, просто пытается писать тесты перед каждой небольшой итерацией при написании программного обеспечения. Мутационное тестирование пытается проверить, являются ли тестовые примеры «хорошими», путем изменения исходного кода. Это два разных понятия. 2) Вы правы в том, что невозможно охватить все возможные варианты, но добавление другого способа тестирования может помочь увеличить охват тестированием.
Я написал статью, объясняющую, почему тестирование мутаций улучшает покрытие кода: pedrorijo.com/blog/intro-mutation надеюсь, что это поможет





Некоторое время назад я рассматривал тест на мутацию как метод проверки эффективности моих сценариев автоматического регрессионного тестирования. По сути, в некоторых из этих скриптов отсутствовали контрольные точки, поэтому, пока они правильно выполняли тестирование тестируемого приложения, они не сверяли результаты с базовыми данными. Я обнаружил, что гораздо более простым методом, чем изменение кода, было написать другое приложение, чтобы внести изменения в копию базовой линии и повторно запустить тесты для измененной базовой линии. В этом сценарии любой пройденный тест был либо ошибочным, либо неполным.
Это не настоящее тестирование на мутации, а метод, использующий аналогичную парадигму для проверки эффективности тестовых сценариев. Его достаточно просто реализовать, и IMO хорошо справляется со своей задачей.
Насколько дорого стоило написание отдельного приложения для проверки ваших тестов? Разве тестирование мутаций не поддерживается инструментами дешевле?
Не особо дорого, около 2 дней на все инструменты для письма, и я не мог найти ничего готового для работы. Идея заключалась в том, что для всех проходящих тестов изменение базовых данных должно привести к сбою. Если этого не произошло, это указывало на ошибочный тестовый пример. Фактический код для этого был специфичен для тестируемого приложения, но очень прост в том, что он делал.
Недавно я провел несколько исследований по тестированию на мутации. Результаты здесь:
http://abeletsky.blogspot.com/2010/07/using-of-mutation-testing-in-real.html
Вкратце: тестирование на мутации может дать некоторую информацию о качестве исходного кода и тестов, но его не так просто использовать.
Вы имели в виду "есть" или "НЕ" просто использовать?
Указанный блог больше не существует.
Полезность модульных тестов больше не обсуждается. Они необходимы для создания качественного приложения. Но как мы можем оценить их актуальность? Показатель покрытия кода до 100% не означает, что код протестирован на 100%. Это просто представление исполняемого кода во время выполнения модульных тестов. Мутационное тестирование позволит вам больше доверять своим тестам.
Это двухэтапный процесс:
Я написал об этом процессе целую статья, включая некоторые конкретные случаи.
Я поигрался с pitest для небольшого надуманного приложения:
Это java-инструмент, который автоматизирует создание мутантов. Вы можете запустить его в своем тестовом наборе, и он сгенерирует для вас HTML-отчеты, показывающие, сколько мутантов было убито. Выглядело довольно эффективно и не потребовало особых усилий для настройки. На самом деле в мире Java есть довольно много хороших инструментов для такого рода вещей. Смотрите также:
Для освещения.
Я считаю, что концепции мутационного тестирования верны. Это просто вопрос инструментальной поддержки и осведомленности. Вы пытаетесь найти компромисс между простотой традиционных показателей покрытия кода и дополнительной сложностью этого метода - на самом деле все сводится к инструментам. Если вы можете сгенерировать мутанты, то воля поможет выявить слабые места в ваших тестовых примерах. Стоит ли незначительное увеличение усилий по сравнению с уже проводимым вами тестированием? В случае с pitest я обнаружил, что тестовые примеры кажутся неочевидными.
Мутационное тестирование - это угол атаки, который сильно отличается от методологий модульного / функционального / интеграционного тестирования.
Я знаю, что это старый вопрос, но недавно дядя Боб написал в блоге очень интересную запись о мутирующем тестировании, которая может помочь понять полезность этого типа тестирования:
Мутационное тестирование помогло мне выявить проблемы с утверждениями тестового примера.
Например, когда вы получаете отчет, в котором говорится, что «ни один мутант не был убит тестовым примером x», вы смотрите, и оказывается, что утверждение было закомментировано.
Согласно Эта бумага, разработчики в Google используют тестирование мутаций в качестве дополнения к проверкам кода и запросам на вытягивание. Они кажутся довольными результатами:
Developers have decided to redesign large chunks of code to make them testable just so a mutant could be killed, they have found bugs in complex logical expressions looking at mutants, they have decided to remove code with an equivalent mutant because they deemed it a premature optimization, they’ve claimed the mutant saved them hours of debugging and even production outages because no test cases were covering the logic under mutation properly. Mutation testing has been called one of the best improvements in the code review verification in years. While this feedback is hardly quantifiable, combined with the sheer number of thousands of developers willing to inspect surfaced mutants on their code changes makes a statement.
Охват и тестирование на мутации. Старый вопрос, но недавно я наткнулся на недавний блог по этой теме. Довольно самоуверенный. Но различия между тестированием покрытия и тестированием на мутации четко сформулированы.
https://pedrorijo.com/blog/intro-mutation/
Мой собственный опыт показывает, что Pitest довольно полезен, но поскольку среда выполнения взрывается, он работает только с одним очень быстрым набором тестов. На практике это ограничивает область применения мутационного тестирования.
Еще одно забавное сравнение сделано в se.ewi.tudelft.nl/ti3115tu-2018/resources/…, сравнивая код с городом, преступление с ошибками, полицию с модульным тестированием и фальшивое преступление (чтобы проверить полицию) с тестированием мутаций.
Тестовый пример для первого ведет себя по-другому из-за вышеупомянутой мутации, теперь возникло исключение. Таким образом, он не возвращает ожидаемый массив {6,3}. Однако наш второй тестовый пример остается таким же, потому что он также включает положительное число. Таким образом, это также дает исключение для положительных чисел. Теперь, если нам нужно написать успешный тестовый пример, который будет Ввод = {- 6, -6, -7, -3, -4} Ожидается = {-6, -3}
Пожалуйста, редактировать свой ответ, чтобы улучшить форматирование кода. См. Как ответить.
Я не понимаю, чем это отличается от традиционной разработки через тестирование. Просто невозможно охватить все математические возможности, и я не думаю, что это того стоит.