<rmcreative>

RSS

Мутационное тестирование

15 июля 2019

Насколько протестирован ваш код? 100% code coverage не гарантирует что правильно проверены все кейсы. Эта метрика показывает лишь то, что при выполнении тестов выполнился весь код.

К счастью, есть придуманный ещё в семидесятых способ выяснить, насколько хороши тесты. Называется он «мутационное тестирование».

Идея такова:

  1. Берём код и тесты к нему.
  2. Оставляем тесты как есть, но немного меняем код. Например, заменяем в одном условии && на ||. Это изменение называется мутацией, а получившийся код мутантом.
  3. Если тесты с изменённым кодом упали, значит условие оттестировано верно. Мутанта «убили». Если прошли, тесты, хоть и покрытие у них 100%, «мутант убежал».
  4. В идеале тест должен убивать всех мутантов.

Качество теста или MSI, Mutation Score Indicator определяется как:

MSI = (мутантов убито / мутантов всего) * 100

Менять руками исходный код не продуктивно, поэтому существуют мутационные фреймворки. Для PHP это Infection.

Пользоваться довольно просто:

  1. Ставим через composer require --dev infection/infection
  2. ./vendor/bin/infection --threads=$(nproc)
  3. Отвечаем на вопросы для генерации начального конфига.
  4. Ждём.

Как результат получим статистику плюс лог с подобными записями:

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

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.