facile-it/paraunit
Paraunit speeds up PHPUnit test suites by running tests in parallel across multiple PHPUnit processes. Built on Symfony components, it can collect coverage in parallel and supports many PHPUnit and Symfony versions. Install it via Composer as a dev dependency.
vendor/bin/paraunit run), so the decision "do we buy more CI runners or make the suite faster?" can be answered with a cheap dev-dependency trial instead of a spend increase. If the suite is class-parallelizable, wall-clock time drops roughly with core count — the same effect as sharding, without writing shard logic.vendor/bin/paraunit coverage --html=./dir, plus Clover/Cobertura/XML/text) with automatic driver selection (Pcov → Xdebug → PHPDbg) makes coverage practical on a slow suite. This directly supports decisions about coverage thresholds, coverage-diff bots, and GitLab MR coverage visualization (Cobertura output exists specifically for this).--parallel), (c) adopting Paraunit, (d) doing nothing. Paraunit is the lowest-effort option when the stack is vanilla PHPUnit on Symfony, and it keeps the existing runner and config.--exclude-testsuite, --test-suffix, --chunk-size, and --sort=random (flaky-order detection) support decisions about how many test suites to maintain and whether ordering-dependent tests are safe to combine.--stop-on-*, display-warning/deprecation options, --pass-through), the same command can be used locally and in CI — a single documented workflow rather than two.Adopt when most of these hold:
phpunit.xml (it offers to add it on first run). This is a reviewed, committed change to shared test config — treat it as a governance item, not a local tweak.Look elsewhere, or fix preconditions first, when:
--sort=random serially first, or budget time for a test-isolation cleanup as part of the adoption.ext-pcntl — the requirement was downgraded to "suggested" in 2.11.0, but validate actual behavior on your target platforms before standardizing the command.For executives (one paragraph): Our test suite is a tax on every change we ship — it slows PR review, discourages full-suite runs before merge, and makes coverage reporting expensive. Paraunit is a free, Apache-2.0, Composer-installed dev tool that runs our existing PHPUnit tests in parallel across available CPU cores, and collects coverage in parallel too. It requires no application code changes and no new infrastructure — it reuses the PHPUnit config we already have, with one small committed config addition. The ask is a timeboxed spike on one repository: measure before/after suite duration and CI minutes. If the numbers don't move, we uninstall it and lose a day. If they do, we get faster feedback and lower CI spend for the cost of a dev dependency.
For engineering leads: This is a drop-in runner (vendor/bin/paraunit run, vendor/bin/paraunit coverage --html=...), compatible with our PHPUnit 10.5.4+/11/12/13 and Symfony versions, and it mirrors PHPUnit's flags so existing muscle memory and CI scripts carry over (--stop-on-*, deprecation/warning display, --pass-through, --chunk-size). It is maintained, released regularly, and tracks new PHPUnit majors promptly. The real prerequisite is test isolation, not tooling: we must confirm classes don't share state, ports, or DB fixtures. Note it's a niche project (~145 stars, no tracked downstream dependents, single-vendor), so scope it as a replaceable developer convenience — not a platform commitment — with Paratest as the fallback comparison.
How can I help you explore Laravel packages today?