Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Мутационное тестирование в PHP (Владимир Янц, B...

Мутационное тестирование в PHP (Владимир Янц, Badoo)

То, что тесты должны быть как можно проще, и при этом быстры и стабильны — понятно всем. Но как измерить эти качества и ответить на вопрос «А хорошо ли мой тест проверяет код»?

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

В своем докладе я расскажу, как можно организовать мутационное тестирование для PHP-кода, с какими проблемами вы можете столкнуться, а также покажу, как мы внедряем это в Badoo.

Badoo Tech

March 16, 2019
Tweet

More Decks by Badoo Tech

Other Decks in Programming

Transcript

  1. Code Coverage 1. количественная, а не качественная метрика 2. есть

    продвинутые branch & path coverage, но нет инструмента для PHP 3. можно иметь 100% coverage, но это ничего не гарантирует
  2. function isAdult(int $age) : bool { return $age > 18;

    } class MyTest extends \PHPUnit\Framework\TestCase { public function isAdultProvider() : array { return [ ['age' => 17, 'expected' => false], ['age' => 19, 'expected' => true], ]; } /** * @dataProvider isAdultProvider */ public function testIsAdult(int $age, bool $expected) : void { assertEquals($expected, isAdult($age)); } } Граничное условие не тестируется
  3. function buildPromoBlock() : PromoBlock { return PromoBlock::create() ->setMssg('some_cool_text') ->setSomeThing(true) ->setAction('some_cool_action');

    } class MyTest extends \PHPUnit\Framework\TestCase { public function testBuildPromoBlock() : void { $PromoBlock = buildPromoBlock(); assertEquals('some_cool_action', $PromoBlock->getAction()); assertEquals('some_cool_text', $PromoBlock->getMssg()); } } Нет ассерта на поле
  4. Code Coverage 1. сбор coverage занимает вечность (100 000 тестов)

    2. можно «скормить» готовый, но это куча XML, > 30Гб
  5. SoftMocks 1. наша open source библиотека для моков 2. Infection

    с ней несовместим, сделать совместимым можно только сильно сломав его архитектуру
  6. 1. Мутационные операторы утащили из Infection 2. Работает с SoftMocks

    3. Дружит с нашим сервисом coverage 4. Простая, нет больше половины фичей Infection
  7. 1 Coverage - хорошо, но еще ничего не гарантирует 2

    Мутационное тестирование поможет сделать Unit- тесты лучше 3 Есть отличный инструмент - Infection! 4 Начните хотя бы прогонять мутации вручную Выводы
  8. © 2019 [email protected] telegram: YantsV СПАСИБО! Ссылки 1. Infection PHP

    Mutation Testing Framework https:// infection.github.io 2. Humbug Mutation Testing for PHP https://github.com/ humbug/humbug 3. [Habr] Мутационное тестирование https://habr.com/ru/ post/334394/ (статья от автора Infection) 4. [Habr] SoftMocks: наша замена runkit для PHP 7 https://habr.com/ru/company/badoo/blog/279617/ http://bit.ly/BadooPHPMeetup2