Skip to content

Commit ba61e62

Browse files
Closes #5958
1 parent 2c22732 commit ba61e62

12 files changed

+171
-28
lines changed

ChangeLog-11.4.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,6 @@ All notable changes of the PHPUnit 11.4 release series are documented in this fi
1919
### Deprecated
2020

2121
* [#5951](https://github.com/sebastianbergmann/phpunit/issues/5951): `includeUncoveredFiles` configuration option
22+
* [#5958](https://github.com/sebastianbergmann/phpunit/issues/5958): Support for `#[CoversTrait]` and `#[UsesTrait]` attributes
2223

2324
[11.4.0]: https://github.com/sebastianbergmann/phpunit/compare/11.3...main

DEPRECATIONS.md

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,11 @@ This functionality is currently [hard-deprecated](https://phpunit.de/backward-co
5252

5353
#### Miscellaneous
5454

55-
| Issue | Description | Since | Replacement |
56-
|-------------------------------------------------------------------|-----------------------------------------------------------|--------|-------------------------------------|
57-
| [#4505](https://github.com/sebastianbergmann/phpunit/issues/4505) | Metadata in doc-comments | 10.3.0 | Metadata in attributes |
58-
| [#5214](https://github.com/sebastianbergmann/phpunit/issues/5214) | `TestCase::iniSet()` | 10.3.0 | |
59-
| [#5216](https://github.com/sebastianbergmann/phpunit/issues/5216) | `TestCase::setLocale()` | 10.3.0 | |
60-
| [#5800](https://github.com/sebastianbergmann/phpunit/issues/5800) | Targeting traits with `#[CoversClass]` and `#[UsesClass]` | 11.2.0 | `#[CoversClass]` and `#[UsesTrait]` |
61-
| [#5951](https://github.com/sebastianbergmann/phpunit/issues/5951) | `includeUncoveredFiles` configuration option | 11.4.0 | |
55+
| Issue | Description | Since | Replacement |
56+
|-------------------------------------------------------------------|-----------------------------------------------------------|--------|-----------------------------------------------------------------------------------------|
57+
| [#4505](https://github.com/sebastianbergmann/phpunit/issues/4505) | Metadata in doc-comments | 10.3.0 | Metadata in attributes |
58+
| [#5214](https://github.com/sebastianbergmann/phpunit/issues/5214) | `TestCase::iniSet()` | 10.3.0 | |
59+
| [#5216](https://github.com/sebastianbergmann/phpunit/issues/5216) | `TestCase::setLocale()` | 10.3.0 | |
60+
| [#5800](https://github.com/sebastianbergmann/phpunit/issues/5800) | Targeting traits with `#[CoversClass]` and `#[UsesClass]` | 11.2.0 | `#[CoversClass]` and `#[UsesClass]` also target the traits used by the targeted classes |
61+
| [#5951](https://github.com/sebastianbergmann/phpunit/issues/5951) | `includeUncoveredFiles` configuration option | 11.4.0 | |
62+
| [#5958](https://github.com/sebastianbergmann/phpunit/issues/5958) | `#[CoversTrait]` and `#[UsesTrait]` attributes | 11.4.0 | `#[CoversClass]` and `#[UsesClass]` also target the traits used by the targeted classes |

src/Framework/Attributes/CoversTrait.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
* @immutable
1616
*
1717
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
18+
*
19+
* @deprecated
1820
*/
1921
#[Attribute(Attribute::TARGET_CLASS | Attribute::IS_REPEATABLE)]
2022
final readonly class CoversTrait

src/Framework/Attributes/UsesTrait.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
* @immutable
1616
*
1717
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
18+
*
19+
* @deprecated
1820
*/
1921
#[Attribute(Attribute::TARGET_CLASS | Attribute::IS_REPEATABLE)]
2022
final readonly class UsesTrait

src/Metadata/Api/CodeCoverage.php

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,24 @@ private function names(CoversClass|CoversFunction|CoversMethod|CoversTrait|UsesC
273273
$name = $metadata->asStringForCodeUnitMapper();
274274
$names = [$name];
275275

276+
if ($metadata->isCoversTrait()) {
277+
EventFacade::emitter()->testRunnerTriggeredDeprecation(
278+
sprintf(
279+
'Targeting a trait such as %s with #[CoversTrait] is deprecated. The traits used by the class(es) you target with #[CoversClass] will be targeted as well.',
280+
$names[0],
281+
),
282+
);
283+
}
284+
285+
if ($metadata->isUsesTrait()) {
286+
EventFacade::emitter()->testRunnerTriggeredDeprecation(
287+
sprintf(
288+
'Targeting a trait such as %s with #[UsesTrait] is deprecated. The traits used by the class(es) you target with #[UsesClass] will be targeted as well.',
289+
$names[0],
290+
),
291+
);
292+
}
293+
276294
if ($metadata->isCoversClass() || $metadata->isUsesClass()) {
277295
if (isset($this->withParents[$name])) {
278296
return $this->withParents[$name];
@@ -301,7 +319,7 @@ private function names(CoversClass|CoversFunction|CoversMethod|CoversTrait|UsesC
301319
if ($metadata->isCoversClass() && trait_exists($names[0])) {
302320
EventFacade::emitter()->testRunnerTriggeredDeprecation(
303321
sprintf(
304-
'Targeting a trait such as %s with #[CoversClass] is deprecated, please refactor your test to use #[CoversTrait] instead.',
322+
'Targeting a trait such as %s with #[CoversClass] is deprecated. The traits used by the class(es) you target with #[CoversClass] will be targeted as well.',
305323
$names[0],
306324
),
307325
);
@@ -310,7 +328,7 @@ private function names(CoversClass|CoversFunction|CoversMethod|CoversTrait|UsesC
310328
if ($metadata->isUsesClass() && trait_exists($names[0])) {
311329
EventFacade::emitter()->testRunnerTriggeredDeprecation(
312330
sprintf(
313-
'Targeting a trait such as %s with #[UsesClass] is deprecated, please refactor your test to use #[UsesTrait] instead.',
331+
'Targeting a trait such as %s with #[UsesClass] is deprecated. The traits used by the class(es) you target with #[UsesClass] will be targeted as well.',
314332
$names[0],
315333
),
316334
);
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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\DeprecatedAnnotationsTestFixture;
11+
12+
use PHPUnit\Framework\Attributes\CoversTrait;
13+
use PHPUnit\Framework\TestCase;
14+
use PHPUnit\TestFixture\CoveredTrait;
15+
16+
#[CoversTrait(CoveredTrait::class)]
17+
final class TraitTargetedWithCoversTraitTest extends TestCase
18+
{
19+
public function testSomething(): void
20+
{
21+
$this->assertTrue(true);
22+
}
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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\DeprecatedAnnotationsTestFixture;
11+
12+
use PHPUnit\Framework\Attributes\UsesTrait;
13+
use PHPUnit\Framework\TestCase;
14+
use PHPUnit\TestFixture\CoveredTrait;
15+
16+
#[UsesTrait(CoveredTrait::class)]
17+
final class TraitTargetedWithUsesTraitTest extends TestCase
18+
{
19+
public function testSomething(): void
20+
{
21+
$this->assertTrue(true);
22+
}
23+
}

tests/end-to-end/metadata/targeting-traits-with-coversclass-attribute-is-deprecated.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ Test Suite Started (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCo
3737
Test Preparation Started (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversClassTest::testSomething)
3838
Test Prepared (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversClassTest::testSomething)
3939
Test Passed (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversClassTest::testSomething)
40-
Test Runner Triggered Deprecation (Targeting a trait such as PHPUnit\TestFixture\CoveredTrait with #[CoversClass] is deprecated, please refactor your test to use #[CoversTrait] instead.)
40+
Test Runner Triggered Deprecation (Targeting a trait such as PHPUnit\TestFixture\CoveredTrait with #[CoversClass] is deprecated. The traits used by the class(es) you target with #[CoversClass] will be targeted as well.)
4141
Test Finished (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversClassTest::testSomething)
4242
Test Suite Finished (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversClassTest, 1 test)
4343
Test Runner Execution Finished
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
--TEST--
2+
The right events are emitted in the right order for a successful test that targets a trait with #[CoversTrait]
3+
--SKIPIF--
4+
<?php declare(strict_types=1);
5+
require __DIR__ . '/../../_files/skip-if-requires-code-coverage-driver.php';
6+
--FILE--
7+
<?php declare(strict_types=1);
8+
$traceFile = tempnam(sys_get_temp_dir(), __FILE__);
9+
$coverageFile = tempnam(sys_get_temp_dir(), __FILE__);
10+
11+
$_SERVER['argv'][] = '--do-not-cache-result';
12+
$_SERVER['argv'][] = '--no-configuration';
13+
$_SERVER['argv'][] = '--no-output';
14+
$_SERVER['argv'][] = '--log-events-text';
15+
$_SERVER['argv'][] = $traceFile;
16+
$_SERVER['argv'][] = '--coverage-text=' . $coverageFile;
17+
$_SERVER['argv'][] = '--coverage-filter';
18+
$_SERVER['argv'][] = __DIR__ . '/../_files';
19+
$_SERVER['argv'][] = __DIR__ . '/../_files/TraitTargetedWithCoversTraitTest.php';
20+
21+
require __DIR__ . '/../../bootstrap.php';
22+
23+
(new PHPUnit\TextUI\Application)->run($_SERVER['argv']);
24+
25+
print file_get_contents($traceFile);
26+
27+
unlink($traceFile);
28+
--EXPECTF--
29+
PHPUnit Started (PHPUnit %s using %s)
30+
Test Runner Configured
31+
Event Facade Sealed
32+
Test Suite Loaded (1 test)
33+
Test Runner Started
34+
Test Suite Sorted
35+
Test Runner Execution Started (1 test)
36+
Test Suite Started (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversTraitTest, 1 test)
37+
Test Preparation Started (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversTraitTest::testSomething)
38+
Test Prepared (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversTraitTest::testSomething)
39+
Test Passed (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversTraitTest::testSomething)
40+
Test Runner Triggered Deprecation (Targeting a trait such as PHPUnit\TestFixture\CoveredTrait with #[CoversTrait] is deprecated. The traits used by the class(es) you target with #[CoversClass] will be targeted as well.)
41+
Test Finished (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversTraitTest::testSomething)
42+
Test Suite Finished (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversTraitTest, 1 test)
43+
Test Runner Execution Finished
44+
Test Runner Finished
45+
PHPUnit Finished (Shell Exit Code: 0)

tests/end-to-end/metadata/targeting-traits-with-usesclass-attribute-is-deprecated.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ Test Suite Started (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUs
3737
Test Preparation Started (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUsesClassTest::testSomething)
3838
Test Prepared (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUsesClassTest::testSomething)
3939
Test Passed (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUsesClassTest::testSomething)
40-
Test Runner Triggered Deprecation (Targeting a trait such as PHPUnit\TestFixture\CoveredTrait with #[UsesClass] is deprecated, please refactor your test to use #[UsesTrait] instead.)
40+
Test Runner Triggered Deprecation (Targeting a trait such as PHPUnit\TestFixture\CoveredTrait with #[UsesClass] is deprecated. The traits used by the class(es) you target with #[UsesClass] will be targeted as well.)
4141
Test Finished (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUsesClassTest::testSomething)
4242
Test Suite Finished (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUsesClassTest, 1 test)
4343
Test Runner Execution Finished

0 commit comments

Comments
 (0)