Полезно ли мутационное тестирование на практике?

Есть ли у вас какие-нибудь примеры реальных приложений тестирования мутаций? Работает ли это лучше, чем простые инструменты для покрытия тестов? Или это бесполезно?

Каковы преимущества / недостатки тестирования на мутации в реальном мире?

Я не понимаю, чем это отличается от традиционной разработки через тестирование. Просто невозможно охватить все математические возможности, и я не думаю, что это того стоит.

Jon Limjap 28.10.2008 12:31

Да, вот мой вопрос, стоит ли это усилий в реальном мире. Я знаю, что есть некоторые теоретические работы по этому поводу. Но работает ли это на самом деле?

Mnementh 28.10.2008 12:35

Дело не в том, что тестирование на мутации на самом деле проверяет тесты? Я имею в виду, что если вы можете изменить логику исходного кода и при этом пройти тесты, то, конечно, тесты не совсем правильные? Простите, если я чего-то упускаю ...

Grundlefleck 28.10.2008 13:20

Да, мутационное тестирование, такое как покрытие кода, проверяет, достаточно ли ваших тестов.

Mnementh 28.10.2008 13:29

Разница в том, что покрытие кода / ветки может быть полным, а ваши оракулы - нет, они могут не проверять все условия, даже если все строки программы были выполнены.

dzieciou 26.11.2012 00:38

Аналогичный вопрос был задан на sqa.stackexchange.com/questions/5255/…, и ответы там говорят не только о стоимости настройки теста на мутацию, но и о его эффективности.

dzieciou 26.11.2012 10:42

@Grundlefleck: Нет ничего лучше, чем «набор тестов правильный / неправильный». Тест просто ПЫТАЕТСЯ обнаружить отклонение вашей программы от указанного ЖЕЛАНИЯ программиста. Если набор тестов по-прежнему позволяет модифицированной программе пройти их, это означает, что вам помогли дополнительные сведения, чтобы вы могли ПОПРОБОВАТЬ уменьшить отклонение, добавив дополнительные тесты, которые не позволяют пройти измененной программе. Обратите внимание, что вы НЕ МОЖЕТЕ иметь «абсолютно правильные наборы тестов» в том смысле, что они обеспечат нулевое отклонение.

CuongHuyTo 13.01.2014 13:03

@Jon Limjap: 1) О разнице: традиционная разработка, основанная на тестах, просто пытается писать тесты перед каждой небольшой итерацией при написании программного обеспечения. Мутационное тестирование пытается проверить, являются ли тестовые примеры «хорошими», путем изменения исходного кода. Это два разных понятия. 2) Вы правы в том, что невозможно охватить все возможные варианты, но добавление другого способа тестирования может помочь увеличить охват тестированием.

CuongHuyTo 13.01.2014 13:07

Я написал статью, объясняющую, почему тестирование мутаций улучшает покрытие кода: pedrorijo.com/blog/intro-mutation надеюсь, что это поможет

pedrorijo91 15.02.2019 12:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
45
9
5 914
8

Ответы 8

Некоторое время назад я рассматривал тест на мутацию как метод проверки эффективности моих сценариев автоматического регрессионного тестирования. По сути, в некоторых из этих скриптов отсутствовали контрольные точки, поэтому, пока они правильно выполняли тестирование тестируемого приложения, они не сверяли результаты с базовыми данными. Я обнаружил, что гораздо более простым методом, чем изменение кода, было написать другое приложение, чтобы внести изменения в копию базовой линии и повторно запустить тесты для измененной базовой линии. В этом сценарии любой пройденный тест был либо ошибочным, либо неполным.

Это не настоящее тестирование на мутации, а метод, использующий аналогичную парадигму для проверки эффективности тестовых сценариев. Его достаточно просто реализовать, и IMO хорошо справляется со своей задачей.

Насколько дорого стоило написание отдельного приложения для проверки ваших тестов? Разве тестирование мутаций не поддерживается инструментами дешевле?

dzieciou 26.11.2012 00:40

