icecave/archer
Icecave Archer is a lightweight PHP testing framework for writing concise, script-style tests with built-in assertions and fixtures. It provides a simple alternative to PHPUnit for small projects, rapid prototyping, and readable test suites.
Architecture fit
Archer is not a runtime library — it is a developer-tooling CLI that sits above the test stack and orchestrates it by convention: it discovers test suites from directory layout, invokes PHPUnit (and historically phpspec/isolate), detects the CI environment, normalizes coverage output, and generates project documentation. That has two implications for fit:
phpunit.xml.dist, Pest, ParaTest, composer test scripts, and GitHub Actions matrices cover the same ground natively, with first-party support and documentation. Archer's differentiator in 2014 was "configuration by convention"; in 2025 that value has been absorbed by the ecosystem.The practical architecture fit is therefore narrow and legacy-only: a PHP 5.x-era Laravel 4.x/5.0 codebase that already depends on it. For any Laravel 8+ target, there is no architectural slot for it to occupy.
Integration feasibility
Poor, and the blockers are hard rather than stylistic:
| Constraint | Archer's expectation | Modern Laravel expectation |
|---|---|---|
| PHP | 5.3/5.4-era | 8.1 – 8.4 |
| PHPUnit | 3.7 / 4.x | 10 / 11 |
| Composer | Composer 1-era plugin/API assumptions | Composer 2 |
| CI targets | Travis CI, Bamboo, legacy Jenkins | GitHub Actions, GitLab CI |
Composer 2 will reject the dependency tree outright; forcing --ignore-platform-reqs gets you an installed package that fatals on modern PHP. Even if you containerize it, the package's core value proposition is duplicated by two lines in a CI workflow file.
Technical risk
Key questions
phpunit.xml.dist + composer test + a CI matrix does not? Name it concretely.Stack fit
Only fits a PHP 5.x Laravel 4.x/5.0-era application. There is no Laravel-native integration surface — no provider, no facade, no published config. Adoption takes exactly one form: invoking vendor/bin/archer from a Composer script or CI step and letting it shell out to the underlying test runners. It is a peer of your test framework, not a component of your application.
Migration path
The correct integration is non-integration. Treat Archer as a specification to be reimplemented, not a dependency to be added:
<testsuites> in phpunit.xml.dist or pest.xml; parallelism → ParaTest or Pest's --parallel; coverage gating → --coverage-text thresholds or a coverage PR check; CI detection → ${{ github.ref }} conditionals; docs → phpDocumentor or a static-site generator.composer.lock, and run it inside a frozen PHP 5.6 container image. Do not attempt to make it PHP 8-compatible.Compatibility
Four independent axes must all line up, which is why partial migration fails: PHP minor version, PHPUnit major version, Composer major version (plugin/event API), and the CI provider's API. Travis CI — Archer's primary target — is effectively gone, so the CI-facing features are dead weight regardless of PHP version.
Sequencing
archer in composer.json, CI configs, and Makefiles; confirm whether it is actually invoked or merely present.phpunit.xml.dist + CI job) alongside Archer for one or two sprints; diff suite counts and pass/fail results to prove parity. The suite-count diff is the critical check given silent-discovery risk.For greenfield work, skip to step 2 and simply author the native config.
Maintenance
Effectively zero upstream. Any bug, PHP-version incompatibility, or security finding becomes an internal fork obligation — for a tool whose entire function is a thin wrapper over things you already depend on directly. The cost/benefit is inverted: you would be maintaining a test orchestrator in addition to the test framework it orchestrates.
Support
No vendor, no maintainer, no community. Documentation is a README plus static project pages frozen in 2015. Internal engineers cannot escalate, and new hires will have no prior exposure. The support model is "whoever last touched it."
Scaling
Archer adds negligible overhead — it is a process launcher, not a test executor, and parallelism is delegated to ParaTest/isolate. So it is not a scaling bottleneck. It is also not a scaling lever: it contributes nothing to sharding, caching, or test-time reduction that modern runners don't provide more directly.
Failure modes
Ramp-up
Conceptually trivial ("conventions over configuration") but practically negative: there is no current documentation, no examples matching modern tooling, and no peer who has used it. An engineer onboarding to a repo containing Archer spends time learning a dead tool's quirks and then learning the migration path. Budget the migration, not the onboarding.
Recommendation: Do not adopt. Score 0 with zero dependents accurately reflects a package that is archival, PHP 5.x-bound, and functionally superseded. The only defensible posture is containment of an existing legacy dependency with a dated removal plan, plus extraction of its conventions into native PHPUnit/Pest and CI configuration.
How can I help you explore Laravel packages today?