Skip to content

Commit 154de22

Browse files
rpkampsebastianbergmann
authored andcommitted
Add AfterTestHook for extensions
So extensions have hook for some common functionality that should happen after every test, regardless of the result.
1 parent 1349e75 commit 154de22

File tree

4 files changed

+43
-5
lines changed

4 files changed

+43
-5
lines changed

src/Runner/Hook/AfterTestHook.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php declare(strict_types=1);
2+
/*
3+
* This file is part of PHPUnit.
4+
*
5+
* (c) Sebastian Bergmann <sebastian@phpunit.de>
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\Runner;
11+
12+
interface AfterTestHook extends Hook
13+
{
14+
/**
15+
* This hook will fire after any test, regardless of the result.
16+
*
17+
* For more fine grained control, have a look at the other hooks
18+
* that extend PHPUnit\Runner\Hook.
19+
*/
20+
public function executeAfterTest(string $test, float $time): void;
21+
}

src/Runner/Hook/TestListenerAdapter.php

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -112,13 +112,17 @@ public function addSkippedTest(Test $test, \Throwable $t, float $time): void
112112

113113
public function endTest(Test $test, float $time): void
114114
{
115-
if ($this->lastTestWasNotSuccessful === true) {
116-
return;
115+
if ($this->lastTestWasNotSuccessful !== true) {
116+
foreach ($this->hooks as $hook) {
117+
if ($hook instanceof AfterSuccessfulTestHook) {
118+
$hook->executeAfterSuccessfulTest(TestUtil::describeAsString($test), $time);
119+
}
120+
}
117121
}
118122

119123
foreach ($this->hooks as $hook) {
120-
if ($hook instanceof AfterSuccessfulTestHook) {
121-
$hook->executeAfterSuccessfulTest(TestUtil::describeAsString($test), $time);
124+
if ($hook instanceof AfterTestHook) {
125+
$hook->executeAfterTest(TestUtil::describeAsString($test), $time);
122126
}
123127
}
124128
}

tests/end-to-end/_files/Extension.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,12 @@
1616
use PHPUnit\Runner\AfterSuccessfulTestHook;
1717
use PHPUnit\Runner\AfterTestErrorHook;
1818
use PHPUnit\Runner\AfterTestFailureHook;
19+
use PHPUnit\Runner\AfterTestHook;
1920
use PHPUnit\Runner\AfterTestWarningHook;
2021
use PHPUnit\Runner\BeforeFirstTestHook;
2122
use PHPUnit\Runner\BeforeTestHook;
2223

23-
final class Extension implements BeforeFirstTestHook, BeforeTestHook, AfterSuccessfulTestHook, AfterSkippedTestHook, AfterRiskyTestHook, AfterIncompleteTestHook, AfterTestErrorHook, AfterTestWarningHook, AfterTestFailureHook, AfterLastTestHook
24+
final class Extension implements BeforeFirstTestHook, BeforeTestHook, AfterTestHook, AfterSuccessfulTestHook, AfterSkippedTestHook, AfterRiskyTestHook, AfterIncompleteTestHook, AfterTestErrorHook, AfterTestWarningHook, AfterTestFailureHook, AfterLastTestHook
2425
{
2526
private $amountOfInjectedArguments = 0;
2627

@@ -45,6 +46,11 @@ public function executeBeforeTest(string $test): void
4546
print __METHOD__ . ': ' . $test . \PHP_EOL;
4647
}
4748

49+
public function executeAfterTest(string $test, float $time): void
50+
{
51+
print __METHOD__ . ': ' . $test . \PHP_EOL;
52+
}
53+
4854
public function executeAfterSuccessfulTest(string $test, float $time): void
4955
{
5056
print __METHOD__ . ': ' . $test . \PHP_EOL;

tests/end-to-end/hooks.phpt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,23 @@ PHPUnit\Test\Extension::tellAmountOfInjectedArguments: %d
1616
PHPUnit\Test\Extension::executeBeforeFirstTest
1717
PHPUnit\Test\Extension::executeBeforeTest: PHPUnit\Test\HookTest::testSuccess
1818
PHPUnit\Test\Extension::executeAfterSuccessfulTest: PHPUnit\Test\HookTest::testSuccess
19+
PHPUnit\Test\Extension::executeAfterTest: PHPUnit\Test\HookTest::testSuccess
1920
PHPUnit\Test\Extension::executeBeforeTest: PHPUnit\Test\HookTest::testFailure
2021
PHPUnit\Test\Extension::executeAfterTestFailure: PHPUnit\Test\HookTest::testFailure: Failed asserting that false is true.
22+
PHPUnit\Test\Extension::executeAfterTest: PHPUnit\Test\HookTest::testFailure
2123
PHPUnit\Test\Extension::executeBeforeTest: PHPUnit\Test\HookTest::testError
2224
PHPUnit\Test\Extension::executeAfterTestError: PHPUnit\Test\HookTest::testError: message
25+
PHPUnit\Test\Extension::executeAfterTest: PHPUnit\Test\HookTest::testError
2326
PHPUnit\Test\Extension::executeBeforeTest: PHPUnit\Test\HookTest::testIncomplete
2427
PHPUnit\Test\Extension::executeAfterIncompleteTest: PHPUnit\Test\HookTest::testIncomplete: message
28+
PHPUnit\Test\Extension::executeAfterTest: PHPUnit\Test\HookTest::testIncomplete
2529
PHPUnit\Test\Extension::executeBeforeTest: PHPUnit\Test\HookTest::testRisky
2630
PHPUnit\Test\Extension::executeAfterRiskyTest: PHPUnit\Test\HookTest::testRisky: message
31+
PHPUnit\Test\Extension::executeAfterTest: PHPUnit\Test\HookTest::testRisky
2732
PHPUnit\Test\Extension::executeBeforeTest: PHPUnit\Test\HookTest::testSkipped
2833
PHPUnit\Test\Extension::executeAfterSkippedTest: PHPUnit\Test\HookTest::testSkipped: message
34+
PHPUnit\Test\Extension::executeAfterTest: PHPUnit\Test\HookTest::testSkipped
2935
PHPUnit\Test\Extension::executeBeforeTest: PHPUnit\Test\HookTest::testWarning
3036
PHPUnit\Test\Extension::executeAfterTestWarning: PHPUnit\Test\HookTest::testWarning: message
37+
PHPUnit\Test\Extension::executeAfterTest: PHPUnit\Test\HookTest::testWarning
3138
PHPUnit\Test\Extension::executeAfterLastTest

0 commit comments

Comments
 (0)