chore: moves to phpunit 13.2

This commit is contained in:
nuno maduro
2026-07-07 13:40:02 +01:00
parent 72ab506d7b
commit 33e3bf2888
9 changed files with 81 additions and 27 deletions
+2 -2
View File
@@ -25,12 +25,12 @@
"pestphp/pest-plugin-arch": "^5.0.0", "pestphp/pest-plugin-arch": "^5.0.0",
"pestphp/pest-plugin-mutate": "^5.0.0", "pestphp/pest-plugin-mutate": "^5.0.0",
"pestphp/pest-plugin-profanity": "^5.0.0", "pestphp/pest-plugin-profanity": "^5.0.0",
"phpunit/phpunit": "^13.1.8", "phpunit/phpunit": "^13.2.3",
"symfony/process": "^8.1.0" "symfony/process": "^8.1.0"
}, },
"conflict": { "conflict": {
"filp/whoops": "<2.18.3", "filp/whoops": "<2.18.3",
"phpunit/phpunit": ">13.1.8", "phpunit/phpunit": ">13.2.3",
"sebastian/exporter": "<7.0.0", "sebastian/exporter": "<7.0.0",
"webmozart/assert": "<1.11.0" "webmozart/assert": "<1.11.0"
}, },
+18 -8
View File
@@ -23,6 +23,8 @@ use PHPUnit\Framework\Attributes\PostCondition;
use PHPUnit\Framework\IncompleteTest; use PHPUnit\Framework\IncompleteTest;
use PHPUnit\Framework\SkippedTest; use PHPUnit\Framework\SkippedTest;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\TestCase\ExceptionExpectation;
use PHPUnit\Framework\TestCase\OutputBuffer;
use ReflectionException; use ReflectionException;
use ReflectionFunction; use ReflectionFunction;
use ReflectionParameter; use ReflectionParameter;
@@ -431,15 +433,15 @@ trait Testable
unset($this->{$property}); unset($this->{$property});
} }
$hasOutputExpectation = Closure::bind(fn (): bool => is_string($this->outputExpectedString) || is_string($this->outputExpectedRegex), $this, TestCase::class)(); $outputBuffer = Closure::bind(fn () => $this->outputBuffer, $this, TestCase::class)();
if ($hasOutputExpectation) { if ($outputBuffer->hasExpectation()) {
ob_clean(); ob_clean();
Closure::bind(function (): void { Closure::bind(function (): void {
$this->outputExpectedString = null; $this->expectedString = null;
$this->outputExpectedRegex = null; $this->expectedRegularExpression = null;
}, $this, TestCase::class)(); }, $outputBuffer, OutputBuffer::class)();
} }
$this->setUp(); $this->setUp();
@@ -455,7 +457,9 @@ trait Testable
*/ */
private function __isExpectedException(Throwable $e): bool private function __isExpectedException(Throwable $e): bool
{ {
$read = fn (string $property): mixed => Closure::bind(fn () => $this->{$property}, $this, TestCase::class)(); $expectation = Closure::bind(fn () => $this->exceptionExpectation, $this, TestCase::class)();
$read = fn (string $property): mixed => Closure::bind(fn () => $this->{$property}, $expectation, ExceptionExpectation::class)();
$expectedClass = $read('expectedException'); $expectedClass = $read('expectedException');
@@ -463,13 +467,19 @@ trait Testable
return $e instanceof $expectedClass; return $e instanceof $expectedClass;
} }
$expectedMessage = $read('expectedExceptionMessage'); $expectedMessage = $read('expectedMessage');
if ($expectedMessage !== null) { if ($expectedMessage !== null) {
return str_contains($e->getMessage(), (string) $expectedMessage); return str_contains($e->getMessage(), (string) $expectedMessage);
} }
$expectedCode = $read('expectedExceptionCode'); $expectedMessageRegex = $read('expectedMessageRegularExpression');
if ($expectedMessageRegex !== null) {
return preg_match($expectedMessageRegex, $e->getMessage()) === 1;
}
$expectedCode = $read('expectedCode');
if ($expectedCode !== null) { if ($expectedCode !== null) {
return $e->getCode() === $expectedCode; return $e->getCode() === $expectedCode;
+2 -2
View File
@@ -576,7 +576,7 @@ final readonly class OppositeExpectation
return Targeted::make( return Targeted::make(
$original, $original,
fn (ObjectDescription $object): bool => array_all($traits, fn (string $trait): bool => ! (isset($object->reflectionClass) && in_array($trait, $object->reflectionClass->getTraitNames(), true))), fn (ObjectDescription $object): bool => array_all($traits, fn (string $trait): bool => ! isset($object->reflectionClass) || ! in_array($trait, $object->reflectionClass->getTraitNames(), true)),
"not to use traits '".implode("', '", $traits)."'", "not to use traits '".implode("', '", $traits)."'",
FileLineFinder::where(fn (string $line): bool => str_contains($line, 'class')), FileLineFinder::where(fn (string $line): bool => str_contains($line, 'class')),
); );
@@ -596,7 +596,7 @@ final readonly class OppositeExpectation
return Targeted::make( return Targeted::make(
$original, $original,
fn (ObjectDescription $object): bool => array_all($interfaces, fn (string $interface): bool => ! (isset($object->reflectionClass) && $object->reflectionClass->implementsInterface($interface))), fn (ObjectDescription $object): bool => array_all($interfaces, fn (string $interface): bool => ! isset($object->reflectionClass) || ! $object->reflectionClass->implementsInterface($interface)),
"not to implement '".implode("', '", $interfaces)."'", "not to implement '".implode("', '", $interfaces)."'",
FileLineFinder::where(fn (string $line): bool => str_contains($line, 'class')), FileLineFinder::where(fn (string $line): bool => str_contains($line, 'class')),
); );
+6
View File
@@ -241,6 +241,12 @@ final class TeamCityLogger
$telemetry->memoryUsageSinceStart(), $telemetry->memoryUsageSinceStart(),
$telemetry->durationSincePrevious(), $telemetry->durationSincePrevious(),
$telemetry->memoryUsageSincePrevious(), $telemetry->memoryUsageSincePrevious(),
$telemetry->userCpuTimeSinceStart(),
$telemetry->systemCpuTimeSinceStart(),
$telemetry->totalCpuTimeSinceStart(),
$telemetry->userCpuTimeSincePrevious(),
$telemetry->systemCpuTimeSincePrevious(),
$telemetry->totalCpuTimeSincePrevious(),
); );
} }
+1 -1
View File
@@ -50,7 +50,7 @@ final class Cache implements HandlesArguments
} }
} }
if (! $this->hasArgument('--parallel', $arguments)) { if (! $this->hasArgument('--parallel', $arguments) && ! $this->hasArgument('--do-not-cache-result', $arguments) && ! $this->hasArgument('--cache-result', $arguments)) {
return $this->pushArgument('--cache-result', $arguments); return $this->pushArgument('--cache-result', $arguments);
} }
@@ -349,6 +349,20 @@ final class WrapperRunner implements RunnerInterface
// @phpstan-ignore-next-line // @phpstan-ignore-next-line
array_merge_recursive($testResultSum->testRunnerTriggeredWarningEvents(), $testResult->testRunnerTriggeredWarningEvents()), array_merge_recursive($testResultSum->testRunnerTriggeredWarningEvents(), $testResult->testRunnerTriggeredWarningEvents()),
// @phpstan-ignore-next-line // @phpstan-ignore-next-line
array_merge_recursive($testResultSum->testRunnerTriggeredIssueDeprecationEvents(), $testResult->testRunnerTriggeredIssueDeprecationEvents()),
// @phpstan-ignore-next-line
array_merge_recursive($testResultSum->testRunnerTriggeredIssueErrorEvents(), $testResult->testRunnerTriggeredIssueErrorEvents()),
// @phpstan-ignore-next-line
array_merge_recursive($testResultSum->testRunnerTriggeredIssueNoticeEvents(), $testResult->testRunnerTriggeredIssueNoticeEvents()),
// @phpstan-ignore-next-line
array_merge_recursive($testResultSum->testRunnerTriggeredIssuePhpDeprecationEvents(), $testResult->testRunnerTriggeredIssuePhpDeprecationEvents()),
// @phpstan-ignore-next-line
array_merge_recursive($testResultSum->testRunnerTriggeredIssuePhpNoticeEvents(), $testResult->testRunnerTriggeredIssuePhpNoticeEvents()),
// @phpstan-ignore-next-line
array_merge_recursive($testResultSum->testRunnerTriggeredIssuePhpWarningEvents(), $testResult->testRunnerTriggeredIssuePhpWarningEvents()),
// @phpstan-ignore-next-line
array_merge_recursive($testResultSum->testRunnerTriggeredIssueWarningEvents(), $testResult->testRunnerTriggeredIssueWarningEvents()),
// @phpstan-ignore-next-line
array_merge_recursive($testResultSum->errors(), $testResult->errors()), array_merge_recursive($testResultSum->errors(), $testResult->errors()),
// @phpstan-ignore-next-line // @phpstan-ignore-next-line
array_merge_recursive($testResultSum->deprecations(), $testResult->deprecations()), array_merge_recursive($testResultSum->deprecations(), $testResult->deprecations()),
@@ -386,6 +400,13 @@ final class WrapperRunner implements RunnerInterface
$testResultSum->testRunnerTriggeredWarningEvents(), $testResultSum->testRunnerTriggeredWarningEvents(),
fn (WarningTriggered $event): bool => ! str_contains($event->message(), 'No tests found') fn (WarningTriggered $event): bool => ! str_contains($event->message(), 'No tests found')
)), )),
$testResultSum->testRunnerTriggeredIssueDeprecationEvents(),
$testResultSum->testRunnerTriggeredIssueErrorEvents(),
$testResultSum->testRunnerTriggeredIssueNoticeEvents(),
$testResultSum->testRunnerTriggeredIssuePhpDeprecationEvents(),
$testResultSum->testRunnerTriggeredIssuePhpNoticeEvents(),
$testResultSum->testRunnerTriggeredIssuePhpWarningEvents(),
$testResultSum->testRunnerTriggeredIssueWarningEvents(),
$testResultSum->errors(), $testResultSum->errors(),
$testResultSum->deprecations(), $testResultSum->deprecations(),
$testResultSum->notices(), $testResultSum->notices(),
@@ -7,6 +7,7 @@ namespace Pest\Plugins\Parallel\Support;
use NunoMaduro\Collision\Adapters\Phpunit\State; use NunoMaduro\Collision\Adapters\Phpunit\State;
use NunoMaduro\Collision\Adapters\Phpunit\Style; use NunoMaduro\Collision\Adapters\Phpunit\Style;
use ParaTest\Options; use ParaTest\Options;
use PHPUnit\Event\Telemetry\CpuTime;
use PHPUnit\Event\Telemetry\GarbageCollectorStatus; use PHPUnit\Event\Telemetry\GarbageCollectorStatus;
use PHPUnit\Event\Telemetry\HRTime; use PHPUnit\Event\Telemetry\HRTime;
use PHPUnit\Event\Telemetry\Info; use PHPUnit\Event\Telemetry\Info;
@@ -147,11 +148,20 @@ final class CompactPrinter
MemoryUsage::fromBytes(0), MemoryUsage::fromBytes(0),
MemoryUsage::fromBytes(0), MemoryUsage::fromBytes(0),
$garbageCollectorStatus, $garbageCollectorStatus,
CpuTime::fromSecondsAndNanoseconds(0, 0),
CpuTime::fromSecondsAndNanoseconds(0, 0),
CpuTime::fromSecondsAndNanoseconds(0, 0),
), ),
$telemetryDuration, $telemetryDuration,
MemoryUsage::fromBytes(0), MemoryUsage::fromBytes(0),
\PHPUnit\Event\Telemetry\Duration::fromSecondsAndNanoseconds(0, 0), \PHPUnit\Event\Telemetry\Duration::fromSecondsAndNanoseconds(0, 0),
MemoryUsage::fromBytes(0), MemoryUsage::fromBytes(0),
CpuTime::fromSecondsAndNanoseconds(0, 0),
CpuTime::fromSecondsAndNanoseconds(0, 0),
CpuTime::fromSecondsAndNanoseconds(0, 0),
CpuTime::fromSecondsAndNanoseconds(0, 0),
CpuTime::fromSecondsAndNanoseconds(0, 0),
CpuTime::fromSecondsAndNanoseconds(0, 0),
); );
$this->style->writeRecap($state, $telemetry, $testResult); $this->style->writeRecap($state, $telemetry, $testResult);
+1 -3
View File
@@ -47,9 +47,7 @@ final readonly class TestPaths
$suffix = $directory->suffix(); $suffix = $directory->suffix();
if ($suffix !== '') { $suffixes[] = str_starts_with($suffix, '.') ? $suffix : '.'.$suffix;
$suffixes[] = str_starts_with($suffix, '.') ? $suffix : '.'.$suffix;
}
} }
foreach ($suite->files() as $file) { foreach ($suite->files() as $file) {
@@ -15,6 +15,7 @@
--cache-directory [dir] ............................ Specify cache directory --cache-directory [dir] ............................ Specify cache directory
--generate-configuration Generate configuration file with suggested settings --generate-configuration Generate configuration file with suggested settings
--migrate-configuration ....... Migrate configuration file to current format --migrate-configuration ....... Migrate configuration file to current format
--validate-configuration ................... Validate XML configuration file
--generate-baseline [file] .................... Generate baseline for issues --generate-baseline [file] .................... Generate baseline for issues
--use-baseline [file] ........................ Use baseline to ignore issues --use-baseline [file] ........................ Use baseline to ignore issues
--ignore-baseline ..................... Do not use baseline to ignore issues --ignore-baseline ..................... Do not use baseline to ignore issues
@@ -40,12 +41,15 @@
--uses [name] ..................... Only run tests that intend to use [name] --uses [name] ..................... Only run tests that intend to use [name]
--requires-php-extension [name] Only run tests that require PHP extension [name] --requires-php-extension [name] Only run tests that require PHP extension [name]
--list-test-files ................................ List available test files --list-test-files ................................ List available test files
--list-test-ids ........................... List available tests as test IDs
--list-tests .......................................... List available tests --list-tests .......................................... List available tests
--list-tests-xml [file] ................. List available tests in XML format --list-tests-xml [file] ................. List available tests in XML format
--filter [pattern] ............................... Filter which tests to run --filter [pattern] ............................... Filter which tests to run
--exclude-filter [pattern] .. Exclude tests for the specified filter pattern --exclude-filter [pattern] .. Exclude tests for the specified filter pattern
--test-suffix [suffixes] Only search for test in files with specified suffix(es). Default: Test.php,.phpt --test-suffix [suffixes] Only search for test in files with specified suffix(es). Default: Test.php,.phpt
--test-files-file [file] Only run test files listed in file (one file by line) --test-files-file [file] Only run test files listed in file (one file by line)
--run-test-id [test-id] Only run the test identified by the specified test ID
--test-id-filter-file [file] Only run tests listed by test ID in file (one test ID per line)
EXECUTION OPTIONS: EXECUTION OPTIONS:
--parallel ........................................... Run tests in parallel --parallel ........................................... Run tests in parallel
@@ -54,20 +58,21 @@
--globals-backup ................. Backup and restore $GLOBALS for each test --globals-backup ................. Backup and restore $GLOBALS for each test
--static-backup ......... Backup and restore static properties for each test --static-backup ......... Backup and restore static properties for each test
--strict-coverage ................... Be strict about code coverage metadata --strict-coverage ................... Be strict about code coverage metadata
--require-coverage-contribution Be strict about tests that do not contribute to code coverage
--strict-global-state .............. Be strict about changes to global state --strict-global-state .............. Be strict about changes to global state
--disallow-test-output ................. Be strict about output during tests --disallow-test-output ................. Be strict about output during tests
--enforce-time-limit ................. Enforce time limit based on test size --enforce-time-limit ................. Enforce time limit based on test size
--default-time-limit [sec] Timeout in seconds for tests that have no declared size --default-time-limit [sec] Timeout in seconds for tests that have no declared size
--do-not-report-useless-tests Do not report tests that do not test anything --do-not-report-useless-tests Do not report tests that do not test anything
--stop-on-defect ... Stop after first error, failure, warning, or risky test --stop-on-defect[=[n]] Stop after first (or n-th) error, failure, warning, or risky test
--stop-on-error ..................................... Stop after first error --stop-on-error[=[n]] ..................... Stop after first (or n-th) error
--stop-on-failure ................................. Stop after first failure --stop-on-failure[=[n]] ................. Stop after first (or n-th) failure
--stop-on-warning ................................. Stop after first warning --stop-on-warning[=[n]] ................. Stop after first (or n-th) warning
--stop-on-risky ................................ Stop after first risky test --stop-on-risky[=[n]] ................ Stop after first (or n-th) risky test
--stop-on-deprecation ... Stop after first test that triggered a deprecation --stop-on-deprecation[=[n]] Stop after first (or n-th) test that triggered a deprecation
--stop-on-notice ............. Stop after first test that triggered a notice --stop-on-notice[=[n]] Stop after first (or n-th) test that triggered a notice
--stop-on-skipped ............................ Stop after first skipped test --stop-on-skipped[=[n]] ............ Stop after first (or n-th) skipped test
--stop-on-incomplete ...................... Stop after first incomplete test --stop-on-incomplete[=[n]] ...... Stop after first (or n-th) incomplete test
--fail-on-empty-test-suite Signal failure using shell exit code when no tests were run --fail-on-empty-test-suite Signal failure using shell exit code when no tests were run
--fail-on-warning Signal failure using shell exit code when a warning was triggered --fail-on-warning Signal failure using shell exit code when a warning was triggered
--fail-on-risky Signal failure using shell exit code when a test was considered risky --fail-on-risky Signal failure using shell exit code when a test was considered risky
@@ -91,7 +96,7 @@
--do-not-fail-on-incomplete Do not signal failure using shell exit code when a test was marked incomplete --do-not-fail-on-incomplete Do not signal failure using shell exit code when a test was marked incomplete
--cache-result ............................ Write test results to cache file --cache-result ............................ Write test results to cache file
--do-not-cache-result .............. Do not write test results to cache file --do-not-cache-result .............. Do not write test results to cache file
--order-by [order] Run tests in order: default|defects|depends|duration|no-depends|random|reverse|size --order-by [order] Run tests in order: default|defects|depends|duration-ascending|duration-descending|no-depends|random|reverse|size-ascending|size-descending
--resolve-dependencies ...................... Alias for "--order-by depends" --resolve-dependencies ...................... Alias for "--order-by depends"
--ignore-dependencies .................... Alias for "--order-by no-depends" --ignore-dependencies .................... Alias for "--order-by no-depends"
--random-order ............................... Alias for "--order-by random" --random-order ............................... Alias for "--order-by random"
@@ -102,6 +107,7 @@
--colors=[flag] ......... Use colors in output ("never", "auto" or "always") --colors=[flag] ......... Use colors in output ("never", "auto" or "always")
--columns [n] ................. Number of columns to use for progress output --columns [n] ................. Number of columns to use for progress output
--columns max ............ Use maximum number of columns for progress output --columns max ............ Use maximum number of columns for progress output
--diff-context [n] Number of context lines shown around changes in diffs (default: 3)
--stderr ................................. Write to STDERR instead of STDOUT --stderr ................................. Write to STDERR instead of STDOUT
--no-progress .................... Disable output of test execution progress --no-progress .................... Disable output of test execution progress
--no-results ................................ Disable output of test results --no-results ................................ Disable output of test results
@@ -116,6 +122,7 @@
--display-warnings ......... Display details for warnings triggered by tests --display-warnings ......... Display details for warnings triggered by tests
--display-all-issues ..... Display details for all issues that are triggered --display-all-issues ..... Display details for all issues that are triggered
--reverse-list .............................. Print defects in reverse order --reverse-list .............................. Print defects in reverse order
--compact ... Replace default progress and result output with compact format
--teamcity . Replace default progress and result output with TeamCity format --teamcity . Replace default progress and result output with TeamCity format
--testdox ................ Replace default result output with TestDox format --testdox ................ Replace default result output with TestDox format
--testdox-summary Repeat TestDox output for tests with errors, failures, or issues --testdox-summary Repeat TestDox output for tests with errors, failures, or issues
@@ -152,8 +159,10 @@
--exclude-source-from-xml-coverage Exclude [source] element from code coverage report in XML format --exclude-source-from-xml-coverage Exclude [source] element from code coverage report in XML format
--warm-coverage-cache ........................... Warm static analysis cache --warm-coverage-cache ........................... Warm static analysis cache
--coverage-filter [dir] ........... Include [dir] in code coverage reporting --coverage-filter [dir] ........... Include [dir] in code coverage reporting
--path-coverage .......... Report path coverage in addition to line coverage --branch-coverage ...... Report branch coverage in addition to line coverage
--path-coverage ... Report path coverage in addition to line/branch coverage
--disable-coverage-ignore ...... Disable metadata for ignoring code coverage --disable-coverage-ignore ...... Disable metadata for ignoring code coverage
--disable-coverage-targeting .. Disable metadata for code coverage targeting
--no-coverage Ignore code coverage reporting configured in the XML configuration file --no-coverage Ignore code coverage reporting configured in the XML configuration file
AI OPTIONS: AI OPTIONS: