# Changes in PHPUnit 13.2

All notable changes of the PHPUnit 13.2 release series are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles.

## [13.2.6] - 2026-07-28

### Fixed

* [#6861](https://github.com/sebastianbergmann/phpunit/issues/6861): Hook methods run twice when a template method is marked with its corresponding attribute
* Regression that stopped test methods from being sorted by source code location

## [13.2.5] - 2026-07-25

### Changed

* Messages for tests that are skipped because of an unsatisfied `RequiresPhp`, `RequiresPhpunit`, or `RequiresPhpExtension` version requirement now include the version that is actually being used
* Warning messages about incomplete version requirements as well as version requirements without a version comparison operator, and the error message for invalid version requirements, now include the full version requirement and explain what is expected

### Fixed

* [#6825](https://github.com/sebastianbergmann/phpunit/pull/6825): Forwarding to previous error handler can result in infinite recursion
* [#6831](https://github.com/sebastianbergmann/issues/pull/6831): PHPUnit's error handler does not respect `@` error suppression and forwards suppressed warnings to previous error handler
* [#6833](https://github.com/sebastianbergmann/phpunit/issues/6833): `assertArrayHasKey()` does not accept `ArrayAccess` implementations with a specific value type when test code is analysed with PHPStan at level 9
* [#6854](https://github.com/sebastianbergmann/phpunit/issues/6854): Deprecation triggered in first-party code is wrongly classified as indirect when the first-party code is called from third-party code
* Test classes were not sorted relative to each other when tests were ordered by duration

## [13.2.4] - 2026-07-08

### Fixed

* [#6817](https://github.com/sebastianbergmann/phpunit/issues/6817): Issue is reported even when previously registered error handler turns the error into an exception
* [#6818](https://github.com/sebastianbergmann/phpunit/issues/6818): Issue is reported when custom error handler checks `error_reporting()` output dynamically

## [13.2.3] - 2026-07-06

### Changed

* [#6797](https://github.com/sebastianbergmann/phpunit/issues/6797): Adapt code generated for test double of interface with constructor for PHP 8.6

## [13.2.2] - 2026-06-29

### Fixed

* [#6768](https://github.com/sebastianbergmann/phpunit/issues/6768): Negative priorities for hook methods are rejected by static analysis
* [#6778](https://github.com/sebastianbergmann/phpunit/issues/6778): Deprecation triggered outside of tests cannot be ignored

## [13.2.1] - 2026-06-15

### Fixed

* [#6741](https://github.com/sebastianbergmann/phpunit/issues/6741): Test is not run when `--filter` matches the name of a data set but not the name of the test method
* [#6743](https://github.com/sebastianbergmann/phpunit/issues/6743): Improve error message for invalid version constraint in attribute
* [#6744](https://github.com/sebastianbergmann/phpunit/issues/6744): Environment variable attributes reject empty-string values since PHPUnit 13.2.0

## [13.2.0] - 2026-06-05

### Added

* [#3387](https://github.com/sebastianbergmann/phpunit/issues/3387): Specify a list of tests to run
* [#4201](https://github.com/sebastianbergmann/phpunit/issues/4201): Handle interrupts and display current test results
* [#4501](https://github.com/sebastianbergmann/phpunit/issues/4501): Option to mark test as risky when it does not contribute to code coverage
* [#5757](https://github.com/sebastianbergmann/phpunit/issues/5757): Add assertions for ignoring whitespace differences in strings
* [#5810](https://github.com/sebastianbergmann/phpunit/issues/5810): Do not dump arrays and objects in failure messages of `IsTrue`, `IsFalse`, `IsNull`, `IsFinite`, `IsInfinite`, and `IsNan` constraints
* [#5838](https://github.com/sebastianbergmann/phpunit/issues/5838): Inherit `#[RunTestsInSeparateProcesses]` from parent test classes
* [#5922](https://github.com/sebastianbergmann/phpunit/issues/5922): `assertContainsEquals()` should use `sebastian/comparator` for element comparison
* [#6000](https://github.com/sebastianbergmann/phpunit/issues/6000): Report PHPT test as risky when `--SKIPIF--` does not have standard-output side effect
* [#6075](https://github.com/sebastianbergmann/phpunit/issues/6075): Support test execution order sorted by descending duration
* [#6346](https://github.com/sebastianbergmann/phpunit/issues/6346): Emit warning when conflicting CLI options are used
* [#6534](https://github.com/sebastianbergmann/phpunit/issues/6534): Make `$_dataName` available to `#[TestDoxFormatter]` callbacks
* [#6559](https://github.com/sebastianbergmann/phpunit/issues/6559): Improved API for exception message expectations
* [#6565](https://github.com/sebastianbergmann/phpunit/pull/6565): Optional `$skipWhenEmpty` parameter for `#[DataProvider]` and `#[DataProviderExternal]`
* [#6566](https://github.com/sebastianbergmann/phpunit/pull/6566): Allow `--stop-on-defect`, `--stop-on-error`, etc. to accept an optional threshold
* [#6567](https://github.com/sebastianbergmann/phpunit/issues/6567): Make diff context lines configurable
* [#6574](https://github.com/sebastianbergmann/phpunit/issues/6574): Improve `willReturnMap()` with constraint support and strict matching
* [#6575](https://github.com/sebastianbergmann/phpunit/issues/6575): `--list-test-ids` CLI option and enhance `--filter` CLI option to support test ID syntax
* [#6577](https://github.com/sebastianbergmann/phpunit/issues/6577): `--run-test-id <test-id>` CLI option that accepts a single test ID for exact matching
* [#6579](https://github.com/sebastianbergmann/phpunit/pull/6579): Properly handle issues triggered outside of tests
* [#6597](https://github.com/sebastianbergmann/phpunit/pull/6597): Compact output (activated through `--compact` CLI option and `PHPUNIT_COMPACT_OUTPUT=1` environment variable)
* [#6598](https://github.com/sebastianbergmann/phpunit/pull/6598): `--disable-coverage-targeting` CLI option
* [#6602](https://github.com/sebastianbergmann/phpunit/pull/6602): Separate configuration for branch coverage from path coverage
* [#6606](https://github.com/sebastianbergmann/phpunit/pull/6606): Support for partially ordered parameter sets in mock object expectations
* [#6611](https://github.com/sebastianbergmann/phpunit/pull/6611): Add CPU time to telemetry
* [#6681](https://github.com/sebastianbergmann/phpunit/pull/6681): Comment-aware variants of XML comparison assertions
* The `executionOrder` attribute in the XML configuration file now accepts `defects` combined with any main order, as well as three-way combinations of `depends`/`no-depends`, `defects`, and a main order (for example, `depends,defects,duration-ascending`)
* `--validate-configuration` CLI option to validate an XML configuration file for PHPUnit
* Report TestDox information in Open Test Reporting XML
* Report per-test and per-test-suite resource usage (time, memory usage, peak memory usage) in Open Test Reporting XML
* Report number of assertions performed for each test in Open Test Reporting XML
* Report structured comparison failure details (expected, actual, diff) in Open Test Reporting XML
* Report random order seed in Open Test Reporting XML when test execution order is randomised

### Changed

* [#5873](https://github.com/sebastianbergmann/phpunit/issues/5873): Chain previously registered error handler instead of silently disabling PHPUnit's error handling
* [#6535](https://github.com/sebastianbergmann/phpunit/pull/6535): Use `sebastian/file-filter` in `SourceFilter::includes()` for issue trigger identification
* [#6581](https://github.com/sebastianbergmann/phpunit/issues/6581): Allow `#[IgnoreDeprecations]` to be repeated
* [#6609](https://github.com/sebastianbergmann/phpunit/pull/6609): Skip data providers whose method cannot match `--filter`
* [#6685](https://github.com/sebastianbergmann/phpunit/pull/6685): Generate failure messages for inverse assertions by authoring negations, not by rewriting strings
* Only errors and failures are now considered for "defect first" test reordering (tests that triggered deprecations, notices, or warnings as well as incomplete, risky, and skipped tests were previous also considered)
* A warning is now emitted when closures are compared for equality using the `IsEqual`, `IsEqualCanonicalizing`, `IsEqualIgnoringCase`, `IsEqualWithDelta`, and `TraversableContainsEqual` constraints or the `assertEquals()`, `assertEqualsCanonicalizing()`, `assertEqualsIgnoringCase()`, `assertEqualsWithDelta()`, and `assertContainsEquals()` assertions

### Deprecated

* [#6075](https://github.com/sebastianbergmann/phpunit/issues/6075): `--order-by duration` CLI option, use `--order-by duration-ascending` instead
* [#6075](https://github.com/sebastianbergmann/phpunit/issues/6075): `--order-by size` CLI option, use `--order-by size-ascending` instead
* [#6075](https://github.com/sebastianbergmann/phpunit/issues/6075): `executionOrder="duration"` XML configuration attribute value, use `executionOrder="duration-ascending"` instead
* [#6075](https://github.com/sebastianbergmann/phpunit/issues/6075): `executionOrder="size"` XML configuration attribute value, use `executionOrder="size-ascending"` instead
* [#6560](https://github.com/sebastianbergmann/phpunit/issues/6560): Soft-deprecate `expectExceptionMessage()`, use `expectExceptionMessageIsOrContains()` instead

### Fixed

* [#5845](https://github.com/sebastianbergmann/phpunit/issues/5845): Error handlers registered before PHPUnit (e.g. via `auto_prepend_file`) cause false "risky test" warnings
* [#5851](https://github.com/sebastianbergmann/phpunit/issues/5851): Output buffer manipulation in tests causes incorrect capture, hangs, and silent failures
* [#6582](https://github.com/sebastianbergmann/phpunit/issues/6582): `TestSuiteSorter::cmpSize()` does not handle `TestSuite` objects for `TestCase` classes

[13.2.6]: https://github.com/sebastianbergmann/phpunit/compare/13.2.5...13.2.6
[13.2.5]: https://github.com/sebastianbergmann/phpunit/compare/13.2.4...13.2.5
[13.2.4]: https://github.com/sebastianbergmann/phpunit/compare/13.2.3...13.2.4
[13.2.3]: https://github.com/sebastianbergmann/phpunit/compare/13.2.2...13.2.3
[13.2.2]: https://github.com/sebastianbergmann/phpunit/compare/13.2.1...13.2.2
[13.2.1]: https://github.com/sebastianbergmann/phpunit/compare/13.2.0...13.2.1
[13.2.0]: https://github.com/sebastianbergmann/phpunit/compare/13.1.14...13.2.0
