Skip to content

Commit

Permalink
Closes #5958
Browse files Browse the repository at this point in the history
  • Loading branch information
sebastianbergmann committed Sep 21, 2024
1 parent 2c22732 commit 9c2190c
Show file tree
Hide file tree
Showing 12 changed files with 171 additions and 27 deletions.
1 change: 1 addition & 0 deletions ChangeLog-11.4.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,6 @@ All notable changes of the PHPUnit 11.4 release series are documented in this fi
### Deprecated

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

[11.4.0]: https://github.com/sebastianbergmann/phpunit/compare/11.3...main
15 changes: 8 additions & 7 deletions DEPRECATIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,11 @@ This functionality is currently [hard-deprecated](https://phpunit.de/backward-co

#### Miscellaneous

| Issue | Description | Since | Replacement |
|-------------------------------------------------------------------|-----------------------------------------------------------|--------|-------------------------------------|
| [#4505](https://github.com/sebastianbergmann/phpunit/issues/4505) | Metadata in doc-comments | 10.3.0 | Metadata in attributes |
| [#5214](https://github.com/sebastianbergmann/phpunit/issues/5214) | `TestCase::iniSet()` | 10.3.0 | |
| [#5216](https://github.com/sebastianbergmann/phpunit/issues/5216) | `TestCase::setLocale()` | 10.3.0 | |
| [#5800](https://github.com/sebastianbergmann/phpunit/issues/5800) | Targeting traits with `#[CoversClass]` and `#[UsesClass]` | 11.2.0 | `#[CoversClass]` and `#[UsesTrait]` |
| [#5951](https://github.com/sebastianbergmann/phpunit/issues/5951) | `includeUncoveredFiles` configuration option | 11.4.0 | |
| Issue | Description | Since | Replacement |
|-------------------------------------------------------------------|-----------------------------------------------------------|--------|-----------------------------------------------------------------------------------------|
| [#4505](https://github.com/sebastianbergmann/phpunit/issues/4505) | Metadata in doc-comments | 10.3.0 | Metadata in attributes |
| [#5214](https://github.com/sebastianbergmann/phpunit/issues/5214) | `TestCase::iniSet()` | 10.3.0 | |
| [#5216](https://github.com/sebastianbergmann/phpunit/issues/5216) | `TestCase::setLocale()` | 10.3.0 | |
| [#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 |
| [#5951](https://github.com/sebastianbergmann/phpunit/issues/5951) | `includeUncoveredFiles` configuration option | 11.4.0 | |
| [#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 |
2 changes: 2 additions & 0 deletions src/Framework/Attributes/CoversTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
* @immutable
*
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
*
* @deprecated
*/
#[Attribute(Attribute::TARGET_CLASS | Attribute::IS_REPEATABLE)]
final readonly class CoversTrait
Expand Down
2 changes: 2 additions & 0 deletions src/Framework/Attributes/UsesTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
* @immutable
*
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
*
* @deprecated
*/
#[Attribute(Attribute::TARGET_CLASS | Attribute::IS_REPEATABLE)]
final readonly class UsesTrait
Expand Down
22 changes: 20 additions & 2 deletions src/Metadata/Api/CodeCoverage.php
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,24 @@ private function names(CoversClass|CoversFunction|CoversMethod|CoversTrait|UsesC
$name = $metadata->asStringForCodeUnitMapper();
$names = [$name];

if ($metadata->isCoversTrait()) {
EventFacade::emitter()->testRunnerTriggeredDeprecation(
sprintf(
'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.',
$names[0],
),
);
}

if ($metadata->isUsesTrait()) {
EventFacade::emitter()->testRunnerTriggeredDeprecation(
sprintf(
'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.',
$names[0],
),
);
}

if ($metadata->isCoversClass() || $metadata->isUsesClass()) {
if (isset($this->withParents[$name])) {
return $this->withParents[$name];
Expand Down Expand Up @@ -301,7 +319,7 @@ private function names(CoversClass|CoversFunction|CoversMethod|CoversTrait|UsesC
if ($metadata->isCoversClass() && trait_exists($names[0])) {
EventFacade::emitter()->testRunnerTriggeredDeprecation(
sprintf(
'Targeting a trait such as %s with #[CoversClass] is deprecated, please refactor your test to use #[CoversTrait] instead.',
'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.',
$names[0],
),
);
Expand All @@ -310,7 +328,7 @@ private function names(CoversClass|CoversFunction|CoversMethod|CoversTrait|UsesC
if ($metadata->isUsesClass() && trait_exists($names[0])) {
EventFacade::emitter()->testRunnerTriggeredDeprecation(
sprintf(
'Targeting a trait such as %s with #[UsesClass] is deprecated, please refactor your test to use #[UsesTrait] instead.',
'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.',
$names[0],
),
);
Expand Down
23 changes: 23 additions & 0 deletions tests/end-to-end/_files/TraitTargetedWithCoversTraitTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php declare(strict_types=1);
/*
* This file is part of PHPUnit.
*
* (c) Sebastian Bergmann <sebastian@phpunit.de>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace PHPUnit\DeprecatedAnnotationsTestFixture;

use PHPUnit\Framework\Attributes\CoversTrait;
use PHPUnit\Framework\TestCase;
use PHPUnit\TestFixture\CoveredTrait;

#[CoversTrait(CoveredTrait::class)]
final class TraitTargetedWithCoversTraitTest extends TestCase
{
public function testSomething(): void
{
$this->assertTrue(true);
}
}
23 changes: 23 additions & 0 deletions tests/end-to-end/_files/TraitTargetedWithUsesTraitTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php declare(strict_types=1);
/*
* This file is part of PHPUnit.
*
* (c) Sebastian Bergmann <sebastian@phpunit.de>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace PHPUnit\DeprecatedAnnotationsTestFixture;

use PHPUnit\Framework\Attributes\UsesTrait;
use PHPUnit\Framework\TestCase;
use PHPUnit\TestFixture\CoveredTrait;

#[UsesTrait(CoveredTrait::class)]
final class TraitTargetedWithUsesTraitTest extends TestCase
{
public function testSomething(): void
{
$this->assertTrue(true);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ Test Suite Started (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCo
Test Preparation Started (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversClassTest::testSomething)
Test Prepared (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversClassTest::testSomething)
Test Passed (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversClassTest::testSomething)
Test Runner Triggered Deprecation (Targeting a trait such as PHPUnit\TestFixture\CoveredTrait with #[CoversClass] is deprecated, please refactor your test to use #[CoversTrait] instead.)
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.)
Test Finished (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversClassTest::testSomething)
Test Suite Finished (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversClassTest, 1 test)
Test Runner Execution Finished
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
--TEST--
The right events are emitted in the right order for a successful test that targets a trait with #[CoversTrait]
--SKIPIF--
<?php declare(strict_types=1);
require __DIR__ . '/../../_files/skip-if-requires-code-coverage-driver.php';
--FILE--
<?php declare(strict_types=1);
$traceFile = tempnam(sys_get_temp_dir(), __FILE__);
$coverageFile = tempnam(sys_get_temp_dir(), __FILE__);

$_SERVER['argv'][] = '--do-not-cache-result';
$_SERVER['argv'][] = '--no-configuration';
$_SERVER['argv'][] = '--no-output';
$_SERVER['argv'][] = '--log-events-text';
$_SERVER['argv'][] = $traceFile;
$_SERVER['argv'][] = '--coverage-text=' . $coverageFile;
$_SERVER['argv'][] = '--coverage-filter';
$_SERVER['argv'][] = __DIR__ . '/../_files';
$_SERVER['argv'][] = __DIR__ . '/../_files/TraitTargetedWithCoversTraitTest.php';

require __DIR__ . '/../../bootstrap.php';

(new PHPUnit\TextUI\Application)->run($_SERVER['argv']);

print file_get_contents($traceFile);

unlink($traceFile);
--EXPECTF--
PHPUnit Started (PHPUnit %s using %s)
Test Runner Configured
Event Facade Sealed
Test Suite Loaded (1 test)
Test Runner Started
Test Suite Sorted
Test Runner Execution Started (1 test)
Test Suite Started (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversTraitTest, 1 test)
Test Preparation Started (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversTraitTest::testSomething)
Test Prepared (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversTraitTest::testSomething)
Test Passed (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversTraitTest::testSomething)
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.)
Test Finished (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversTraitTest::testSomething)
Test Suite Finished (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversTraitTest, 1 test)
Test Runner Execution Finished
Test Runner Finished
PHPUnit Finished (Shell Exit Code: 0)
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ Test Suite Started (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUs
Test Preparation Started (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUsesClassTest::testSomething)
Test Prepared (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUsesClassTest::testSomething)
Test Passed (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUsesClassTest::testSomething)
Test Runner Triggered Deprecation (Targeting a trait such as PHPUnit\TestFixture\CoveredTrait with #[UsesClass] is deprecated, please refactor your test to use #[UsesTrait] instead.)
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.)
Test Finished (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUsesClassTest::testSomething)
Test Suite Finished (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUsesClassTest, 1 test)
Test Runner Execution Finished
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
--TEST--
The right events are emitted in the right order for a successful test that targets a trait with #[UsesTrait]
--SKIPIF--
<?php declare(strict_types=1);
require __DIR__ . '/../../_files/skip-if-requires-code-coverage-driver.php';
--FILE--
<?php declare(strict_types=1);
$traceFile = tempnam(sys_get_temp_dir(), __FILE__);
$coverageFile = tempnam(sys_get_temp_dir(), __FILE__);

$_SERVER['argv'][] = '--do-not-cache-result';
$_SERVER['argv'][] = '--no-configuration';
$_SERVER['argv'][] = '--no-output';
$_SERVER['argv'][] = '--log-events-text';
$_SERVER['argv'][] = $traceFile;
$_SERVER['argv'][] = '--coverage-text=' . $coverageFile;
$_SERVER['argv'][] = '--coverage-filter';
$_SERVER['argv'][] = __DIR__ . '/../_files';
$_SERVER['argv'][] = __DIR__ . '/../_files/TraitTargetedWithUsesTraitTest.php';

require __DIR__ . '/../../bootstrap.php';

(new PHPUnit\TextUI\Application)->run($_SERVER['argv']);

print file_get_contents($traceFile);

unlink($traceFile);
--EXPECTF--
PHPUnit Started (PHPUnit %s using %s)
Test Runner Configured
Event Facade Sealed
Test Suite Loaded (1 test)
Test Runner Started
Test Suite Sorted
Test Runner Execution Started (1 test)
Test Suite Started (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUsesTraitTest, 1 test)
Test Preparation Started (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUsesTraitTest::testSomething)
Test Prepared (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUsesTraitTest::testSomething)
Test Passed (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUsesTraitTest::testSomething)
Test Runner Triggered Deprecation (Targeting a trait such as PHPUnit\TestFixture\CoveredTrait with #[UsesTrait] is deprecated. The traits used by the class(es) you target with #[UsesClass] will be targeted as well.)
Test Finished (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUsesTraitTest::testSomething)
Test Suite Finished (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUsesTraitTest, 1 test)
Test Runner Execution Finished
Test Runner Finished
PHPUnit Finished (Shell Exit Code: 0)
16 changes: 0 additions & 16 deletions tests/unit/Metadata/Api/CodeCoverageTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -221,14 +221,6 @@ public static function linesToBeCoveredProvider(): array
'testOne',
],

[
[
TEST_FILES_PATH . 'CoveredTrait.php' => range(12, 18),
],
CoverageTraitTest::class,
'testSomething',
],

[
[
TEST_FILES_PATH . 'CoveredTrait.php' => range(14, 17),
Expand Down Expand Up @@ -363,14 +355,6 @@ public static function linesToBeUsedProvider(): array
'testFunc',
],

[
[
TEST_FILES_PATH . 'CoveredTrait.php' => range(12, 18),
],
CoverageTraitTest::class,
'testSomething',
],

[
[
TEST_FILES_PATH . 'CoveredTrait.php' => range(14, 17),
Expand Down

0 comments on commit 9c2190c

Please sign in to comment.