sebastianbergmann/phpunit · error · InvalidDataProviderException
Empty data set provided by data provider
Error message
Empty data set provided by data provider
What it means
After collecting data from every provider attached to the test method, PHPUnit ended up with zero data sets. An empty result is treated as an authoring error: the test declares a provider that delivers nothing to run. Providers whose attribute sets skipWhenEmpty: true are exempt — the test is then skipped instead of erroring.
Source
Thrown at src/Metadata/Api/DataProvider.php:360
),
);
}
$result[$key] = new ProvidedData($providerLabel, $value);
}
}
Event\Facade::emitter()->dataProviderMethodFinished(
$testMethodValueObject,
...$methodsCalled,
);
if ($result === []) {
if ($skipWhenEmpty) {
return [];
}
throw new InvalidDataProviderException(
'Empty data set provided by data provider',
);
}
return $result;
}
/**
* @return array<ProvidedData>
*/
private function dataProvidedByMetadata(ReflectionMethod $testMethod, MetadataCollection $testWith): array
{
$result = [];
$testMethodNumberOfParameters = $testMethod->getNumberOfParameters();
$testMethodIsNonVariadic = !$testMethod->isVariadic();
$autoIncrementKey = 0;
foreach ($testWith as $i => $_testWith) {View on GitHub (pinned to f123cdb2a2)
Solutions
- Fix the provider so it produces the expected data (check the glob path, query, fixtures).
- If 'no data' is a legitimate state, mark the attribute #[DataProvider('provider', skipWhenEmpty: true)] so the test skips instead of erroring.
- Add a meta-test asserting the provider yields at least one row in your environment.
Example fix
// before
#[DataProvider('provider')]
// after (when an empty data set is acceptable)
#[DataProvider('provider', skipWhenEmpty: true)] Defensive patterns
Strategy: validation
Validate before calling
// Meta-test: provider must yield at least one row in this environment self::assertNotSame([], MyTest::provider(), 'Provider unexpectedly empty; check fixtures/glob paths');
Prevention
- Mark legitimately-optional providers with #[DataProvider('provider', skipWhenEmpty: true)].
- Make glob/query paths explicit and fail loudly when they resolve to nothing.
- Assert provider non-emptiness in a meta-test so silent environment differences surface early.
When it happens
Trigger: A #[DataProvider] or #[DataProviderClosure] provider returns [] or an empty generator — fixture glob matches nothing, a query returns no rows, a filtered dataset is empty — and the attribute does not set skipWhenEmpty: true.
Common situations: Environment-dependent providers (no fixtures in CI, empty test database); a wrong glob path silently matching nothing; a dataset builder bug that always returns [].
Related errors
- Data set %s provided by %s is invalid, expected array but go
- The key "%s" has already been defined by provider %s
- Data Provider callable does not return an iterable
- Subscriber "%s" does not implement any known interface - did
- Unknown event type "%s"
AI-assisted analysis of sebastianbergmann/phpunit@f123cdb2a2 (2026-08-23).
Data as JSON: /api/errors/2d4d84cee9eba3b0.
Report an issue: GitHub.