Skip to content

Commit 6ab66f3

Browse files
authored
MQE-830: Output error details about test failure
- Added new extension to allow for pulling and operation on testContext at test runtime - Tests now no longer allow for exceptions in _after block to overwrite the original exception (case when test fails, runs _after and fails there too) - Tests no longer run the _after block if the test failure was in the _after block to begin
1 parent a75d1f4 commit 6ab66f3

14 files changed

+72
-18
lines changed

dev/tests/verification/Resources/ActionGroupWithDataOverrideTest.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ class ActionGroupWithDataOverrideTestCest
5757
public function _failed(AcceptanceTester $I)
5858
{
5959
$I->saveScreenshot();
60-
$this->_after($I);
6160
}
6261

6362
/**

dev/tests/verification/Resources/ActionGroupWithDataTest.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ class ActionGroupWithDataTestCest
5757
public function _failed(AcceptanceTester $I)
5858
{
5959
$I->saveScreenshot();
60-
$this->_after($I);
6160
}
6261

6362
/**

dev/tests/verification/Resources/ActionGroupWithNoDefaultTest.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ class ActionGroupWithNoDefaultTestCest
5757
public function _failed(AcceptanceTester $I)
5858
{
5959
$I->saveScreenshot();
60-
$this->_after($I);
6160
}
6261

6362
/**

dev/tests/verification/Resources/ActionGroupWithPersistedData.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ class ActionGroupWithPersistedDataCest
5757
public function _failed(AcceptanceTester $I)
5858
{
5959
$I->saveScreenshot();
60-
$this->_after($I);
6160
}
6261

6362
/**

dev/tests/verification/Resources/ActionGroupWithTopLevelPersistedData.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ class ActionGroupWithTopLevelPersistedDataCest
5757
public function _failed(AcceptanceTester $I)
5858
{
5959
$I->saveScreenshot();
60-
$this->_after($I);
6160
}
6261

6362
/**

dev/tests/verification/Resources/ArgumentWithSameNameAsElement.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ class ArgumentWithSameNameAsElementCest
5757
public function _failed(AcceptanceTester $I)
5858
{
5959
$I->saveScreenshot();
60-
$this->_after($I);
6160
}
6261

6362
/**

dev/tests/verification/Resources/BasicFunctionalTest.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ class BasicFunctionalTestCest
4646
public function _failed(AcceptanceTester $I)
4747
{
4848
$I->saveScreenshot();
49-
$this->_after($I);
5049
}
5150

5251
/**

dev/tests/verification/Resources/BasicMergeTest.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ class BasicMergeTestCest
4848
public function _failed(AcceptanceTester $I)
4949
{
5050
$I->saveScreenshot();
51-
$this->_after($I);
5251
}
5352

5453
/**

dev/tests/verification/Resources/HookActionsTest.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ class HookActionsTestCest
7373
public function _failed(AcceptanceTester $I)
7474
{
7575
$I->saveScreenshot();
76-
$this->_after($I);
7776
}
7877

7978
/**

dev/tests/verification/Resources/MergedActionGroupTest.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ class MergedActionGroupTestCest
5757
public function _failed(AcceptanceTester $I)
5858
{
5959
$I->saveScreenshot();
60-
$this->_after($I);
6160
}
6261

6362
/**

dev/tests/verification/Resources/MergedReferencesTest.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ class MergedReferencesTestCest
4646
public function _failed(AcceptanceTester $I)
4747
{
4848
$I->saveScreenshot();
49-
$this->_after($I);
5049
}
5150

5251
/**

dev/tests/verification/Resources/MultipleActionGroupsTest.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ class MultipleActionGroupsTestCest
5757
public function _failed(AcceptanceTester $I)
5858
{
5959
$I->saveScreenshot();
60-
$this->_after($I);
6160
}
6261

6362
/**
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\FunctionalTestingFramework\Extension;
8+
9+
use \Codeception\Events;
10+
11+
/**
12+
* Class TestContextExtension
13+
* @SuppressWarnings(PHPMD.UnusedPrivateField)
14+
*/
15+
class TestContextExtension extends \Codeception\Extension
16+
{
17+
const TEST_PHASE_AFTER = "_after";
18+
19+
/**
20+
* Codeception Events Mapping to methods
21+
* @var array
22+
*/
23+
public static $events = [
24+
Events::TEST_FAIL => 'testFail',
25+
];
26+
27+
/**
28+
* Codeception event listener function, triggered on test failure.
29+
* @param \Codeception\Event\FailEvent $e
30+
* @return void
31+
*/
32+
public function testFail(\Codeception\Event\FailEvent $e)
33+
{
34+
$cest = $e->getTest();
35+
$context = $this->extractContext($e->getFail()->getTrace(), $cest->getTestMethod());
36+
// Do not attempt to run _after if failure was in the _after block
37+
// Try to run _after but catch exceptions to prevent them from overwriting original failure.
38+
if ($context != TestContextExtension::TEST_PHASE_AFTER) {
39+
try {
40+
$actorClass = $e->getTest()->getMetadata()->getCurrent('actor');
41+
$I = new $actorClass($cest->getScenario());
42+
call_user_func(\Closure::bind(
43+
function () use ($cest, $I) {
44+
$cest->executeHook($I, 'after');
45+
},
46+
null,
47+
$cest
48+
));
49+
} catch (\Exception $e) {
50+
// Do not rethrow Exception
51+
}
52+
}
53+
}
54+
55+
/**
56+
* Extracts hook method from trace, looking specifically for the cest class given.
57+
* @param array $trace
58+
* @param string $class
59+
* @return string
60+
*/
61+
public function extractContext($trace, $class)
62+
{
63+
foreach ($trace as $entry) {
64+
$traceClass = $entry["class"] ?? null;
65+
if (strpos($traceClass, $class) != 0) {
66+
return $entry["function"];
67+
}
68+
}
69+
return null;
70+
}
71+
}

src/Magento/FunctionalTestingFramework/Util/TestGenerator.php

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1373,6 +1373,7 @@ private function stripAndSplitReference($reference, $delimiter)
13731373
* @return string
13741374
* @throws TestReferenceException
13751375
* @throws \Exception
1376+
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
13761377
*/
13771378
private function generateHooksPhp($hookObjects)
13781379
{
@@ -1414,12 +1415,6 @@ private function generateHooksPhp($hookObjects)
14141415
throw new TestReferenceException($e->getMessage() . " in Element \"" . $type . "\"");
14151416
}
14161417

1417-
if ($hookObject->getType() == TestObjectExtractor::TEST_FAILED_HOOK) {
1418-
$steps.="\t\t";
1419-
$steps.='$this->_after($I);';
1420-
$steps.="\n";
1421-
}
1422-
14231418
$hooks .= sprintf("\tpublic function _{$type}(%s)\n", $dependencies);
14241419
$hooks .= "\t{\n";
14251420
$hooks .= $steps;

0 commit comments

Comments
 (0)