studio-design/openapi-contract-testing
Validate Laravel/PHP API responses and requests against your OpenAPI spec with contract tests that catch breaking changes early. Supports schema validation, status codes, and CI-friendly assertions.
Contract namespace, #608). Choose this if the spec is authoritative; keep Pact-style broker workflows if you need provider publishing and can-i-deploy semantics.coverage:merge and coverage:gate now default from gesso.php via --config (#626). A single checked-in config makes "blocking gate" operationally viable — that promotion is a policy decision the tool now supports.--format and --output-file on every subcommand (#620) means results feed PR annotations and dashboards without wrapper scripts.doctor --emit-config (#627), shared PHPUnit/Laravel configuration (#593), and config-driven spec lists and route parity exclusions (#621) turn migration into a config exercise. This should revise downward any effort estimate in a "standardize on one tool" proposal.--parallel orchestrator fix (#599) are the items that determine whether a large suite keeps growing in one repo or gets fragmented across packages.explode, part headers (#619), body boundary preservation (#566), and the JSON {} vs [] decoding fix (#561) are false-positive/false-negative corrections. Whether the gate can be a release blocker depends on this class of bug being rare.Consider it when:
Look elsewhere when:
Caveats to carry into adoption:
Contract and keeps Fuzz as a deprecated alias. Non-breaking today; schedule the rename now.gesso.php as the single config source shared by PHPUnit and Laravel. Partial adoption works but forfeits most of the setup-cost win.gesso.php as versioned infrastructure, not incidental config.Executives. gesso is a contract-testing layer for our PHP services: it checks our HTTP APIs against their published spec inside the test suite we already run, and gives us a pass/fail gate in CI. The case is risk and cost, not features. It catches breaking API changes before customers do, and with the consumer-side fakes in this release it lets us verify service-to-service contracts without standing up full provider environments in staging — a direct reduction in integration-environment spend and in lead time to ship a change. Cost of trying it is low: doctor --emit-config generates a starting configuration, and that config is shared with existing PHPUnit setup, so this is a scoped pilot rather than a platform migration.
Engineering leads. The pitch is less bespoke glue. One config file drives spec lists, route parity exclusions, coverage merge, and the gate; every subcommand emits machine-readable output for CI annotations. Validation now handles form encoding, multipart boundaries, and the JSON {} vs [] trap correctly, so the gate produces few false alarms. Symfony and PSR-7 adapters inherit shared policy config, so a mixed PHP estate can standardize on one tool. One thing to plan for: the Fuzz alias is deprecated in favor of Contract — file the rename now, while it is a search-and-replace.
The ask. Approve a one-sprint pilot on one service plus one of its consumers: instrument, run the gate in advisory mode on a non-critical pipeline, then promote to blocking if the signal is clean. Success criteria: zero false-positive gate failures across ten releases, and one consumer contract test running with no provider environment.
How can I help you explore Laravel packages today?