From 154de22df1fda1d67758ab1c417603df7b290809 Mon Sep 17 00:00:00 2001 From: Remon van de Kamp Date: Mon, 5 Nov 2018 21:52:55 +0100 Subject: [PATCH] Add AfterTestHook for extensions So extensions have hook for some common functionality that should happen after every test, regardless of the result. --- src/Runner/Hook/AfterTestHook.php | 21 +++++++++++++++++++++ src/Runner/Hook/TestListenerAdapter.php | 12 ++++++++---- tests/end-to-end/_files/Extension.php | 8 +++++++- tests/end-to-end/hooks.phpt | 7 +++++++ 4 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 src/Runner/Hook/AfterTestHook.php diff --git a/src/Runner/Hook/AfterTestHook.php b/src/Runner/Hook/AfterTestHook.php new file mode 100644 index 00000000000..f463732a757 --- /dev/null +++ b/src/Runner/Hook/AfterTestHook.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +interface AfterTestHook extends Hook +{ + /** + * This hook will fire after any test, regardless of the result. + * + * For more fine grained control, have a look at the other hooks + * that extend PHPUnit\Runner\Hook. + */ + public function executeAfterTest(string $test, float $time): void; +} diff --git a/src/Runner/Hook/TestListenerAdapter.php b/src/Runner/Hook/TestListenerAdapter.php index 3f922056d42..02ed7006b44 100644 --- a/src/Runner/Hook/TestListenerAdapter.php +++ b/src/Runner/Hook/TestListenerAdapter.php @@ -112,13 +112,17 @@ public function addSkippedTest(Test $test, \Throwable $t, float $time): void public function endTest(Test $test, float $time): void { - if ($this->lastTestWasNotSuccessful === true) { - return; + if ($this->lastTestWasNotSuccessful !== true) { + foreach ($this->hooks as $hook) { + if ($hook instanceof AfterSuccessfulTestHook) { + $hook->executeAfterSuccessfulTest(TestUtil::describeAsString($test), $time); + } + } } foreach ($this->hooks as $hook) { - if ($hook instanceof AfterSuccessfulTestHook) { - $hook->executeAfterSuccessfulTest(TestUtil::describeAsString($test), $time); + if ($hook instanceof AfterTestHook) { + $hook->executeAfterTest(TestUtil::describeAsString($test), $time); } } } diff --git a/tests/end-to-end/_files/Extension.php b/tests/end-to-end/_files/Extension.php index ea0f707083f..9b215d6eddd 100644 --- a/tests/end-to-end/_files/Extension.php +++ b/tests/end-to-end/_files/Extension.php @@ -16,11 +16,12 @@ use PHPUnit\Runner\AfterSuccessfulTestHook; use PHPUnit\Runner\AfterTestErrorHook; use PHPUnit\Runner\AfterTestFailureHook; +use PHPUnit\Runner\AfterTestHook; use PHPUnit\Runner\AfterTestWarningHook; use PHPUnit\Runner\BeforeFirstTestHook; use PHPUnit\Runner\BeforeTestHook; -final class Extension implements BeforeFirstTestHook, BeforeTestHook, AfterSuccessfulTestHook, AfterSkippedTestHook, AfterRiskyTestHook, AfterIncompleteTestHook, AfterTestErrorHook, AfterTestWarningHook, AfterTestFailureHook, AfterLastTestHook +final class Extension implements BeforeFirstTestHook, BeforeTestHook, AfterTestHook, AfterSuccessfulTestHook, AfterSkippedTestHook, AfterRiskyTestHook, AfterIncompleteTestHook, AfterTestErrorHook, AfterTestWarningHook, AfterTestFailureHook, AfterLastTestHook { private $amountOfInjectedArguments = 0; @@ -45,6 +46,11 @@ public function executeBeforeTest(string $test): void print __METHOD__ . ': ' . $test . \PHP_EOL; } + public function executeAfterTest(string $test, float $time): void + { + print __METHOD__ . ': ' . $test . \PHP_EOL; + } + public function executeAfterSuccessfulTest(string $test, float $time): void { print __METHOD__ . ': ' . $test . \PHP_EOL; diff --git a/tests/end-to-end/hooks.phpt b/tests/end-to-end/hooks.phpt index f54f7b33be0..731e9c65f1f 100644 --- a/tests/end-to-end/hooks.phpt +++ b/tests/end-to-end/hooks.phpt @@ -16,16 +16,23 @@ PHPUnit\Test\Extension::tellAmountOfInjectedArguments: %d PHPUnit\Test\Extension::executeBeforeFirstTest PHPUnit\Test\Extension::executeBeforeTest: PHPUnit\Test\HookTest::testSuccess PHPUnit\Test\Extension::executeAfterSuccessfulTest: PHPUnit\Test\HookTest::testSuccess +PHPUnit\Test\Extension::executeAfterTest: PHPUnit\Test\HookTest::testSuccess PHPUnit\Test\Extension::executeBeforeTest: PHPUnit\Test\HookTest::testFailure PHPUnit\Test\Extension::executeAfterTestFailure: PHPUnit\Test\HookTest::testFailure: Failed asserting that false is true. +PHPUnit\Test\Extension::executeAfterTest: PHPUnit\Test\HookTest::testFailure PHPUnit\Test\Extension::executeBeforeTest: PHPUnit\Test\HookTest::testError PHPUnit\Test\Extension::executeAfterTestError: PHPUnit\Test\HookTest::testError: message +PHPUnit\Test\Extension::executeAfterTest: PHPUnit\Test\HookTest::testError PHPUnit\Test\Extension::executeBeforeTest: PHPUnit\Test\HookTest::testIncomplete PHPUnit\Test\Extension::executeAfterIncompleteTest: PHPUnit\Test\HookTest::testIncomplete: message +PHPUnit\Test\Extension::executeAfterTest: PHPUnit\Test\HookTest::testIncomplete PHPUnit\Test\Extension::executeBeforeTest: PHPUnit\Test\HookTest::testRisky PHPUnit\Test\Extension::executeAfterRiskyTest: PHPUnit\Test\HookTest::testRisky: message +PHPUnit\Test\Extension::executeAfterTest: PHPUnit\Test\HookTest::testRisky PHPUnit\Test\Extension::executeBeforeTest: PHPUnit\Test\HookTest::testSkipped PHPUnit\Test\Extension::executeAfterSkippedTest: PHPUnit\Test\HookTest::testSkipped: message +PHPUnit\Test\Extension::executeAfterTest: PHPUnit\Test\HookTest::testSkipped PHPUnit\Test\Extension::executeBeforeTest: PHPUnit\Test\HookTest::testWarning PHPUnit\Test\Extension::executeAfterTestWarning: PHPUnit\Test\HookTest::testWarning: message +PHPUnit\Test\Extension::executeAfterTest: PHPUnit\Test\HookTest::testWarning PHPUnit\Test\Extension::executeAfterLastTest