Не особо дорого, около 2 дней на все инструменты для письма, и я не мог найти ничего готового для работы. Идея заключалась в том, что для всех проходящих тестов изменение базовых данных должно привести к сбою. Если этого не произошло, это указывало на ошибочный тестовый пример. Фактический код для этого был специфичен для тестируемого приложения, но очень прост в том, что он делал.

SmacL 26.11.2012 17:57

Недавно я провел несколько исследований по тестированию на мутации. Результаты здесь:

http://abeletsky.blogspot.com/2010/07/using-of-mutation-testing-in-real.html

Вкратце: тестирование на мутации может дать некоторую информацию о качестве исходного кода и тестов, но его не так просто использовать.

Вы имели в виду "есть" или "НЕ" просто использовать?

dzieciou 26.11.2012 01:24

Указанный блог больше не существует.

devoured elysium 31.08.2015 16:02

Полезность модульных тестов больше не обсуждается. Они необходимы для создания качественного приложения. Но как мы можем оценить их актуальность? Показатель покрытия кода до 100% не означает, что код протестирован на 100%. Это просто представление исполняемого кода во время выполнения модульных тестов. Мутационное тестирование позволит вам больше доверять своим тестам.

Это двухэтапный процесс:

  1. Создавайте мутантов.
  2. Убедитесь, что мутации обнаружены тестами.

Я написал об этом процессе целую статья, включая некоторые конкретные случаи.

Я поигрался с pitest для небольшого надуманного приложения:

http://pitest.org/

Это java-инструмент, который автоматизирует создание мутантов. Вы можете запустить его в своем тестовом наборе, и он сгенерирует для вас HTML-отчеты, показывающие, сколько мутантов было убито. Выглядело довольно эффективно и не потребовало особых усилий для настройки. На самом деле в мире Java есть довольно много хороших инструментов для такого рода вещей. Смотрите также:

http://www.eclemma.org/

Для освещения.


Я считаю, что концепции мутационного тестирования верны. Это просто вопрос инструментальной поддержки и осведомленности. Вы пытаетесь найти компромисс между простотой традиционных показателей покрытия кода и дополнительной сложностью этого метода - на самом деле все сводится к инструментам. Если вы можете сгенерировать мутанты, то воля поможет выявить слабые места в ваших тестовых примерах. Стоит ли незначительное увеличение усилий по сравнению с уже проводимым вами тестированием? В случае с pitest я обнаружил, что тестовые примеры кажутся неочевидными.

Мутационное тестирование - это угол атаки, который сильно отличается от методологий модульного / функционального / интеграционного тестирования.

  1. Вы тестируете свой набор тестов - это мета-тест всей вашей программы тестирования.
  2. Это вдохновляет на дополнительные контрольные примеры, о которых вы иначе не могли бы подумать.

Я знаю, что это старый вопрос, но недавно дядя Боб написал в блоге очень интересную запись о мутирующем тестировании, которая может помочь понять полезность этого типа тестирования:

Дядя Боб изменяет сообщение в блоге о тестировании

Мутационное тестирование помогло мне выявить проблемы с утверждениями тестового примера.

Например, когда вы получаете отчет, в котором говорится, что «ни один мутант не был убит тестовым примером 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/…, сравнивая код с городом, преступление с ошибками, полицию с модульным тестированием и фальшивое преступление (чтобы проверить полицию) с тестированием мутаций.

Michiel Leegwater 18.07.2019 01:17

Тестовый пример для первого ведет себя по-другому из-за вышеупомянутой мутации, теперь возникло исключение. Таким образом, он не возвращает ожидаемый массив {6,3}. Однако наш второй тестовый пример остается таким же, потому что он также включает положительное число. Таким образом, это также дает исключение для положительных чисел. Теперь, если нам нужно написать успешный тестовый пример, который будет Ввод = {- 6, -6, -7, -3, -4} Ожидается = {-6, -3}

Пожалуйста, редактировать свой ответ, чтобы улучшить форматирование кода. См. Как ответить.

Gander 17.12.2020 13:14

Другие вопросы по теме