NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Packagist · #1967 most downloaded on Packagist
A set of Codeception modules to test WordPress projects.
Last release 1 months ago
26 Aug 2026
Ships fairly regularly
a new release about every 6 weeks
Most releases are documented
notes for 40 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
12 years old
422 releases · first in 2014
Unhook core icon registration after the first init in the bundled core PHPUnit suite, matching WordPress 7.1's test suite, to avoid duplicate icon reg
4.7.2
init in the bundled core PHPUnit suite, matching WordPress 7.1's test suite, to avoid duplicate icon registration errors when init re-fires (#819). (thanks @jonwaldstein)WORDPRESS_VERSION in tests/.env to a placeholder, so a new WordPress release no longer breaks them (#819).MysqlServerController now probes the configured port with a PDO handshake before starting a server: a MySQL instance reachable on the port is reused instead of racing to start (and download) a second one. Fixes parallel-run workers, whose per-worker output dirs hid the shared server's PID file (#812).parallel-run prints FAILURES! instead of OK when a worker crashes before reporting results (#812).parallel-run resolves the managed MySQL data dir through codecept_output_dir() instead of a hardcoded var/_output path that ignored paths.output overrides and broke the 103-char unix socket path limit on deep checkouts (#812).The integration suite now runs through parallel-run --workers=auto in CI, like the unit suite. Integration test classes that rebuilt an identical WordPress installation per test (the InstallationState getter tests among others) now share a per-class cached installation; duplicated tests were merged into data providers and five DB-free test files moved to the unit suite. Suite behavior and coverage are unchanged, wall time drops by several minutes per job (#815).
The unit suite is split in two: tests/unit now holds only real unit tests (no WordPress, no database, no managed services) and the new tests/integration suite holds the 33 test files that load WordPress, hit MySQL, or drive a real installation (all assertInIsolation-based WPLoader*/LoadSandbox tests included). The BuiltInServerController, ChromeDriverController and MysqlServerController extensions are now scoped via their existing suites option so codecept run unit starts no servers.
Utils\Filesystem::rrmdir() and recurseCopy() now delegate to the bundled symfony/filesystem component instead of a hand-rolled recursive delete and a cp -R/xcopy shell-out; public signatures are unchanged, and failure paths that previously threw (unreadable dir, uncreatable destination) now return false like the other failure modes (#812).
The unit test suite no longer loads php-stubs/wordpress-stubs in the main process: the few WordPress functions the fork-based tests need are shimmed in the fork child, and a minimal autoloadable wpdb double replaces the stub class. Groundwork for fork-based test isolation, where a stub-free parent process is required to load real WordPress in children (#814).
Remove dead code: the unused Module\WPLoader\Filters/FiltersGroup classes (not wired to WPLoader since v4), WordPress\FileRequests\FilePostRequest with FileRequestFactory::buildPostRequest(), the write-only FileRequest::setServerVar()/setConstant(), the decorative WordPress\CodeExecution\CodeExecutionActionInterface, Utils\Composer::allowPluginsFromPackage()/getDecodedContents(), Generators\Date::zero(), Project\TestEnvironment::$dumpFile, ManagedProcessInterface::ERR_STOP and the unreachable PHPUnit <8.0 branch of WPTestCasePHPUnitMethodsTrait (the package requires PHP ^8.0). No user-facing API is affected (#813).
Remove dead internal classes: Utils\DockerCompose, Environment\Constants, Events\EventDispatcherException, Polyfills\Dotenv\Dotenv and the WordPress\CodeExecution ExitAction/ThrowAction test doubles. No user-facing API is affected (#812).
Drop the v3.5 downgrade Rector harness (config/rector-35.php, config/composer-35.json, the RemoveTypeHinting/DowngradePhpOsFamily/SerializableThrowableCompatibilityRector rules, the bin/build-35-* build scripts, and the dead build_35 Makefile target) from master; it now lives entirely on the v3.5 branch (#810).
One column per quarter.
Refresh the bundled WordPress core PHPUnit test includes and the sqlite-database-integration plugin to their latest upstream versions ( #809 ).
4.7.1
sqlite-database-integration plugin to their latest upstream versions (#809).dev:rebuild command to build the tests/_wordpress installation used by the default configuration, e.g. on a fresh clone or in CI where it is not commi
4.7.0
dev:rebuild command to build the tests/_wordpress installation used by the default configuration, e.g. on a fresh clone or in CI where it is not committed. Documented the default self-contained setup on GitHub Actions, with an example workflow (#807).init wpbrowser records the installed WordPress version in the WORDPRESS_VERSION entry of tests/.env; dev:rebuild reuses it (override with --wp-version) so a rebuilt installation matches the version the committed dump.sql was generated from (#807).init wpbrowser (plugin and theme projects) writes a tests/_wordpress/.gitignore so the rebuildable WordPress installation is not committed; restore it with dev:rebuild (#807).init wpbrowser (plugin and theme projects) writes a tests/Support/Data/.gitignore with !dump.sql so the database fixture is committed even when a global gitignore excludes *.sql (#807).init wpbrowser set up the default-configuration admin user with the email admin@exmaple.com; it now uses admin@example.com (#807).dev.mysql.com's CDN started blocking the custom user agent, so the downloader now sends a curl/<version> user agent that is allowed through (#808).wpexport from a SQLite installation no longer truncates values containing NUL bytes (e.g. serialized objects with protected/private properties): table
4.6.1
wp:db:export from a SQLite installation no longer truncates values containing NUL bytes (e.g. serialized objects with protected/private properties): table rows are read with each column cast to BLOB so the SQLite3 extension does not stop at the first NUL byte, and the full value is hex-encoded into the dump.Replace the bundled lucatume\WPBrowser\Opis\Closure\* library with lucatume\WPBrowser\Utils\Packer and lucatume\WPBrowser\Utils\PackedClosure for clos
4.6.0
lucatume\WPBrowser\Opis\Closure\* library with lucatume\WPBrowser\Utils\Packer and lucatume\WPBrowser\Utils\PackedClosure for closure serialization in the IPC pipeline.includes/opis/closure/ library and its lucatume\WPBrowser\Opis\Closure\ PSR-4 autoload entry.wp:db:export from a SQLite installation no longer produces a non-importable dump: values are hex-encoded instead of a char(10) concatenation chain that overflowed SQLite's expression-depth limit on values with many newlines (#802).FileRequest binds the $menu, $submenu and $compat admin-menu globals to the global scope before loading the target file, so WordPress 7.0's admin bootstrap does not run uksort() on a null $menu (#804).lucatume\WPBrowser\Opis\Closure\* namespace is no longer autoloaded. None of its classes were part of the documented public API but the namespace was reachable via PSR-4; any consumer that imported or extended them must migrate to lucatume\WPBrowser\Utils\PackedClosure.--classmap-authoritative Composer installs must run composer install after upgrading to drop the stale classmap entries.Doc-block of wpimport command (thanks @sc0ttkclark ).
StubClassFactory issue where mocking of internal classes would incorrectly detect optional constructor parameters.
4.5.14
StubClassFactory issue where mocking of internal classes would incorrectly detect optional constructor parameters.Update Core PHPUnit test suite to latest version.
2.2.16 to version 2.2.17Snapshot resolved config in WPFilesystem::_initialize() to preserve absolute paths across tests when _resetConfig() or _reconfigure() is called.
WPFilesystem::_initialize() to preserve absolute paths across tests when _resetConfig() or _reconfigure() is called.Guard setAccessible() Reflection method calls with a PHP_VERSION_ID check to skip the no-op call on PHP >= 8.1. (thanks @BrianHenryIE)
setAccessible() Reflection method calls with a PHP_VERSION_ID check to skip the no-op call on PHP >= 8.1. (thanks @BrianHenryIE)2.2.14 to version 2.2.16Wording in the default EndToEnd suite configuration files to reflect the nature of the suite.
Anticipate plugins activation and loading in the WPLoader module to ensure pluggable functions overridden in plugins will correctly apply.
WPLoader module to ensure pluggable functions overridden in plugins will correctly apply.Fixed DB_PASSWORD constant not being defined when dbPassword configuration parameter is set to an empty string in WPLoader module, fixes #786.
DB_PASSWORD constant not being defined when dbPassword configuration parameter is set to an empty string in WPLoader module, fixes #786.Updated activatePlugin and deactivatePlugin methods in WPBrowser and WPWebDriver modules to reload the plugins page after activation.
activatePlugin and deactivatePlugin methods in WPBrowser and WPWebDriver modules to reload the plugins page after activation.Updated activatePlugin and deactivatePlugin methods in WPBrowser and WPWebDriver modules to use WordPress 6.5+ compatible selectors.
activatePlugin and deactivatePlugin methods in WPBrowser and WPWebDriver modules to use WordPress 6.5+ compatible selectors.Better WPLoader module output in exceptions (thanks @BrianHenryIE).
WPLoader module output in exceptions (thanks @BrianHenryIE).Restored support for the allow-root configuration parameter in the WPCLI module.
allow-root configuration parameter in the WPCLI module.Extensions event subscription to avoid type issues with newer PHP versions.
The WPLoader module will now attempt resolving the WP_CONTENT_DIR, WP_PLUGIN_DIR, WPMU_PLUGIN_DIR and pluginsFolder configuration parameters from the
WPLoader module will now attempt resolving the WP_CONTENT_DIR, WP_PLUGIN_DIR, WPMU_PLUGIN_DIR and
pluginsFolder configuration parameters from the Codeception root directory if not possible to resolve them from the
current working directory. (thanks @BrianHenryIE)Correctly serialize and unserialize options in the SQLite database implementation.
Symlinker extension issue where the target link path would be built incorrectly.Support symfony/process and symfony/filesystem version >=7.0.
symfony/process and symfony/filesystem version >=7.0.<=12.0.0.Avoid duplicated definition issue in GenerateWPUnit command.
GenerateWPUnit command.Ensure plugin activation is respected indifferent of plugins that might deactivate others during activation.
Support for PHP 8.4. (thanks @kagg-design)
Check the PID file for the PHP built-in server, MySQL and Chromedriver controllers to make sure the PID maps to an actually running process.
Nothing published for this version
Support custom binaries for WP-CLI in the WPCLI module.
WPCLI module.In WPDb module look up the WPFilesystem module with and without leading slash.
WPDb module look up the WPFilesystem module with and without leading slash.Fallback for missing $_composer_autoload_path file. (thanks @andronocean)
$_composer_autoload_path file. (thanks @andronocean)Improve LoadSandbox error and messaging (used by the WPLoader module when loadOnly: true) around Codeception early exits. (thanks @andronocean)
LoadSandbox error and messaging (used by the WPLoader module when loadOnly: true) around Codeception
early exits. (thanks @andronocean)Set proper WPTetCase::factory() return type, so IDE autocompletion works (thanks @defunctl).
WPTetCase::factory() return type, so IDE autocompletion works (thanks @defunctl).Ensure the WPLoader module will set the db constants when in loadOnly: true mode.
WPLoader module will set the db constants when in loadOnly: true mode.WPLoader module will now set the WPBROWSER_LOAD_ONLY environment variable to 1 when in loadOnly: true and
to 0 when in loadOnly: false mode.WPLoader module to explicitly state that the configFlile parameter will be used both
when in loadOnly: true and loadOnly: false modes.Doc-block namespace in the WPRestApiTestCase class, thanks @TimothyBJacobs.
WPRestApiTestCase class, thanks @TimothyBJacobs.mysql command output in the MysqlServerController information output.
mysql command output in the MysqlServerController information output.The MysqlServerController extension.
MysqlServerController extension.WPLoader module will initialize correctly when used in loadOnly mode not using the
EventDispatcherBridge extension. (thanks @lxbdr)wpdb class from either the class-wpdb.php file or the wp-db.php one, supporting older
versions of WordPress (thanks @BrianHenryIE)WPLoader configuration parameters correctly.WPTestCase class, remove attachments created during tests between tests.Updated documentation entry in EndToEnd suite bootstrap file.
Re-added the Symlinker extension to allow for the symlinking of plugins and themes in place during tests.
Symlinker extension to allow for the symlinking of plugins and themes in place during tests.Symlinker extension.Disable strict connection ID check for SQLite databases to avoid errors in tests.
Better messaging when throwing due to disconnected database.
WPLoader::beStrictAboutWpdbConnectionId configuration parameter, defaults to true, to throw if db
connection changes during setup before class.Throw on disconnected db in WPTestCase::setUpBeforeClass, iterates over the fix for #720.
WPTestCase::setUpBeforeClass, iterates over the fix for #720.Allow plugins to be loaded from arbitrary absolute or relative paths in the WPLoader module.
WPLoader module.WPLoader module.theme configuration parameter in the WPLoader module to define
[parent-theme, child-theme] pairs.Avoid calling wpdb::db_connect() twice during WPLoader bootstrap. (thanks @calvinalkan)
wpdb::db_connect() twice during WPLoader bootstrap. (thanks @calvinalkan)Updated sqlite-integration-plugin and Core PHPUnit suite files.
sqlite-integration-plugin and Core PHPUnit suite files.Fix non standard installation handling, hello Bedrock!
Load WordPress at SUITE_BEFORE in the WPLoader module, I had previously changed this to SUITE_INIT but that was causing issues.
SUITE_BEFORE in the WPLoader module, I had previously changed this to SUITE_INIT but that was
causing issues.Update init template to scaffold dump file path and example tests correctly (thanks @tarecord).
The AirplaneMode module, based on the norcross/airplane-mode plugin, to put the website under test in "airplane mode", preventing it from making any n
AirplaneMode module, based on the norcross/airplane-mode plugin, to put the website under test in "airplane
mode", preventing it from making any network requests during tests.lucatume\WPBrowser\Traits\UopzFunctions trait to provide a set of functions to work with the uopz extension; see the documentation for more details.
lucatume\WPBrowser\Traits\UopzFunctions trait to provide a set of functions to work with the uopz extension; see
the documentation for more details.Disable MU update routine in CLI router to speed up test execution.
Replace ifsnop/mysqldump-php with druidfi/mysqldump-php for better performance (thanks @staabm).
ifsnop/mysqldump-php with druidfi/mysqldump-php for better performance (thanks @staabm).The WPTestCase class will not backup globals and static attributes by default. Version 3 of wp-browser did not backup globals and static attributes by
WPTestCase class will not backup globals and static attributes by default. Version 3 of wp-browser did not
backup globals and static attributes by default, this change in version 4 is aligned with that behaviour to ease
migration from version 3 to version 4.@runInSeparateProcess annotation for test methods. Along with it, improved support for the
@dataProvider annotation for test methods used in conjunction with the @runInSeparateProcess annotation to run
data provider methods at most once.runTestsInSeparateProcesses annotation for test classes; supporting the @dataProvider
annotation ro run data provider methods at most once.#[RunInSeparateProcess] attribute for test methods and the #[RunTestsInSeparateProcesses]
attribute for test classes.Search more paths for Chrome binaries on linux (#694, thanks to @iateadonut)
Print file and line of failure during setup of plugin project, (#694, thanks to @iateadonut)
Updated Core PHPUnit test code from wordpress/wordpress-develop.
wordpress/wordpress-develop.sqlite-database-integration plugin.Improve messaging and documentation around initialization and setup.
Improve router script to speed up localhost server.
Update the Core PHPUnit test suite to the latest version.
The WPLoader::silentlyActivatePlugins configuration parameter to activate plugins without firing the activated_plugin action.
WPLoader::silentlyActivatePlugins configuration parameter to activate plugins without firing the
activated_plugin action.The WPLoader::skipInstall configuration parameter to skip the WordPress installation when already installed.
WPLoader::skipInstall configuration parameter to skip the WordPress installation when already installed.Updated Core PHPUnit test suite
Your coding agent can read these notes before it upgrades. Set up the MCP server →