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

  1. Fix the provider so it produces the expected data (check the glob path, query, fixtures).
  2. If 'no data' is a legitimate state, mark the attribute #[DataProvider('provider', skipWhenEmpty: true)] so the test skips instead of erroring.
  3. 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

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


AI-assisted analysis of sebastianbergmann/phpunit@f123cdb2a2 (2026-08-23). Data as JSON: /api/errors/2d4d84cee9eba3b0. Report an issue: GitHub.