Самоучитель: динамические веб-приложения
Глава 16 из 18VII. Инженерная устойчивость110 минут

Глава 16. Тестирование и диагностика по границам риска

Тест выбирается по риску: правило проверяется быстро и изолированно, SQL — на реальном драйвере, а критический пользовательский маршрут — через браузер.

После главы вы сможете
  • построить пирамиду проверок
  • устранить случайность
  • диагностировать по свидетельствам

Ожидание, а не количество тестов

Хорошее имя теста описывает наблюдаемое правило: нельзя завершить уже закрытую задачу; транзакция откатывает историю при ошибке; чужой пользователь получает отказ. Проверка private-методов связывает тест со способом реализации и мешает безопасному рефакторингу.

Arrange создаёт только необходимые данные, Act выполняет одно намерение, Assert проверяет результат и существенные эффекты. Несвязанные утверждения лучше разделить.

Пирамида по стоимости

Уровни проверкиЧем шире окружение, тем меньше сценариев и выше ценность каждого проверяемого маршрута.UnitrulesIntegrationPDO/filesHTTPcontractBrowsercritical path
Чем шире окружение, тем меньше сценариев и выше ценность каждого проверяемого маршрута.

Реальная база там, где важен 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Первичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .

Данные этого сервиса

Настройки cookie и локальных данных

Аналитика

Текущий статус: не выбран. До согласия обе аналитические системы не загружаются.

Локальные данные

Удаление затрагивает только ключи PHP-сервиса в этом браузере и требует подтверждения.

Политики

Политика конфиденциальности · Политика использования файлов cookie