PHP: Автоматическое тестирование
Теория: Data Provider
При тестировании часто встречается паттерн: одна и та же функция вызывается с разными параметрами, и для каждого набора входных данных проверяется результат. Такие тесты выглядят очень похожими и вызывают желание сократить дублирование.
Рассмотрим простой пример. У нас есть функция cube(int $x): int, которая возвращает куб числа. Вместо того чтобы писать несколько однотипных тестов, мы можем воспользоваться механизмом Data Provider, встроенным в PHPUnit.
Что такое Data Provider?
Data Provider — это специальный метод, который возвращает массив наборов данных. Каждый набор передаётся в тестовый метод в виде аргументов.
Пример теста с использованием Data Provider:
В этом примере:
- Метод
testCube()получает два аргумента: ожидаемое значение$expectedи входной параметр$argument. - Метод
cubeProvider()возвращает массив массивов — каждый вложенный массив содержит параметры для одного запуска теста. - PHPUnit сам подставит пары значений в тестовый метод.
Как работают методы провайдеры
Как метод testCube() узнает про метод-провайдер? За счет вызова атрибута #[DataProvider('cubeProvider')]. Атрибуты в PHP — это специальные метки, которые пишутся в квадратных скобках #[...] над функциями, классами, переменными.
Они не выполняются сами по себе, а просто сообщают PHP (или другим инструментам), что с этим кодом делать.
Здесь #[DataProvider('cubeProvider')] — это атрибут. Он говорит PHPUnit: «Эта функция будет запускаться несколько раз — с разными значениями, которые вернёт cubeProvider».
Зачем нужны провайдеры данных?
- Снижение дублирования кода. Один тест — множество проверок.
- Читаемость вывода. При ошибке PHPUnit покажет, с какими данными тест упал.
- Независимость запусков. Каждый набор данных — отдельный запуск, поэтому падение одного не влияет на остальные.
- Удобство отладки. Легче понять, какой именно вход привёл к ошибке.
Именованные наборы данных
PHPUnit позволяет дать имена наборам данных. Посмотрите на пример ниже:
Если запустить этот тест с опцией --testdox, то мы получим вывод имени тестового метода и набора данных, с которым были запущены тесты
Что будет при ошибке?
Если сделать ошибку в логике функции, например, возвращать квадрат вместо куба, то:
- Обычный тест без провайдера просто покажет: ожидалось 8, получено 4. Но не скажет, какой был вход.
- Тест с провайдером покажет: ожидалось 8, получено 4 при аргументе 2. Это сильно упрощает отладку.
Выводы
Data Provider — мощный и удобный инструмент, который делает тесты компактнее, понятнее и информативнее. Его стоит использовать во всех случаях, где одна и та же логика проверяется на разных входных данных.

