Ответ
DataProvider в PHPUnit я использую для параметризованного тестирования — когда нужно проверить один метод с множеством различных входных данных и ожидаемых результатов. Это значительно сокращает дублирование кода тестов.
Практический пример из проекта:
/**
* Тестируем валидацию email-адресов
* @dataProvider emailValidationProvider
*/
public function testEmailValidation(string $email, bool $expected): void
{
$validator = new EmailValidator();
$this->assertSame($expected, $validator->isValid($email));
}
public function emailValidationProvider(): array
{
return [
'valid_standard' => ['test@example.com', true],
'valid_with_subdomain' => ['user@sub.domain.co.uk', true],
'valid_with_plus' => ['user+tag@example.com', true],
'invalid_no_at' => ['example.com', false],
'invalid_double_dot' => ['user@example..com', false],
'invalid_special_chars' => ['user@exa<mple.com', false],
'empty_string' => ['', false],
'null_input' => [null, false],
];
}
Ключевые преимущества:
- Покрытие edge cases — легко добавить boundary values
- Читаемость — каждый тестовый случай имеет осмысленное имя (ключ массива)
- Меньше кода — один тестовый метод вместо десятков похожих
- Изоляция — каждый набор данных выполняется как отдельный тест
Важные нюансы:
- DataProvider должен возвращать массив массивов
- Можно использовать
yieldдля генерации данных на лету - При падении теста PHPUnit показывает, какой именно набор данных вызвал ошибку
- DataProvider выполняется до
setUp(), поэтому нельзя использовать фикстуры из setUp в провайдере