В этом занятии курса 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

* Еще тест

Запуск тестов

Расшифровка букв в результатах запуска тестов

Запуск отдельных тестов

(warning) Нельзя запускать тесты на боевой БД и/или на продакшене, БД под тесты д.б. тестовая, на стейджинг-сервере или локальная тестовая.

Формирование данных для тестов

(наборы тестовых данных):

(звезда) до запуска тестового класса можно выполнить метод:

Уничтожение тестовых данных:

(звезда) аналогично, после отработки всего класса, можно выполнить:

Запуск тестов из PHPStorm

(звезда) Здесь проект лежи в Докере; нужен настроенный XDebug ;

Настройки Workspace:

Запускаем тест (кликом правой кнопкой по нему, меню “Run test“), в консоли видим:

Рекомендации по написанию тестов

(звезда) по пред-последнему пункту: т.е. вместо Exception использовать некий свой MyCustomException (т.к. м.б., например, в скрипте отвалилась БД и ошибка вызвана этим, а не тем что мы думаем)


Фейкеры и Моки

Dummy-классы

Fake-классы

Заглушки / stubs

отвечают “законсервировано” на заданные запросы

(звезда) то же самое через библиотеку Mockery:

Пример Mock

Mock ~ подражатель/притворщик (на ожидаемый запрос вернет заданный ответ)

Чистка mock-s

Spy

Пример: почтовый сервис, считающий, сколько сообщений он отослал

Особенность Mockery: partial test double

Заменяем только один метод на фейковый (getAll): остальные методы будут выполняться у оригинального класса


Антипаттерны

Добыча знаний

рефакторим (без использования суперклассов):

Инстанциирование в конструкторе

Рефакторим:

Статические методы

Рефакторим: передаем проинициализированный объект

Другие Антипаттерны


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

(звезда) см. библиотеку Infection — спец. для написаниях мутационных тестов

Пример:

(warning) т.е. 2 последних теста в примере написаны уже мутационно

Метрики мутационные

Вопросы для проверки:


Мой фидбек

  • Было трудно: понять зачем нужна Mockery

  • Удивило: что я не все про тесты знал

  • Я понял: что тесты надо писать (очень желательно)


Дополнительные материалы


Домашнее задание

Tags

Нет комментариев

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.