Skip to content

Commit 15d0472

Browse files
Also trigger a warning for a data provider method that has a #[Test] attribute
1 parent 60d0349 commit 15d0472

File tree

4 files changed

+86
-17
lines changed

4 files changed

+86
-17
lines changed

src/Metadata/Api/DataProvider.php

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
use function assert;
1616
use function explode;
1717
use function get_debug_type;
18-
use function is_a;
1918
use function is_array;
2019
use function is_int;
2120
use function is_string;
@@ -27,7 +26,6 @@
2726
use function rtrim;
2827
use function sprintf;
2928
use function str_replace;
30-
use function str_starts_with;
3129
use function strlen;
3230
use function substr;
3331
use function trim;
@@ -36,12 +34,12 @@
3634
use PHPUnit\Event\TestData\MoreThanOneDataSetFromDataProviderException;
3735
use PHPUnit\Event\TestData\TestDataCollection;
3836
use PHPUnit\Framework\InvalidDataProviderException;
39-
use PHPUnit\Framework\TestCase;
4037
use PHPUnit\Metadata\DataProvider as DataProviderMetadata;
4138
use PHPUnit\Metadata\MetadataCollection;
4239
use PHPUnit\Metadata\Parser\Registry as MetadataRegistry;
4340
use PHPUnit\Metadata\TestWith;
4441
use PHPUnit\Util\Reflection;
42+
use PHPUnit\Util\Test;
4543
use ReflectionClass;
4644
use ReflectionMethod;
4745
use Throwable;
@@ -109,19 +107,6 @@ private function dataProvidedByMethods(string $className, string $methodName, Me
109107
foreach ($dataProvider as $_dataProvider) {
110108
assert($_dataProvider instanceof DataProviderMetadata);
111109

112-
if (is_a($_dataProvider->className(), TestCase::class, true) &&
113-
str_starts_with($_dataProvider->methodName(), 'test')) {
114-
Event\Facade::emitter()->testRunnerTriggeredPhpunitWarning(
115-
sprintf(
116-
'The name of the data provider method %s::%s() used by test method %s::%s() begins with "test", therefore PHPUnit also treats it as a test method',
117-
$_dataProvider->className(),
118-
$_dataProvider->methodName(),
119-
$className,
120-
$methodName,
121-
),
122-
);
123-
}
124-
125110
$dataProviderMethod = new Event\Code\ClassMethod($_dataProvider->className(), $_dataProvider->methodName());
126111

127112
Event\Facade::emitter()->dataProviderMethodCalled(
@@ -134,6 +119,19 @@ private function dataProvidedByMethods(string $className, string $methodName, Me
134119
try {
135120
$class = new ReflectionClass($_dataProvider->className());
136121
$method = $class->getMethod($_dataProvider->methodName());
122+
123+
if (Test::isTestMethod($method)) {
124+
Event\Facade::emitter()->testRunnerTriggeredPhpunitWarning(
125+
sprintf(
126+
'Method %s::%s() used by test method %s::%s() is also a test method',
127+
$_dataProvider->className(),
128+
$_dataProvider->methodName(),
129+
$className,
130+
$methodName,
131+
),
132+
);
133+
}
134+
137135
$object = null;
138136

139137
if (!$method->isPublic()) {
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php declare(strict_types=1);
2+
/*
3+
* This file is part of PHPUnit.
4+
*
5+
* (c) Sebastian Bergmann <[email protected]>
6+
*
7+
* For the full copyright and license information, please view the LICENSE
8+
* file that was distributed with this source code.
9+
*/
10+
namespace PHPUnit\TestFixture;
11+
12+
use PHPUnit\Framework\Attributes\DataProvider;
13+
use PHPUnit\Framework\Attributes\Test;
14+
use PHPUnit\Framework\TestCase;
15+
16+
final class DataProviderMethodHasTestAttributeTest extends TestCase
17+
{
18+
#[Test]
19+
public static function provider(): array
20+
{
21+
return [[true]];
22+
}
23+
24+
#[DataProvider('provider')]
25+
public function testOne(bool $b): void
26+
{
27+
$this->assertTrue($b);
28+
}
29+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
--TEST--
2+
phpunit ../../_files/DataProviderMethodHasTestAttributeTest.php
3+
--FILE--
4+
<?php declare(strict_types=1);
5+
$_SERVER['argv'][] = '--do-not-cache-result';
6+
$_SERVER['argv'][] = '--no-configuration';
7+
$_SERVER['argv'][] = '--debug';
8+
$_SERVER['argv'][] = __DIR__ . '/../../_files/DataProviderMethodHasTestAttributeTest.php';
9+
10+
require_once __DIR__ . '/../../bootstrap.php';
11+
12+
(new PHPUnit\TextUI\Application)->run($_SERVER['argv']);
13+
--EXPECTF--
14+
PHPUnit Started (PHPUnit %s using %s)
15+
Test Runner Configured
16+
Data Provider Method Called (PHPUnit\TestFixture\DataProviderMethodHasTestAttributeTest::provider for test method PHPUnit\TestFixture\DataProviderMethodHasTestAttributeTest::testOne)
17+
Test Runner Triggered Warning (Method PHPUnit\TestFixture\DataProviderMethodHasTestAttributeTest::provider() used by test method PHPUnit\TestFixture\DataProviderMethodHasTestAttributeTest::testOne() is also a test method)
18+
Data Provider Method Finished for PHPUnit\TestFixture\DataProviderMethodHasTestAttributeTest::testOne:
19+
- PHPUnit\TestFixture\DataProviderMethodHasTestAttributeTest::provider
20+
Test Suite Loaded (2 tests)
21+
Event Facade Sealed
22+
Test Runner Started
23+
Test Suite Sorted
24+
Test Runner Execution Started (2 tests)
25+
Test Suite Started (PHPUnit\TestFixture\DataProviderMethodHasTestAttributeTest, 2 tests)
26+
Test Preparation Started (PHPUnit\TestFixture\DataProviderMethodHasTestAttributeTest::provider)
27+
Test Prepared (PHPUnit\TestFixture\DataProviderMethodHasTestAttributeTest::provider)
28+
Test Passed (PHPUnit\TestFixture\DataProviderMethodHasTestAttributeTest::provider)
29+
Test Considered Risky (PHPUnit\TestFixture\DataProviderMethodHasTestAttributeTest::provider)
30+
This test did not perform any assertions
31+
Test Finished (PHPUnit\TestFixture\DataProviderMethodHasTestAttributeTest::provider)
32+
Test Suite Started (PHPUnit\TestFixture\DataProviderMethodHasTestAttributeTest::testOne, 1 test)
33+
Test Preparation Started (PHPUnit\TestFixture\DataProviderMethodHasTestAttributeTest::testOne#0)
34+
Test Prepared (PHPUnit\TestFixture\DataProviderMethodHasTestAttributeTest::testOne#0)
35+
Assertion Succeeded (Constraint: is true, Value: true)
36+
Test Passed (PHPUnit\TestFixture\DataProviderMethodHasTestAttributeTest::testOne#0)
37+
Test Finished (PHPUnit\TestFixture\DataProviderMethodHasTestAttributeTest::testOne#0)
38+
Test Suite Finished (PHPUnit\TestFixture\DataProviderMethodHasTestAttributeTest::testOne, 1 test)
39+
Test Suite Finished (PHPUnit\TestFixture\DataProviderMethodHasTestAttributeTest, 2 tests)
40+
Test Runner Execution Finished
41+
Test Runner Finished
42+
PHPUnit Finished (Shell Exit Code: 1)

tests/end-to-end/data-provider/warning-when-data-provider-method-name-begins-with-test.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ require_once __DIR__ . '/../../bootstrap.php';
1313
--EXPECTF--
1414
PHPUnit Started (PHPUnit %s using %s)
1515
Test Runner Configured
16-
Test Runner Triggered Warning (The name of the data provider method PHPUnit\TestFixture\DataProviderMethodNameStartsWithTestTest::testProvider() used by test method PHPUnit\TestFixture\DataProviderMethodNameStartsWithTestTest::testOne() begins with "test", therefore PHPUnit also treats it as a test method)
1716
Data Provider Method Called (PHPUnit\TestFixture\DataProviderMethodNameStartsWithTestTest::testProvider for test method PHPUnit\TestFixture\DataProviderMethodNameStartsWithTestTest::testOne)
17+
Test Runner Triggered Warning (Method PHPUnit\TestFixture\DataProviderMethodNameStartsWithTestTest::testProvider() used by test method PHPUnit\TestFixture\DataProviderMethodNameStartsWithTestTest::testOne() is also a test method)
1818
Data Provider Method Finished for PHPUnit\TestFixture\DataProviderMethodNameStartsWithTestTest::testOne:
1919
- PHPUnit\TestFixture\DataProviderMethodNameStartsWithTestTest::testProvider
2020
Test Suite Loaded (2 tests)

0 commit comments

Comments
 (0)