Хороший разработчик пишет тесты. Важно сразу договориться — тестами нельзя проверить, что наше приложение работает правильно. Тесты могут просто показать, что наш код работает так как мы ожидаем в определенных условиях.
Мы можем тестировать компоненты отдельно с помощью
unit тестов, мы можем тестировать как все работает вместе, с помощью интеграционных тестов. Но сколько тестов нужно? Чем сложнее приложение, тем больше сценариев, как оно может работать — тем больше тестов можно написать. Все сценарии покрыть невозможно. Но можно усилить свой quality assurance процесс дополнительно. Один из таких вариантов — применять mutation testing 🧟♂️.Суть этого подхода проста. Специальная библиотека делает в вашем коде изменение (мутант) и запускаются тесты. Если ваши тесты упали, значит они убили мутанта ☠️. Если ваши тесты не упали, значит он выжил и нанес ущерб. Это что-то значит. Хотя бы следующее — либо изменение было сделано в мертвом коде, либо этот кусок кода не тестируется, либо ваши тесты плохо работают. Из этого уже можно сделать какие-то выводы и принять решения.
Какие изменения вносятся в код? Например, у вас в коде есть
if(myValue == 50), мутант может выглядеть так if(myValue != 50). Мутант ведет себя как обычный баг.Качество ваших тестов можно будет измерить ориентируясь на mutation score.
mutation score = number of mutants killed / total number of mutants. Если mutation score низкий — нужно менять ваши тесты.Что можно использовать:
* Stryker — для JavaScript, C#, Scala
* Pitest — для JVM языков
* Mull — для C или C++
* mutmut — для Python
⬛️ Еще раз — тесты это классно. Их нужно писать. Если хотите контролировать, что ваши тесты действительно что-то проверяют, добавьте mutation testing.
#хардскиллы