Ожидание, а не количество тестов
Хорошее имя теста описывает наблюдаемое правило: нельзя завершить уже закрытую задачу; транзакция откатывает историю при ошибке; чужой пользователь получает отказ. Проверка private-методов связывает тест со способом реализации и мешает безопасному рефакторингу.
Arrange создаёт только необходимые данные, Act выполняет одно намерение, Assert проверяет результат и существенные эффекты. Несвязанные утверждения лучше разделить.
Пирамида по стоимости
Реальная база там, где важен SQL
Mock PDO не подтверждает синтаксис, типы и транзакции. Для repository используйте изолированную тестовую схему MySQL той же линии либо контейнер в CI. Миграции применяются с нуля, а тест очищает данные транзакцией или отдельной базой.
Contract test запускается для in-memory и PDO-реализации одного repository interface и проверяет общие ожидания.
Управление временем и случайностью
Clock и RandomSource передаются как зависимости. Production использует реальные реализации, тест — фиксированное время и последовательность байтов. sleep в тесте делает результат медленным и нестабильным.
Генерируемые id не должны предполагаться в тесте равными конкретному числу, если это не часть контракта. Проверяйте форму и связь результата.
Статический анализ и стиль
Линтер, форматирование и статический анализ ловят другой класс ошибок, чем runtime-тест. Запускайте их в CI на том же наборе файлов, что и локально. Baseline допустим как временная карта долга, но новые ошибки не должны бесшумно добавляться.
Обновление PHP начинается с анализа deprecations и migration guide, затем проходит весь набор проверок на новой ветке.
Диагностика production
Каждый запрос получает correlation id, который проходит через журнал и ответ об ошибке без раскрытия деталей. Запись содержит маршрут, длительность, класс результата и безопасные идентификаторы. Метрики агрегируют частоту, latency и ошибки, а trace связывает дорогие шаги.
Не журналируйте всё тело запроса. Маскирование после записи опоздало; allowlist допустимых полей надёжнее blacklist секретов.
Практика главы
Для CompleteTask напишите unit-тест переходов, integration-тест repository и HTTP-тест конфликта version. Добавьте browser smoke для входа и завершения.
Закрепите материал
Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.
Перелинковка со справочником
Проверка актуальности
- php.nethttps://www.php.net/manual/en/migration85.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .