open-dxp/test-foundation
A testing foundation for Laravel packages, offering base test cases, helper traits, and sensible defaults that bootstrap PHPUnit or Pest suites quickly. It standardizes setup so package authors spend less time wiring scaffolding and more time writing assertions.
Architecture fit
open-dxp/test-foundation is a dev-only test harness (Testbench/PHPUnit bootstrapping, PSR-4 helper/fixture traits, Pest expectations, transactional isolation, an EnvironmentTestCase with a config/test.yaml overlay). It sits in require-dev and touches no runtime path.tests/Value/ shapes, named doubles in tests/Application/). That is a genuine architectural asset: it makes a multi-repo suite uniform and machine-checkable.skills/opendxp-tests/SKILL.md artifact signals the package is designed as much for coding agents as for humans. That is the most interesting and least validated part of the design.Tests\TestCase + RefreshDatabase + Dusk, where most of the bootstrapping is redundant.Integration feasibility
expect()->and(), ->throws(), self::faker(), custom expectations). A PHPUnit-only house style makes this package a partial fit at best.Technical risk
Key questions
TestCase, or does it fork/override bootstrapping in ways that will conflict with future Testbench releases?config/test.yaml interact with phpunit.xml, .env.testing, and per-test-case config imports — is there one authoritative config source or two?Stack fit
TestCase. Take the conventions document, not the dependency.Migration path
phpunit.xml authoritative. Use config/test.yaml only for the subset that genuinely must be shared. Document the boundary or you will get two sources of truth and a class of "passes locally, fails in CI" bugs.TestCase that composes the vendor traits behind your own class names. If the package goes quiet, you swap the implementation under a stable internal API instead of touching every test file.Compatibility
Sequencing
Maintenance
Support
Scaling
tests/Helpers/<subject>.php once a second file needs it" rule is good, but requires enforcement or the shared namespace becomes a dumping ground.Failure modes
phpunit.xml and config/test.yaml, producing environment-dependent results.Ramp-up
only()/todo()/dd()/ray()) so the conventions are enforced by tooling rather than by reviewer memory. Without that, convention decay is the default outcome.Recommendation: conditional pilot, not portfolio-wide adoption. The risk is contained and the convention asset is genuinely valuable, but with 1 star, 0 dependents, and no visible external validation, this should earn adoption package-by-package against measured runtime and flake-rate baselines — with a pinned version, an internal wrapper, and a written exit path from day one.
How can I help you explore Laravel packages today?