В чем разница между тестированием на основе свойств и тестированием на мутации?

Мой контекст для этого вопроса в Python.

Библиотека тестирования гипотез (т.е. тестирование на основе свойств): https://hypothesis.readthedocs.io/en/latest/

Библиотека тестирования мутаций: https://github.com/sixty-north/cosmic-ray

1 ответ

Решение

Это очень разные звери, но оба улучшат ценность и качество ваших тестов. Оба инструмента вносят вклад и делают утверждение "Мой охват кода N%" более значимым.


Гипотеза поможет вам генерировать всевозможные тестовые входные данные в определенной области для тестируемой функции.

Обычно, когда вам нужно протестировать функцию, вы предоставляете несколько примеров значений, пытаясь охватить все варианты использования и крайние случаи, основанные на отчетах о покрытии кода - это так называемое "тестирование на основе примеров". Гипотеза, с другой стороны, реализует основанное на свойствах тестирование, генерирующее целую кучу разных входов и комбинаций входов, помогая отлавливать различные распространенные ошибки, такие как деление на ноль, None0, ошибочные ошибки и т. Д. И помощь в поиске скрытых ошибок.

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

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


Что помогло мне овладеть этими концепциями, так это подкасты Python:

Я автор или mutmut, лучший тестер мутаций для Python. У @alecxe есть очень хороший ответ, но я хотел бы остановиться на нем подробнее. Прочтите его ответ перед моим, чтобы понять основной контекст.

Есть и другие большие различия, например, PBT требует умственной работы, чтобы определить правила для каждой тестируемой функции, в то время как MT требует, чтобы вы обосновывали все поведение в коде, которое требует гораздо меньше когнитивных усилий.

MT - это фактически белый ящик и черный ящик PBT.

Другое отличие состоит в том, что МП - это исследование (довольно маленького) конечного пространства, а ПБТ - исследование бесконечного пространства (практически). Практическое следствие состоит в том, что вы можете тривиально узнать, когда вы закончили с MT, в то время как вы можете запускать PBT годами, и вы не можете знать, обыскивал ли он соответствующие части пространства. По этой причине улучшенные правила для PBT радикально сокращают время выполнения.

Мутационное тестирование также требует минимального кода. Это удивительный эффект, но я испытываю его снова и снова. Это приятный маленький бонус для MT.

Вы также можете использовать МТ в качестве простого контрольного списка для достижения 100% покрытия мутаций, вам совсем не нужно начинать со 100% покрытия. Но с PBT вы можете начать намного ниже 100% покрытия, по сути, с 0% перед тем, как начать.

Надеюсь, это немного проясняет ситуацию.

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