HTML Diff
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>