PHP: Автоматическое тестирование
2026-02-26 17:29 Diff

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

Рассмотрим простой пример. У нас есть функция 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».

Зачем нужны провайдеры данных?

  1. Снижение дублирования кода. Один тест — множество проверок.
  2. Читаемость вывода. При ошибке PHPUnit покажет, с какими данными тест упал.
  3. Независимость запусков. Каждый набор данных — отдельный запуск, поэтому падение одного не влияет на остальные.
  4. Удобство отладки. Легче понять, какой именно вход привёл к ошибке.

Именованные наборы данных

PHPUnit позволяет дать имена наборам данных. Посмотрите на пример ниже:

Если запустить этот тест с опцией --testdox, то мы получим вывод имени тестового метода и набора данных, с которым были запущены тесты

Что будет при ошибке?

Если сделать ошибку в логике функции, например, возвращать квадрат вместо куба, то:

  • Обычный тест без провайдера просто покажет: ожидалось 8, получено 4. Но не скажет, какой был вход.
  • Тест с провайдером покажет: ожидалось 8, получено 4 при аргументе 2. Это сильно упрощает отладку.

Выводы

Data Provider — мощный и удобный инструмент, который делает тесты компактнее, понятнее и информативнее. Его стоит использовать во всех случаях, где одна и та же логика проверяется на разных входных данных.