В этом занятии курса “Otus PHP Professional“ (ссылка на полный курс) мы попробуем рассмотреть один из аспектов автоматического тестирования. Обсудим, что такое тестируемый код и как его писать; попрактикуем написание Unit-тестов с использованием PHPUnit; рассмотрим понятия A-TRIP, TDD и Red-Green-Refactor; изучим идеологию CI/CD и вопрос запуска автоматического прогона тестов в Travis.
/**/
Цели занятия
-
рассмотреть один из аспектов автоматического тестирования.
Краткое содержание
-
тестируемый код и как его писать;
-
написание Unit-тестов с использованием PHPUnit;
-
A-TRIP, TDD и Red-Green-Refactor;
-
идеология CI/CD и запуск автоматического прогона наших тестов в Travis.
Результаты
-
писать правильные Unit-тесты.
Преподаватель
-
Олег Мельник
-
Дата: 19.04.2022
Тезисы из лекций
Цели вебинара
Зачем нужно юнит-тестирование?
Признаки хорошего юнит-теста
важно полное покрытие тестами (все варианты данных):
Организация юнит-тестирования
Пример: покрытие тестами конвертера валют:
-
обычная проверка: 100
-
ноль: проверка на 0
-
дробные числа: (с разным числом знаков после “,“)
-
отрицательные: аргумент -1
-
нечисловое: строка
Схема написания юнит-тестов в TDD
некачественные тесты хуже их отсутствия
Контроль какого качества кода обеспечивают юнит-тесты:
-
внешнего: контракт (внешние требования)
-
внутреннего: само качество кода
Как определить что тесты пора переписать или не использовать?
-
если изменился контракт/спецификация (отвалились ~20-30% тестов) — проще их починить, если же более 50% отвалилось — м.б. проще переписать их все с нуля
Изучаем PHPUNIT
Пример: см исходники из примера: класс “Грибник“, который надо покрыть тестами
Пишем тесты для класса из примера
Соглашения
Класс теста
если нужно чтобы тест без префикса testXXX сработал, можно указать это в комментариях:
* Плохие тесты (не сработают)
* Тест с набором тестовых данных
(набором тест-кейсов с параметрами)
либо (лучше) через DataProvider
Используем его, указав в комментах:
* Отлов Exceptions
* Еще тест
Запуск тестов
Расшифровка букв в результатах запуска тестов
Запуск отдельных тестов
Нельзя запускать тесты на боевой БД и/или на продакшене, БД под тесты д.б. тестовая, на стейджинг-сервере или локальная тестовая.
Формирование данных для тестов
(наборы тестовых данных):
до запуска тестового класса можно выполнить метод:
Уничтожение тестовых данных:
аналогично, после отработки всего класса, можно выполнить:
Запуск тестов из PHPStorm
Здесь проект лежи в Докере; нужен настроенный XDebug ;
Настройки Workspace:
Запускаем тест (кликом правой кнопкой по нему, меню “Run test“), в консоли видим:
Рекомендации по написанию тестов
по пред-последнему пункту: т.е. вместо Exception использовать некий свой MyCustomException (т.к. м.б., например, в скрипте отвалилась БД и ошибка вызвана этим, а не тем что мы думаем)
Фейкеры и Моки
Dummy-классы
Fake-классы
Заглушки / stubs
отвечают “законсервировано” на заданные запросы
то же самое через библиотеку Mockery:
Пример Mock
Mock ~ подражатель/притворщик (на ожидаемый запрос вернет заданный ответ)
Чистка mock-s
Spy
Пример: почтовый сервис, считающий, сколько сообщений он отослал
Особенность Mockery: partial test double
Заменяем только один метод на фейковый (getAll): остальные методы будут выполняться у оригинального класса
Антипаттерны
Добыча знаний
рефакторим (без использования суперклассов):
Инстанциирование в конструкторе
Рефакторим:
Статические методы
Рефакторим: передаем проинициализированный объект
Другие Антипаттерны
Мутационное тестирование
см. библиотеку Infection — спец. для написаниях мутационных тестов
Пример:
т.е. 2 последних теста в примере написаны уже мутационно
Метрики мутационные
Вопросы для проверки:
Мой фидбек
-
Было трудно: понять зачем нужна Mockery
-
Удивило: что я не все про тесты знал
-
Я понял: что тесты надо писать (очень желательно)
Дополнительные материалы
-
Подробнее про мутационное тестирование: https://habr.com/ru/company/oleg-bunin/blog/548508/
-
Зачем писать качественные unit-тесты? https://www.youtube.com/watch?v=Rz4S0v7K7Ho
-
Мутационное тестирование https://habr.com/ru/post/334394/
-
Mockery — Mockery Docs 1.0-alpha documentation http://docs.mockery.io/en/latest/
-
infection https://github.com/infection/infection/
-
PHPUnit Manual — PHPUnit 9.5 Manual https://phpunit.readthedocs.io/en/9.5/
-
Презентация этого занятия-вебинара
Домашнее задание
Нет комментариев