В чем разница между тестированием на основе свойств и тестированием на мутации?
Мой контекст для этого вопроса в Python.
Библиотека тестирования гипотез (т.е. тестирование на основе свойств): https://hypothesis.readthedocs.io/en/latest/
Библиотека тестирования мутаций: https://github.com/sixty-north/cosmic-ray
1 ответ
Это очень разные звери, но оба улучшат ценность и качество ваших тестов. Оба инструмента вносят вклад и делают утверждение "Мой охват кода N%" более значимым.
Гипотеза поможет вам генерировать всевозможные тестовые входные данные в определенной области для тестируемой функции.
Обычно, когда вам нужно протестировать функцию, вы предоставляете несколько примеров значений, пытаясь охватить все варианты использования и крайние случаи, основанные на отчетах о покрытии кода - это так называемое "тестирование на основе примеров". Гипотеза, с другой стороны, реализует основанное на свойствах тестирование, генерирующее целую кучу разных входов и комбинаций входов, помогая отлавливать различные распространенные ошибки, такие как деление на ноль, None
0, ошибочные ошибки и т. Д. И помощь в поиске скрытых ошибок.
Мутационное тестирование - это изменение тестируемого кода на лету во время выполнения тестов с использованием модифицированной версии кода.
Это действительно помогает увидеть, действительно ли ваши тесты тестируют то, что они должны тестировать, чтобы понять ценность ваших тестов. Мутационное тестирование было бы действительно блестящим, если у вас уже есть богатая тестовая база кода и хорошее покрытие кода.
Что помогло мне овладеть этими концепциями, так это подкасты Python:
Я автор или mutmut, лучший тестер мутаций для Python. У @alecxe есть очень хороший ответ, но я хотел бы остановиться на нем подробнее. Прочтите его ответ перед моим, чтобы понять основной контекст.
Есть и другие большие различия, например, PBT требует умственной работы, чтобы определить правила для каждой тестируемой функции, в то время как MT требует, чтобы вы обосновывали все поведение в коде, которое требует гораздо меньше когнитивных усилий.
MT - это фактически белый ящик и черный ящик PBT.
Другое отличие состоит в том, что МП - это исследование (довольно маленького) конечного пространства, а ПБТ - исследование бесконечного пространства (практически). Практическое следствие состоит в том, что вы можете тривиально узнать, когда вы закончили с MT, в то время как вы можете запускать PBT годами, и вы не можете знать, обыскивал ли он соответствующие части пространства. По этой причине улучшенные правила для PBT радикально сокращают время выполнения.
Мутационное тестирование также требует минимального кода. Это удивительный эффект, но я испытываю его снова и снова. Это приятный маленький бонус для MT.
Вы также можете использовать МТ в качестве простого контрольного списка для достижения 100% покрытия мутаций, вам совсем не нужно начинать со 100% покрытия. Но с PBT вы можете начать намного ниже 100% покрытия, по сути, с 0% перед тем, как начать.
Надеюсь, это немного проясняет ситуацию.