Skip to content

Commit b082853

Browse files
committed
Resolved test suite run in separated process executed one by one in separated process.
1 parent c42725e commit b082853

9 files changed

+450
-150
lines changed

phpunit.xml

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
<directory suffix=".phpt">tests/end-to-end/mock-objects</directory>
3030
<directory suffix=".phpt">tests/end-to-end/phpt</directory>
3131
<directory suffix=".phpt">tests/end-to-end/regression</directory>
32+
<directory suffix=".phpt">tests/end-to-end/sandbox</directory>
3233
<directory suffix=".phpt">tests/end-to-end/self-direct-indirect</directory>
3334
<directory suffix=".phpt">tests/end-to-end/testdox</directory>
3435

src/Framework/TestRunner/templates/class.tpl

+51-33
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
<?php declare(strict_types=1);
2+
use PHPUnit\Event;
23
use PHPUnit\Event\Facade;
4+
use PHPUnit\Framework\TestSuite;
35
use PHPUnit\Runner\CodeCoverage;
46
use PHPUnit\Runner\ErrorHandler;
7+
use PHPUnit\Runner\TestSuiteLoader;
58
use PHPUnit\TextUI\Configuration\Registry as ConfigurationRegistry;
69
use PHPUnit\TextUI\Configuration\CodeCoverageFilterRegistry;
710
use PHPUnit\TextUI\Configuration\PhpHandler;
@@ -31,7 +34,7 @@ if ($composerAutoload) {
3134
require $phar;
3235
}
3336

34-
function __phpunit_run_isolated_test()
37+
function __phpunit_run_isolated_class()
3538
{
3639
$dispatcher = Facade::instance()->initForIsolation(
3740
PHPUnit\Event\Telemetry\HRTime::fromSecondsAndNanoseconds(
@@ -69,52 +72,67 @@ function __phpunit_run_isolated_test()
6972

7073
ErrorHandler::instance()->useDeprecationTriggers($deprecationTriggers);
7174

72-
$test = new {className}('{name}');
75+
ini_set('xdebug.scream', '0');
7376

74-
$test->setData('{dataName}', unserialize('{data}'));
75-
$test->setDependencyInput(unserialize('{dependencyInput}'));
76-
$test->setInIsolation(true);
77+
try {
78+
$testClass = (new TestSuiteLoader)->load('{filename}');
79+
} catch (Exception $e) {
80+
print $e->getMessage() . PHP_EOL;
81+
exit(1);
82+
}
7783

78-
ob_end_clean();
84+
$output = '';
85+
$results = [];
7986

80-
$test->run();
87+
$suite = TestSuite::fromClassReflector($testClass);
88+
$suite->setIsInSeparatedProcess(false);
8189

82-
$output = '';
90+
$testSuiteValueObjectForEvents = Event\TestSuite\TestSuiteBuilder::from($suite);
8391

84-
if (!$test->expectsOutput()) {
85-
$output = $test->output();
92+
if (!$suite->invokeMethodsBeforeFirstTest(Facade::emitter(), $testSuiteValueObjectForEvents)) {
93+
return;
8694
}
8795

88-
ini_set('xdebug.scream', '0');
96+
foreach($suite->tests() as $test) {
97+
$test->setRunClassInSeparateProcess(false);
98+
$test->run();
99+
100+
$testOutput = '';
89101
90-
// Not every STDOUT target stream is rewindable
91-
@rewind(STDOUT);
102+
if (!$test->expectsOutput()) {
103+
$testOutput = $test->output();
104+
}
92105

93-
if ($stdout = @stream_get_contents(STDOUT)) {
94-
$output = $stdout . $output;
95-
$streamMetaData = stream_get_meta_data(STDOUT);
106+
// Not every STDOUT target stream is rewindable
107+
@rewind(STDOUT);
96108

97-
if (!empty($streamMetaData['stream_type']) && 'STDIO' === $streamMetaData['stream_type']) {
98-
@ftruncate(STDOUT, 0);
99-
@rewind(STDOUT);
109+
if ($stdout = @stream_get_contents(STDOUT)) {
110+
$testOutput = $stdout . $testOutput;
111+
$streamMetaData = stream_get_meta_data(STDOUT);
112+
113+
if (!empty($streamMetaData['stream_type']) && 'STDIO' === $streamMetaData['stream_type']) {
114+
@ftruncate(STDOUT, 0);
115+
@rewind(STDOUT);
116+
}
100117
}
118+
119+
$results[] = (object)[
120+
'testResult' => $test->result(),
121+
'codeCoverage' => {collectCodeCoverageInformation} ? CodeCoverage::instance()->codeCoverage() : null,
122+
'numAssertions' => $test->numberOfAssertionsPerformed(),
123+
'output' => $testOutput,
124+
'events' => $dispatcher->flush(),
125+
'passedTests' => PassedTests::instance()
126+
];
127+
128+
$output .= $testOutput;
101129
}
102130

131+
$suite->invokeMethodsAfterLastTest(Facade::emitter());
132+
103133
Facade::emitter()->testRunnerFinishedChildProcess($output, '');
104134

105-
file_put_contents(
106-
'{processResultFile}',
107-
serialize(
108-
(object)[
109-
'testResult' => $test->result(),
110-
'codeCoverage' => {collectCodeCoverageInformation} ? CodeCoverage::instance()->codeCoverage() : null,
111-
'numAssertions' => $test->numberOfAssertionsPerformed(),
112-
'output' => $output,
113-
'events' => $dispatcher->flush(),
114-
'passedTests' => PassedTests::instance()
115-
]
116-
)
117-
);
135+
file_put_contents('{processResultFile}', serialize($results));
118136
}
119137

120138
function __phpunit_error_handler($errno, $errstr, $errfile, $errline)
@@ -137,4 +155,4 @@ if ('{bootstrap}' !== '') {
137155
require_once '{bootstrap}';
138156
}
139157

140-
__phpunit_run_isolated_test();
158+
__phpunit_run_isolated_class();

0 commit comments

Comments
 (0)