0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>При тестировании часто встречается паттерн: одна и та же функция вызывается с разными параметрами, и для каждого набора входных данных проверяется результат. Такие тесты выглядят очень похожими и вызывают желание сократить дублирование.</p>
1
<p>При тестировании часто встречается паттерн: одна и та же функция вызывается с разными параметрами, и для каждого набора входных данных проверяется результат. Такие тесты выглядят очень похожими и вызывают желание сократить дублирование.</p>
2
<p>Рассмотрим простой пример. У нас есть функция cube(int $x): int, которая возвращает куб числа. Вместо того чтобы писать несколько однотипных тестов, мы можем воспользоваться механизмом<strong>Data Provider</strong>, встроенным в PHPUnit.</p>
2
<p>Рассмотрим простой пример. У нас есть функция cube(int $x): int, которая возвращает куб числа. Вместо того чтобы писать несколько однотипных тестов, мы можем воспользоваться механизмом<strong>Data Provider</strong>, встроенным в PHPUnit.</p>
3
<h4>Что такое Data Provider?</h4>
3
<h4>Что такое Data Provider?</h4>
4
<p><strong>Data Provider</strong>- это специальный метод, который возвращает массив наборов данных. Каждый набор передаётся в тестовый метод в виде аргументов.</p>
4
<p><strong>Data Provider</strong>- это специальный метод, который возвращает массив наборов данных. Каждый набор передаётся в тестовый метод в виде аргументов.</p>
5
<p>Пример теста с использованием Data Provider:</p>
5
<p>Пример теста с использованием Data Provider:</p>
6
<p>В этом примере:</p>
6
<p>В этом примере:</p>
7
<ul><li>Метод testCube() получает два аргумента: ожидаемое значение $expected и входной параметр $argument.</li>
7
<ul><li>Метод testCube() получает два аргумента: ожидаемое значение $expected и входной параметр $argument.</li>
8
<li>Метод cubeProvider() возвращает массив массивов - каждый вложенный массив содержит параметры для одного запуска теста.</li>
8
<li>Метод cubeProvider() возвращает массив массивов - каждый вложенный массив содержит параметры для одного запуска теста.</li>
9
<li>PHPUnit сам подставит пары значений в тестовый метод.</li>
9
<li>PHPUnit сам подставит пары значений в тестовый метод.</li>
10
</ul><h2>Как работают методы провайдеры</h2>
10
</ul><h2>Как работают методы провайдеры</h2>
11
<p>Как метод testCube() узнает про метод-провайдер? За счет вызова атрибута #[DataProvider('cubeProvider')]. Атрибуты в PHP - это специальные метки, которые пишутся в квадратных скобках #[...] над функциями, классами, переменными. Они не выполняются сами по себе, а просто сообщают PHP (или другим инструментам), что с этим кодом делать.</p>
11
<p>Как метод testCube() узнает про метод-провайдер? За счет вызова атрибута #[DataProvider('cubeProvider')]. Атрибуты в PHP - это специальные метки, которые пишутся в квадратных скобках #[...] над функциями, классами, переменными. Они не выполняются сами по себе, а просто сообщают PHP (или другим инструментам), что с этим кодом делать.</p>
12
<p>Здесь #[DataProvider('cubeProvider')] - это атрибут. Он говорит PHPUnit: "Эта функция будет запускаться несколько раз - с разными значениями, которые вернёт cubeProvider".</p>
12
<p>Здесь #[DataProvider('cubeProvider')] - это атрибут. Он говорит PHPUnit: "Эта функция будет запускаться несколько раз - с разными значениями, которые вернёт cubeProvider".</p>
13
<h3>Зачем нужны провайдеры данных?</h3>
13
<h3>Зачем нужны провайдеры данных?</h3>
14
<ol><li><strong>Снижение дублирования кода</strong>. Один тест - множество проверок.</li>
14
<ol><li><strong>Снижение дублирования кода</strong>. Один тест - множество проверок.</li>
15
<li><strong>Читаемость вывода</strong>. При ошибке PHPUnit покажет, с какими данными тест упал.</li>
15
<li><strong>Читаемость вывода</strong>. При ошибке PHPUnit покажет, с какими данными тест упал.</li>
16
<li><strong>Независимость запусков</strong>. Каждый набор данных - отдельный запуск, поэтому падение одного не влияет на остальные.</li>
16
<li><strong>Независимость запусков</strong>. Каждый набор данных - отдельный запуск, поэтому падение одного не влияет на остальные.</li>
17
<li><strong>Удобство отладки</strong>. Легче понять, какой именно вход привёл к ошибке.</li>
17
<li><strong>Удобство отладки</strong>. Легче понять, какой именно вход привёл к ошибке.</li>
18
</ol><h3>Именованные наборы данных</h3>
18
</ol><h3>Именованные наборы данных</h3>
19
<p>PHPUnit позволяет дать имена наборам данных. Посмотрите на пример ниже:</p>
19
<p>PHPUnit позволяет дать имена наборам данных. Посмотрите на пример ниже:</p>
20
<p>Если запустить этот тест с опцией --testdox, то мы получим вывод имени тестового метода и набора данных, с которым были запущены тесты</p>
20
<p>Если запустить этот тест с опцией --testdox, то мы получим вывод имени тестового метода и набора данных, с которым были запущены тесты</p>
21
<h3>Что будет при ошибке?</h3>
21
<h3>Что будет при ошибке?</h3>
22
<p>Если сделать ошибку в логике функции, например, возвращать квадрат вместо куба, то:</p>
22
<p>Если сделать ошибку в логике функции, например, возвращать квадрат вместо куба, то:</p>
23
<ul><li>Обычный тест без провайдера просто покажет: ожидалось 8, получено 4. Но не скажет, какой был вход.</li>
23
<ul><li>Обычный тест без провайдера просто покажет: ожидалось 8, получено 4. Но не скажет, какой был вход.</li>
24
<li>Тест с провайдером покажет: ожидалось 8, получено 4 при аргументе 2. Это сильно упрощает отладку.</li>
24
<li>Тест с провайдером покажет: ожидалось 8, получено 4 при аргументе 2. Это сильно упрощает отладку.</li>
25
</ul><h2>Выводы</h2>
25
</ul><h2>Выводы</h2>
26
<p>Data Provider - мощный и удобный инструмент, который делает тесты компактнее, понятнее и информативнее. Его стоит использовать во всех случаях, где одна и та же логика проверяется на разных входных данных.</p>
26
<p>Data Provider - мощный и удобный инструмент, который делает тесты компактнее, понятнее и информативнее. Его стоит использовать во всех случаях, где одна и та же логика проверяется на разных входных данных.</p>