На Mutants я наткнулся как на практику внутри Т-Банка. Практика это не повсеместная, а считается весьма advanced и обычно применяется только в условно стабильных кодовых базах, где темп разработки не очень большой. Но давайте по-порядку…
Что такое мутационное тестирование?
Мутационное тестирование — это подход оценки качества тестов и выявления потенциально недостающих тестов в вашей кодовой базе. То есть можно сказать, что это тестирование тестов.
Идея проста: давайте возьмем ваш код и что-то в нем изменим. Например, заменим логическое И на ИЛИ. И посмотрим, пройдут ли ваши тесты. Если они пройдут — это плохо. Это значит, что ваши тесты не покрывают этот конкретный логический оператор. Если же тесты упали — это наоборот, хороший знак о качестве покрытия.
Всё мутационное тестирование и заключается в том, чтобы менять рандомные токены в вашем коде и смотреть на реакцию тестов. Эти изменения часто называют мутантами. Менять можно много чего:
- логические операторы (вместо
||сделать&&); - константы (вместо
1сделать2); - переменные (вместо
totalподставить где-то переменнуюcurrent); - можно удалить всё тело функции (всегда возвращать 42);
- …
Мутационное тестирование обретает смысл, когда у вас уже есть большой набор тестов и вы задаётесь вопросом, “а что ещё у нас не покрыто”? Потому что в реальности, даже при 100% покрытии, ваших тестов может быть недостаточно.
Советую глянуть википедию, я из неё понимание обрёл: https://en.wikipedia.org/wiki/Mutation_testing
Понятное дело, что инструменты мутационного тестирования должны достаточно хорошо понимать язык вашего проекта, чтобы генерировать мутанты. И набор этих самых допустимых мутантов у каждого языка будет свой. Поэтому, такие инструменты у каждого языка будут свои.
Mutants
Mutants — это инструменты мутационного тестирования для Rust. Он умеет генерировать мутанты, после которых код всё ещё компилируется, но логика может быть нарушена. При это он предоставляет достаточно простой DX: вы просто запускаете на своей кодовой базе cargo run mutants и видите, какие мутанты не положили тесты.
- Mutants docs: https://mutants.rs/welcome.html
- Mutants repo: https://github.com/sourcefrog/cargo-mutants

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