PHP: Автоматическое тестирование
Теория: Утверждения
Каждую проверку, которую мы написали для функции capitalize(), в тестировании принято называть утверждением (assert).
Утверждения — это ключевая часть тестов. Именно они проверяют функциональность кода:
Можно заметить, что все проверки строятся одинаковым способом: условие => исключение. PHP внутри себя содержит конструкцию assert(), которая упрощает написание проверок:
Конструкция assert(true) означает положительный результат, а assert(false) говорит об ошибке. Последний вариант выбрасывает исключение с таким сообщением:
Это сообщение можно перевести так: «Ожидалось, что значением выражения будет истина, но оказалось, что это ложь». Кроме сообщения, выводится бэктрейс, по которому можно найти сработавшее утверждение:
В целом, assert() сделал наш код короче и проще для восприятия. Положительная проверка смотрится естественнее, потому что это то, что мы ожидаем.
С другой стороны, вывод сообщения об ошибке крайне неинформативный. Для примера попробуем понять, что не так в коде ниже:
Единственный способ понять, что произошло — открывать код с упавшим утверждением и отлаживать его, выводя значения переменных. Это пытаются исправить с помощью webmozart/assert и других специализированных библиотек. Перепишем код выше с ее использованием:
Синтаксис Assert::eq() означает, что перед нами класс Assert, у которого вызывается статический метод (функция) eq(). К сожалению, в PHP невозможно обойти использование классов даже в начале обучения. Сейчас просто запомните этот синтаксис, а подробнее о нем мы поговорим в курсах по ООП.
Вывод таких утверждений значительно понятнее:
В этом выводе есть не только информация об ошибке, но и данные, которые передавались в утверждение. Такой формат упрощает анализ проблемы и ускоряет отладку.
Для тестирования негативных сценариев предназначена функция Assert::notEq(). Она тестирует то, что значения не равны:
Библиотека webmozart/assert содержит несколько десятков функций-утверждений для разных ситуаций и типов данных. Умение их правильно использовать приходит с опытом и после нескольких попыток чтения документации.

