pestphp/pest-plugin-stressless
A Pest plugin for finding flaky tests. Stressless runs your suite repeatedly to surface intermittent failures, reporting tests that pass and fail unpredictably so you can fix nondeterminism before it reaches CI.
Architecture fit. The plugin occupies the test-tooling layer only. It extends the Pest runner so that load scenarios are authored in the same DSL as functional tests — same factories, fixtures, auth helpers, and CI plumbing — and it is a require-dev dependency with no artifact on the build or deployment path. That is the decisive architectural fact for a TPM: adopting it cannot change what ships to a customer, so the blast radius of the decision is confined to the delivery pipeline. The v2.2.0 release ("Allows all HTTP verbs") is the planning-relevant change, because it moves addressable scope from read-path smoke load to the mutation-heavy flows where revenue and risk concentrate — signup, checkout, subscription changes, order mutation. The plugin effectively serves two goals from one dependency (concurrent HTTP load against endpoints, and repeated-suite execution to surface flaky or order-dependent tests), which simplifies the business case but also creates a nomenclature trap the team should resolve up front.
Integration feasibility. High, but gated on two organisational preconditions rather than technical ones: the suite must already be on Pest, and there must be a sanctioned, isolated, resettable non-production target to point load at. When both hold, adoption is a dependency plus a new test directory. When either fails — a PHPUnit-native suite, or no segregated environment — the effort-to-benefit ratio inverts and this is the wrong lever; look at it again after a Pest migration or after environment segregation exists.
Technical risk. Low on correctness, moderate on interpretation. The plugin cannot break production. The risks worth tracking are:
Key questions.
Stack fit. Strong for Laravel + Pest; near-zero value elsewhere. Frame adoption as an extension of skills the team already exercises daily rather than a new discipline to hire for — that framing is what keeps the planning ask small, and it is defensible precisely because there is no new DSL, runtime, or on-call surface.
Migration path. There is no production surface to migrate, so greenfield and brownfield are equally cheap: a require-dev install plus a new test directory. The real migration is procedural, and that is where the workstream lives. Three decisions must be made before the first scenario is written: where stress tests live in the repo; that they are tagged into their own Pest group and excluded from the default run; and which environment is nominated as the target. Skipping any of the three is the most common quiet failure — the suite is added, never segregated, slows CI, and gets disabled within a quarter.
Compatibility. The binding constraints are the Pest major version (the plugin tracks Pest's extension API), then PHP and Laravel. v2.2.0 is an additive minor with no indicated breaking change, but the ecosystem is small and fast-moving, so pin to a known-good minor (^2.2) rather than floating. Absent a published matrix, every Pest major upgrade is a manual checkpoint, not a routine bump. Keep a documented escape hatch — fork or vendor — so an unanswered upstream issue cannot block a release.
Sequencing.
require-dev pinned to ^2.2 on a branch; run the existing suite to confirm no interference with the default run.Maintenance. Low and bounded. The dependency is require-dev only, so there is no production runtime to patch and no deploy-time surface. The recurring cost is scenario upkeep: load tests are code and drift when endpoints, payloads, or auth contracts change, so they need an owner and a review convention or they rot into permanent red. Budget also for the compatibility checkpoint at each Pest major, which is manual work regardless of upstream health.
Support. Community-only. Expect GitHub-issue-level responsiveness, no SLA, no vendor escalation path, and an uncertain maintainer bench given the December 2023 cadence and thin adoption. Mitigate by pinning, keeping a fork/vendor path documented, and treating upstream silence as a known condition with a pre-agreed workaround rather than an escalating surprise mid-release.
Scaling. The tool scales in scenario coverage, not in load. Ceiling is one load-generating runner: CPU, memory, file descriptors, and network on the CI box saturate well before the target does, so absolute numbers become fiction as concurrency rises. Do not use it to justify infrastructure sizing, SLO targets, or capacity sign-off. When the question becomes distributed, high-volume, multi-region, or traffic-replay shaped, hand off to k6, Gatling, Locust, or JMeter — and say so in advance so nobody over-reads a green run.
Failure modes to watch.
Ramp-up. Fast for anyone already writing Pest tests — one install, one directory, one CI job, and the first scenario ships in hours, not weeks. The genuine learning curve is interpretive rather than syntactic: understanding variance, client-side saturation, and the difference between "flaky test detection" and "load characterisation." That is a short enablement artefact plus a review checklist, not a training programme. Net posture: adopt as a low-risk, developer-owned performance smoke layer for release confidence on revenue-critical flows, with the small community and stale release cadence tracked as maintenance signals rather than blockers — but never left unwatched across the next Pest major.
How can I help you explore Laravel packages today?