From b9b1392a2964b7b47efacb1dc1080866754b1b59 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sun, 13 Jul 2025 10:37:44 +0200 Subject: [PATCH 1/6] Warn on mix of different data providers --- src/Metadata/Api/DataProvider.php | 19 ++++++++++++ .../TestWithAttributeAndDataProviderTest.php | 30 +++++++++++++++++++ .../warning-mix-dataprovider-types.phpt | 29 ++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 tests/end-to-end/_files/TestWithAttributeAndDataProviderTest.php create mode 100644 tests/end-to-end/metadata/warning-mix-dataprovider-types.phpt diff --git a/src/Metadata/Api/DataProvider.php b/src/Metadata/Api/DataProvider.php index b48bbc83cb4..aedd204de05 100644 --- a/src/Metadata/Api/DataProvider.php +++ b/src/Metadata/Api/DataProvider.php @@ -52,6 +52,25 @@ public function providedData(string $className, string $methodName): ?array } if ($dataProvider->isNotEmpty()) { + if ($testWith->isNotEmpty()) { + $method = new ReflectionMethod($className, $methodName); + + Event\Facade::emitter()->testTriggeredPhpunitWarning( + new TestMethod( + $className, + $methodName, + $method->getFileName(), + $method->getStartLine(), + Event\Code\TestDoxBuilder::fromClassNameAndMethodName( + $className, + $methodName, + ), + MetadataCollection::fromArray([]), + Event\TestData\TestDataCollection::fromArray([]), + ), + 'Mixing #[DataProvider] and #[TestWith] attributes is not supported, only the data provided by #[DataProvider] will be used', + ); + } $data = $this->dataProvidedByMethods($className, $methodName, $dataProvider); } else { $data = $this->dataProvidedByMetadata($testWith); diff --git a/tests/end-to-end/_files/TestWithAttributeAndDataProviderTest.php b/tests/end-to-end/_files/TestWithAttributeAndDataProviderTest.php new file mode 100644 index 00000000000..3fa138c9516 --- /dev/null +++ b/tests/end-to-end/_files/TestWithAttributeAndDataProviderTest.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\TestFixture; + +use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\TestWith; +use PHPUnit\Framework\TestCase; + +final class TestWithAttributeAndDataProviderTest extends TestCase +{ + public static function provider(): iterable + { + yield 'foo' => ['bar', 'baz']; + } + + #[TestWith(['a', 'b'], 'foo')] + #[DataProvider('provider')] + public function testWithDifferentProviderTypes($one, $two): void + { + $this->assertTrue(true); + } +} diff --git a/tests/end-to-end/metadata/warning-mix-dataprovider-types.phpt b/tests/end-to-end/metadata/warning-mix-dataprovider-types.phpt new file mode 100644 index 00000000000..2e261239c58 --- /dev/null +++ b/tests/end-to-end/metadata/warning-mix-dataprovider-types.phpt @@ -0,0 +1,29 @@ +--TEST-- +phpunit ../_files/TestWithAttributeAndDataProviderTest.php +--FILE-- +run($_SERVER['argv']); +--EXPECTF-- +PHPUnit %s by Sebastian Bergmann and contributors. + +Runtime: %s + +W 1 / 1 (100%) + +Time: %s, Memory: %s + +1 test triggered 1 PHPUnit warning: + +1) PHPUnit\TestFixture\TestWithAttributeAndDataProviderTest::testWithDifferentProviderTypes +Mixing #[DataProvider] and #[TestWith] attributes is not supported, only the data provided by #[DataProvider] will be used + +%sTestWithAttributeAndDataProviderTest.php:%d + +OK, but there were issues! +Tests: 1, Assertions: 1, PHPUnit Warnings: 1. From bbc05cae02c9b1e457bf25083ae0a71792bce0dc Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Fri, 25 Jul 2025 10:17:09 +0200 Subject: [PATCH 2/6] more generic error message and additional tests --- src/Metadata/Api/DataProvider.php | 2 +- ...stWithJsonAttributeAndDataProviderTest.php | 30 +++++++++++++++++++ ...mix-dataprovider-test-with-json-types.phpt | 29 ++++++++++++++++++ ...ing-mix-dataprovider-test-with-types.phpt} | 2 +- 4 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 tests/end-to-end/_files/TestWithJsonAttributeAndDataProviderTest.php create mode 100644 tests/end-to-end/metadata/warning-mix-dataprovider-test-with-json-types.phpt rename tests/end-to-end/metadata/{warning-mix-dataprovider-types.phpt => warning-mix-dataprovider-test-with-types.phpt} (86%) diff --git a/src/Metadata/Api/DataProvider.php b/src/Metadata/Api/DataProvider.php index aedd204de05..cea1a2772a2 100644 --- a/src/Metadata/Api/DataProvider.php +++ b/src/Metadata/Api/DataProvider.php @@ -68,7 +68,7 @@ public function providedData(string $className, string $methodName): ?array MetadataCollection::fromArray([]), Event\TestData\TestDataCollection::fromArray([]), ), - 'Mixing #[DataProvider] and #[TestWith] attributes is not supported, only the data provided by #[DataProvider] will be used', + 'Mixing #[DataProvider*] and #[TestWith*] attributes is not supported, only the data provided by #[DataProvider*] will be used', ); } $data = $this->dataProvidedByMethods($className, $methodName, $dataProvider); diff --git a/tests/end-to-end/_files/TestWithJsonAttributeAndDataProviderTest.php b/tests/end-to-end/_files/TestWithJsonAttributeAndDataProviderTest.php new file mode 100644 index 00000000000..f06754d9bcf --- /dev/null +++ b/tests/end-to-end/_files/TestWithJsonAttributeAndDataProviderTest.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\TestFixture; + +use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\TestWithJson; +use PHPUnit\Framework\TestCase; + +final class TestWithJsonAttributeAndDataProviderTest extends TestCase +{ + public static function provider(): iterable + { + yield 'foo' => ['bar', 'baz']; + } + + #[TestWithJson('[1, 2, 3]')] + #[DataProvider('provider')] + public function testWithDifferentProviderTypes($one, $two): void + { + $this->assertTrue(true); + } +} diff --git a/tests/end-to-end/metadata/warning-mix-dataprovider-test-with-json-types.phpt b/tests/end-to-end/metadata/warning-mix-dataprovider-test-with-json-types.phpt new file mode 100644 index 00000000000..6de82d4ffe1 --- /dev/null +++ b/tests/end-to-end/metadata/warning-mix-dataprovider-test-with-json-types.phpt @@ -0,0 +1,29 @@ +--TEST-- +phpunit ../_files/TestWithAttributeAndDataProviderTest.php +--FILE-- +run($_SERVER['argv']); +--EXPECTF-- +PHPUnit %s by Sebastian Bergmann and contributors. + +Runtime: %s + +W 1 / 1 (100%) + +Time: %s, Memory: %s + +1 test triggered 1 PHPUnit warning: + +1) PHPUnit\TestFixture\TestWithJsonAttributeAndDataProviderTest::testWithDifferentProviderTypes +Mixing #[DataProvider*] and #[TestWith*] attributes is not supported, only the data provided by #[DataProvider*] will be used + +%sTestWithJsonAttributeAndDataProviderTest.php:%d + +OK, but there were issues! +Tests: 1, Assertions: 1, PHPUnit Warnings: 1. diff --git a/tests/end-to-end/metadata/warning-mix-dataprovider-types.phpt b/tests/end-to-end/metadata/warning-mix-dataprovider-test-with-types.phpt similarity index 86% rename from tests/end-to-end/metadata/warning-mix-dataprovider-types.phpt rename to tests/end-to-end/metadata/warning-mix-dataprovider-test-with-types.phpt index 2e261239c58..cd4f1985284 100644 --- a/tests/end-to-end/metadata/warning-mix-dataprovider-types.phpt +++ b/tests/end-to-end/metadata/warning-mix-dataprovider-test-with-types.phpt @@ -21,7 +21,7 @@ Time: %s, Memory: %s 1 test triggered 1 PHPUnit warning: 1) PHPUnit\TestFixture\TestWithAttributeAndDataProviderTest::testWithDifferentProviderTypes -Mixing #[DataProvider] and #[TestWith] attributes is not supported, only the data provided by #[DataProvider] will be used +Mixing #[DataProvider*] and #[TestWith*] attributes is not supported, only the data provided by #[DataProvider*] will be used %sTestWithAttributeAndDataProviderTest.php:%d From 28d74d1b90a75749d0364a51d4b38fee4305b635 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Fri, 25 Jul 2025 10:17:48 +0200 Subject: [PATCH 3/6] Cover #[DataProviderExternal] variant in a test --- ...thAttributeAndExternalDataProviderTest.php | 30 +++++++++++++++++++ ...-mix-external-dataprovider-with-types.phpt | 29 ++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 tests/end-to-end/_files/TestWithAttributeAndExternalDataProviderTest.php create mode 100644 tests/end-to-end/metadata/warning-mix-external-dataprovider-with-types.phpt diff --git a/tests/end-to-end/_files/TestWithAttributeAndExternalDataProviderTest.php b/tests/end-to-end/_files/TestWithAttributeAndExternalDataProviderTest.php new file mode 100644 index 00000000000..e9803287adc --- /dev/null +++ b/tests/end-to-end/_files/TestWithAttributeAndExternalDataProviderTest.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\TestFixture; + +use PHPUnit\Framework\Attributes\DataProviderExternal; +use PHPUnit\Framework\Attributes\TestWith; +use PHPUnit\Framework\TestCase; + +final class TestWithAttributeAndExternalDataProviderTest extends TestCase +{ + public static function provider(): iterable + { + yield 'foo' => ['bar', 'baz']; + } + + #[TestWith(['a', 'b'], 'foo')] + #[DataProviderExternal(self::class, 'provider')] + public function testWithDifferentProviderTypes($one, $two): void + { + $this->assertTrue(true); + } +} diff --git a/tests/end-to-end/metadata/warning-mix-external-dataprovider-with-types.phpt b/tests/end-to-end/metadata/warning-mix-external-dataprovider-with-types.phpt new file mode 100644 index 00000000000..f0f92086491 --- /dev/null +++ b/tests/end-to-end/metadata/warning-mix-external-dataprovider-with-types.phpt @@ -0,0 +1,29 @@ +--TEST-- +phpunit ../_files/TestWithAttributeAndDataProviderTest.php +--FILE-- +run($_SERVER['argv']); +--EXPECTF-- +PHPUnit %s by Sebastian Bergmann and contributors. + +Runtime: %s + +W 1 / 1 (100%) + +Time: %s, Memory: %s + +1 test triggered 1 PHPUnit warning: + +1) PHPUnit\TestFixture\TestWithAttributeAndExternalDataProviderTest::testWithDifferentProviderTypes +Mixing #[DataProvider*] and #[TestWith*] attributes is not supported, only the data provided by #[DataProvider*] will be used + +%sTestWithAttributeAndExternalDataProviderTest.php:%d + +OK, but there were issues! +Tests: 1, Assertions: 1, PHPUnit Warnings: 1. From 90469b834cc80ec93bb45b27b0a06817b01f69e0 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Fri, 25 Jul 2025 10:24:07 +0200 Subject: [PATCH 4/6] Test same-type providers don't warn --- ...estWithAndTestWithJsonDataProviderTest.php | 30 +++++++++++++++++++ .../metadata/mix-test-with-dataproviders.phpt | 21 +++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 tests/end-to-end/_files/TestWithAndTestWithJsonDataProviderTest.php create mode 100644 tests/end-to-end/metadata/mix-test-with-dataproviders.phpt diff --git a/tests/end-to-end/_files/TestWithAndTestWithJsonDataProviderTest.php b/tests/end-to-end/_files/TestWithAndTestWithJsonDataProviderTest.php new file mode 100644 index 00000000000..cc86be436c1 --- /dev/null +++ b/tests/end-to-end/_files/TestWithAndTestWithJsonDataProviderTest.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\TestFixture; + +use PHPUnit\Framework\Attributes\TestWith; +use PHPUnit\Framework\Attributes\TestWithJson; +use PHPUnit\Framework\TestCase; + +final class TestWithAndTestWithJsonDataProviderTest extends TestCase +{ + public static function provider(): iterable + { + yield 'foo' => ['bar', 'baz']; + } + + #[TestWith(['a', 'b'], 'foo')] + #[TestWithJson('[1, 2]')] + public function testWithDifferentProviderTypes($one, $two): void + { + $this->assertTrue(true); + } +} diff --git a/tests/end-to-end/metadata/mix-test-with-dataproviders.phpt b/tests/end-to-end/metadata/mix-test-with-dataproviders.phpt new file mode 100644 index 00000000000..f451bf43596 --- /dev/null +++ b/tests/end-to-end/metadata/mix-test-with-dataproviders.phpt @@ -0,0 +1,21 @@ +--TEST-- +phpunit ../_files/TestWithAndTestWithJsonDataProviderTest.php +--FILE-- +run($_SERVER['argv']); +--EXPECTF-- +PHPUnit %s by Sebastian Bergmann and contributors. + +Runtime: %s + +.. 2 / 2 (100%) + +Time: %s, Memory: %s + +OK (2 tests, 2 assertions) From 482131e2c589c1f6a3ffd4d91fa5eb3fa1c8200c Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Fri, 25 Jul 2025 10:34:19 +0200 Subject: [PATCH 5/6] Test same-type attribute providers don't warn --- ...ataProviderExternalAndDataProviderTest.php | 35 +++++++++++++++++++ .../metadata/mix-attribute-dataproviders.phpt | 21 +++++++++++ 2 files changed, 56 insertions(+) create mode 100644 tests/end-to-end/_files/TestDataProviderExternalAndDataProviderTest.php create mode 100644 tests/end-to-end/metadata/mix-attribute-dataproviders.phpt diff --git a/tests/end-to-end/_files/TestDataProviderExternalAndDataProviderTest.php b/tests/end-to-end/_files/TestDataProviderExternalAndDataProviderTest.php new file mode 100644 index 00000000000..74f151f4ec5 --- /dev/null +++ b/tests/end-to-end/_files/TestDataProviderExternalAndDataProviderTest.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\TestFixture; + +use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\DataProviderExternal; +use PHPUnit\Framework\TestCase; + +final class TestDataProviderExternalAndDataProviderTest extends TestCase +{ + public static function externalProvider(): iterable + { + yield 'foo' => ['bar', 'baz']; + } + + public static function provider(): iterable + { + yield 'foo2' => ['bar', 'baz']; + } + + #[DataProvider('provider')] + #[DataProviderExternal(self::class, 'externalProvider')] + public function testWithDifferentProviderTypes($one, $two): void + { + $this->assertTrue(true); + } +} diff --git a/tests/end-to-end/metadata/mix-attribute-dataproviders.phpt b/tests/end-to-end/metadata/mix-attribute-dataproviders.phpt new file mode 100644 index 00000000000..b15a5f09901 --- /dev/null +++ b/tests/end-to-end/metadata/mix-attribute-dataproviders.phpt @@ -0,0 +1,21 @@ +--TEST-- +phpunit ../_files/TestDataProviderExternalAndDataProviderTest.php +--FILE-- +run($_SERVER['argv']); +--EXPECTF-- +PHPUnit %s by Sebastian Bergmann and contributors. + +Runtime: %s + +.. 2 / 2 (100%) + +Time: %s, Memory: %s + +OK (2 tests, 2 assertions) From 0e5d604597cd8079f12c90ec4cfa33c66f1c8b5e Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Fri, 25 Jul 2025 10:40:42 +0200 Subject: [PATCH 6/6] fix test description typos --- .../metadata/warning-mix-dataprovider-test-with-json-types.phpt | 2 +- .../metadata/warning-mix-external-dataprovider-with-types.phpt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/end-to-end/metadata/warning-mix-dataprovider-test-with-json-types.phpt b/tests/end-to-end/metadata/warning-mix-dataprovider-test-with-json-types.phpt index 6de82d4ffe1..65ed846b405 100644 --- a/tests/end-to-end/metadata/warning-mix-dataprovider-test-with-json-types.phpt +++ b/tests/end-to-end/metadata/warning-mix-dataprovider-test-with-json-types.phpt @@ -1,5 +1,5 @@ --TEST-- -phpunit ../_files/TestWithAttributeAndDataProviderTest.php +phpunit ../_files/TestWithJsonAttributeAndDataProviderTest.php --FILE--