На Mutants я наткнулся как на практику внутри Т-Банка. Практика это не повсеместная, а считается весьма advanced и обычно применяется только в условно стабильных кодовых базах, где темп разработки не очень большой. Но давайте по-порядку…

Что такое мутационное тестирование?

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

Идея проста: давайте возьмем ваш код и что-то в нем изменим. Например, заменим логическое И на ИЛИ. И посмотрим, пройдут ли ваши тесты. Если они пройдут — это плохо. Это значит, что ваши тесты не покрывают этот конкретный логический оператор. Если же тесты упали — это наоборот, хороший знак о качестве покрытия.

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

  • логические операторы (вместо || сделать &&);
  • константы (вместо 1 сделать 2);
  • переменные (вместо total подставить где-то переменную current);
  • можно удалить всё тело функции (всегда возвращать 42);

Мутационное тестирование обретает смысл, когда у вас уже есть большой набор тестов и вы задаётесь вопросом, “а что ещё у нас не покрыто”? Потому что в реальности, даже при 100% покрытии, ваших тестов может быть недостаточно.

Советую глянуть википедию, я из неё понимание обрёл: https://en.wikipedia.org/wiki/Mutation_testing

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

Mutants

Mutants — это инструменты мутационного тестирования для Rust. Он умеет генерировать мутанты, после которых код всё ещё компилируется, но логика может быть нарушена. При это он предоставляет достаточно простой DX: вы просто запускаете на своей кодовой базе cargo run mutants и видите, какие мутанты не положили тесты.

  • Michael CherniginOPMA
    link
    fedilink
    arrow-up
    1
    ·
    18 days ago

    Fun fact: самый популярный инструмент для мутационного тестирования на Go, который я нашёл, — форк go-mutesting от Avito Tech. В общем, имейте в виду, что это не только про Rust история, и подобные инструменты можно найти для любого популярного языка