Мутационное тестирование
15 июля 2019
Насколько протестирован ваш код? 100% code coverage не гарантирует что правильно проверены все кейсы. Эта метрика показывает лишь то, что при выполнении тестов выполнился весь код.
К счастью, есть придуманный ещё в семидесятых способ выяснить, насколько хороши тесты. Называется он «мутационное тестирование».
Идея такова:
- Берём код и тесты к нему.
- Оставляем тесты как есть, но немного меняем код. Например, заменяем в одном условии
&&
на||
. Это изменение называется мутацией, а получившийся код мутантом. - Если тесты с изменённым кодом упали, значит условие оттестировано верно. Мутанта «убили». Если прошли, тесты, хоть и покрытие у них 100%, «мутант убежал».
- В идеале тест должен убивать всех мутантов.
Качество теста или MSI, Mutation Score Indicator определяется как:
MSI = (мутантов убито / мутантов всего) * 100
Менять руками исходный код не продуктивно, поэтому существуют мутационные фреймворки. Для PHP это Infection.
Пользоваться довольно просто:
- Ставим через
composer require --dev infection/infection
./vendor/bin/infection --threads=$(nproc)
- Отвечаем на вопросы для генерации начального конфига.
- Ждём.
Как результат получим статистику плюс лог с подобными записями:
29) D:\dev\yii-dev-single\cache\src\ArrayCache.php:41 [M] TrueValue --- Original +++ New @@ @@ protected function deleteValue(string $key) : bool { unset($this->cache[$key]); - return true; + return false; } public function clear() : bool {
Из той, что выше, можно сделать вывод что для ArrayCache::deleteValue()
нет или теста или assert-а, проверяющего
возвращаемое значение.
Хотите улучшить тесты - попробуйте мутационное тестирование.
Комментарии RSS по email OK