You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/data-providers.md
+165-1Lines changed: 165 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -98,4 +98,168 @@ public function userDataProvider(): array
98
98
'empty string' => ['', false],
99
99
];
100
100
}
101
-
```
101
+
```
102
+
103
+
## DataZip
104
+
105
+
Pairs up multiple providers element by element. The first item from the first provider joins with the first item from the second, second with second, and so on.
106
+
107
+
Typical use case — testing related data where each pair forms a meaningful test case:
108
+
109
+
```php
110
+
#[DataZip(
111
+
new DataProvider('credentials'),
112
+
new DataProvider('expectedPermissions'),
113
+
)]
114
+
public function testUserPermissions(string $login, string $password, array $permissions): void
Arguments from all providers merge into a single test call. In the example above, `credentials` provides two arguments (`$login`, `$password`), while `expectedPermissions` provides one (`$permissions`).
129
+
130
+
### Providers of Different Lengths
131
+
132
+
If providers have different lengths, the number of datasets is determined by the shortest provider:
133
+
134
+
```php
135
+
#[DataZip(
136
+
new DataProvider('inputs'), // 3 items
137
+
new DataProvider('outputs'), // 2 items
138
+
)]
139
+
public function testTransform(string $input, string $output): void { ... }
140
+
141
+
// inputs: [['a'], ['b'], ['c']]
142
+
// outputs: [['x'], ['y']]
143
+
//
144
+
// Runs 2 times (limited by outputs):
145
+
// 1. 'a', 'x'
146
+
// 2. 'b', 'y'
147
+
// Third item from inputs ('c') is ignored
148
+
```
149
+
150
+
::: tip Keys in Reports
151
+
Dataset labels are joined with `|`. If datasets are named `admin` and `full-access`, the report shows `admin|full-access`.
152
+
:::
153
+
154
+
## DataCross
155
+
156
+
Creates all possible combinations of values from providers (cartesian product). Useful for testing independent parameters that can combine in any way.
157
+
158
+
```php
159
+
#[DataCross(
160
+
new DataProvider('browsers'),
161
+
new DataProvider('screenSizes'),
162
+
)]
163
+
public function testResponsiveLayout(string $browser, int $width, int $height): void
Copy file name to clipboardExpand all lines: ru/docs/data-providers.md
+165Lines changed: 165 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -99,3 +99,168 @@ public function userDataProvider(): array
99
99
];
100
100
}
101
101
```
102
+
103
+
## DataZip
104
+
105
+
Объединяет несколько провайдеров попарно. Первый элемент из первого провайдера соединяется с первым элементом из второго, второй со вторым, и так далее.
106
+
107
+
Типичный сценарий — тестирование связанных данных, где каждая пара образует осмысленный тест-кейс:
108
+
109
+
```php
110
+
#[DataZip(
111
+
new DataProvider('credentials'),
112
+
new DataProvider('expectedPermissions'),
113
+
)]
114
+
public function testUserPermissions(string $login, string $password, array $permissions): void
Аргументы из всех провайдеров объединяются в один вызов теста. В примере выше `credentials` даёт два аргумента (`$login`, `$password`), а `expectedPermissions` — один (`$permissions`).
129
+
130
+
### Провайдеры разной длины
131
+
132
+
Если провайдеры имеют разную длину, количество датасетов определяется самым коротким провайдером:
133
+
134
+
```php
135
+
#[DataZip(
136
+
new DataProvider('inputs'), // 3 элемента
137
+
new DataProvider('outputs'), // 2 элемента
138
+
)]
139
+
public function testTransform(string $input, string $output): void { ... }
140
+
141
+
// inputs: [['a'], ['b'], ['c']]
142
+
// outputs: [['x'], ['y']]
143
+
//
144
+
// Запустится 2 раза (по длине outputs):
145
+
// 1. 'a', 'x'
146
+
// 2. 'b', 'y'
147
+
// Третий элемент inputs ('c') игнорируется
148
+
```
149
+
150
+
::: tip Ключи в отчётах
151
+
Метки датасетов соединяются через `|`. Если датасеты называются `admin` и `full-access`, в отчёте будет `admin|full-access`.
152
+
:::
153
+
154
+
## DataCross
155
+
156
+
Создаёт все возможные комбинации значений из провайдеров (декартово произведение). Полезно для тестирования независимых параметров, которые могут сочетаться произвольным образом.
157
+
158
+
```php
159
+
#[DataCross(
160
+
new DataProvider('browsers'),
161
+
new DataProvider('screenSizes'),
162
+
)]
163
+
public function testResponsiveLayout(string $browser, int $width, int $height): void
Число тестов растёт мультипликативно. Три провайдера по 5 элементов — это уже 125 тестов. Используйте `DataCross` осознанно.
181
+
:::
182
+
183
+
::: tip Ключи в отчётах
184
+
Метки соединяются через `×`. Датасеты `chrome` и `mobile` дадут ключ `chrome×mobile`.
185
+
:::
186
+
187
+
## DataUnion
188
+
189
+
Для объединения данных из нескольких источников обычно достаточно перечислить атрибуты над методом:
190
+
191
+
```php
192
+
#[DataProvider('adminUsers')]
193
+
#[DataProvider('regularUsers')]
194
+
#[DataSet(['guest'], 'guest')]
195
+
public function testUserCanLogin(string $username): void
196
+
{
197
+
// Запустится для всех: adminUsers, затем regularUsers, затем guest
198
+
}
199
+
```
200
+
201
+
`DataUnion` нужен, когда объединение должно произойти внутри другого атрибута — например, внутри `DataCross` или `DataZip`:
202
+
203
+
```php
204
+
#[DataCross(
205
+
new DataUnion(
206
+
new DataProvider('legacyFormats'),
207
+
new DataProvider('modernFormats'),
208
+
),
209
+
new DataProvider('compressionLevels'),
210
+
)]
211
+
public function testExport(string $format, int $compression): void
212
+
{
213
+
// Все форматы (legacy + modern) скрещиваются с каждым уровнем сжатия
214
+
}
215
+
```
216
+
217
+
Без `DataUnion` пришлось бы либо создавать отдельный провайдер, объединяющий форматы, либо дублировать `DataCross` для каждого источника форматов.
218
+
219
+
## Комбинирование провайдеров
220
+
221
+
Внутри `DataZip`, `DataCross` и `DataUnion` можно использовать любые провайдеры данных — `DataProvider`, `DataSet`, а также вкладывать их друг в друга.
222
+
223
+
### Смешивание типов
224
+
225
+
Удобно, когда часть параметров фиксирована, а часть приходит из провайдера:
226
+
227
+
```php
228
+
#[DataCross(
229
+
new DataSet(['mysql'], 'mysql'),
230
+
new DataSet(['pgsql'], 'pgsql'),
231
+
new DataProvider('migrationScenarios'),
232
+
)]
233
+
public function testMigration(string $driver, array $scenario): void { ... }
234
+
```
235
+
236
+
Или компактнее через `DataProvider` для драйверов:
237
+
238
+
```php
239
+
#[DataCross(
240
+
new DataProvider('databaseDrivers'),
241
+
new DataProvider('migrationScenarios'),
242
+
)]
243
+
public function testMigration(string $driver, array $scenario): void { ... }
244
+
```
245
+
246
+
### Вложенные комбинации
247
+
248
+
Для сложных сценариев провайдеры можно вкладывать:
249
+
250
+
```php
251
+
#[DataZip(
252
+
new DataCross(
253
+
new DataProvider('users'),
254
+
new DataProvider('roles'),
255
+
),
256
+
new DataProvider('expectedResults'),
257
+
)]
258
+
public function testAccessControl(string $user, string $role, bool $expected): void
0 commit comments