PHPackages                             vusys/laravel-runabout - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Testing &amp; Quality](/categories/testing)
4. /
5. vusys/laravel-runabout

ActiveLibrary[Testing &amp; Quality](/categories/testing)

vusys/laravel-runabout
======================

Journey testing for Laravel: run the steps of a user journey in seeded, shuffled orders and assert invariants along the way.

01.1k↓36.9%1

Since Jul 7Compare

[ Source](https://github.com/Vusys/laravel-runabout)[ Packagist](https://packagist.org/packages/vusys/laravel-runabout)[ RSS](/packages/vusys-laravel-runabout/feed)WikiDiscussions Synced today

READMEChangelogDependenciesVersions (2)Used By (1)

vusys/laravel-runabout
======================

[](#vusyslaravel-runabout)

[![Tests](https://github.com/Vusys/laravel-runabout/actions/workflows/tests.yml/badge.svg)](https://github.com/Vusys/laravel-runabout/actions/workflows/tests.yml) [![codecov](https://camo.githubusercontent.com/1dcb0c3a22a0c76aa6f3b89515e45ac0681e53ed82c2a67079ea6fca453e6abb/68747470733a2f2f636f6465636f762e696f2f67682f56757379732f6c61726176656c2d72756e61626f75742f67726170682f62616467652e737667)](https://codecov.io/gh/Vusys/laravel-runabout) [![tests](https://camo.githubusercontent.com/a8a44feaf12361d2d7463be5eb46717c06b291db44727859ad2080b6b5c9634d/68747470733a2f2f696d672e736869656c64732e696f2f656e64706f696e743f75726c3d68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f56757379732f6c61726176656c2d72756e61626f75742f6261646765732f74657374732e6a736f6e)](https://github.com/Vusys/laravel-runabout/actions/workflows/tests.yml) [![assertions](https://camo.githubusercontent.com/b54ae833041ca9fa5f8357d61959ef78ee9d1d16d536b40d97de3557fb15ff13/68747470733a2f2f696d672e736869656c64732e696f2f656e64706f696e743f75726c3d68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f56757379732f6c61726176656c2d72756e61626f75742f6261646765732f617373657274696f6e732e6a736f6e)](https://github.com/Vusys/laravel-runabout/actions/workflows/tests.yml) [![test LOC](https://camo.githubusercontent.com/3507bbc0c85a7947adccd0266fec9f6febc8bbb280bd40bee853a76e54a62994/68747470733a2f2f696d672e736869656c64732e696f2f656e64706f696e743f75726c3d68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f56757379732f6c61726176656c2d72756e61626f75742f6261646765732f746573742d726174696f2e6a736f6e)](tests/) [![CI matrix](https://camo.githubusercontent.com/7784938869f679da0289cd20080c3d1e7be89e4220dbc47f82823d8c5b767d9c/68747470733a2f2f696d672e736869656c64732e696f2f656e64706f696e743f75726c3d68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f56757379732f6c61726176656c2d72756e61626f75742f6261646765732f6d61747269782e6a736f6e)](.github/workflows/tests.yml) [![Bencher](https://camo.githubusercontent.com/782b689d97ac54894eef72794a5b361a5954c3cc650990a0e73a97a0ef619bb7/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f42656e636865722d747261636b65642d4644364631423f6c6f676f3d646174613a696d6167652f7376672b786d6c3b6261736536342c50484e325a79423462577875637a30696148523063446f764c336433647935334d793576636d63764d6a41774d43397a646d636949485a705a58644362336739496a41674d4341794e4341794e4349675a6d6c73624430696432687064475569506a78775958526f49475139496b30784d69417954444d674e3359784d477735494455674f533031566a64614969382b5043397a646d632b)](https://bencher.dev/perf/laravel-runabout) [![Mutation testing](https://camo.githubusercontent.com/257259c4a7c68e26aedce0b33d15cf2619df8192889eca92673f213fbbe11b40/68747470733a2f2f696d672e736869656c64732e696f2f656e64706f696e743f7374796c653d666c61742675726c3d68747470733a2f2f62616467652d6170692e737472796b65722d6d757461746f722e696f2f6769746875622e636f6d2f56757379732f6c61726176656c2d72756e61626f75742f6d6173746572)](https://dashboard.stryker-mutator.io/reports/github.com/Vusys/laravel-runabout/master) [![OpenSSF Scorecard](https://camo.githubusercontent.com/9af090b092e8bfbd4f26d2446caa8338d212d41287cbbedc39fb0152591b125a/68747470733a2f2f6170692e73636f7265636172642e6465762f70726f6a656374732f6769746875622e636f6d2f56757379732f6c61726176656c2d72756e61626f75742f6261646765)](https://scorecard.dev/viewer/?uri=github.com/Vusys/laravel-runabout) [![PHP](https://camo.githubusercontent.com/c9b19f1cbf8aefb8c278c8b5d392b64401164a08fced6ccbf376b32135d6714f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7068702d253545382e332d3737374242343f6c6f676f3d706870266c6f676f436f6c6f723d7768697465)](composer.json) [![Laravel](https://camo.githubusercontent.com/9f5bfd36130f0599995d7861cc4bb20c6c2ef58ef4a380f7ed013e103643fc5e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c61726176656c2d3131253230253743253230313225323025374325323031332d4646324432303f6c6f676f3d6c61726176656c)](composer.json) [![PHPStan](https://camo.githubusercontent.com/1bc07920f0d36e55c17e1d38b1caa132cc605f51a82b388c962870b9a747b898/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048505374616e2d6c6576656c253230392d627269676874677265656e2e737667)](phpstan.neon) [![Rector](https://camo.githubusercontent.com/9286512bc0762af8c37418ae625e9977502194b51f89609b24bcfef6e1ba5575/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f526563746f722d70617373696e672d627269676874677265656e2e737667)](rector.php) [![Code Style: Pint](https://camo.githubusercontent.com/7c8875633cb083fe4b31e4f2e2cb344b2ac42ebfa56ba5b2bf5f84f9cc4af64d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636f64652532307374796c652d4c61726176656c25323050696e742d4646324432302e7376673f6c6f676f3d6c61726176656c)](https://github.com/laravel/pint) [![License](https://camo.githubusercontent.com/8bb50fd2278f18fc326bf71f6e88ca8f884f72f179d3e555e20ed30157190d0d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d677265656e2e737667)](LICENSE)

Journey testing for Laravel: define the steps of a user journey once, and Runabout executes them in randomized-but-deterministic orders, checking your invariants after every step. It exists to catch the bugs that unit, feature, and browser tests all miss — the ones that only appear when real users do things in an order you never thought to test.

**📚 Full documentation: [vusys.github.io/laravel-runabout](https://vusys.github.io/laravel-runabout/)**

```
final class PostLifecycleTest extends TestCase
{
    use RunsJourneys;

    public function test_post_lifecycle(): void
    {
        $this->journey(PostLifecycleJourney::class)->shuffles(25)->run();
    }
}
```

One journey definition becomes twenty-six executions: the declared order, then twenty-five seeded shuffles that respect your constraints. When a shuffle fails, the seed reproduces the exact trail — and Runabout shrinks it to the smallest reproduction before reporting it.

Requirements
------------

[](#requirements)

- PHP 8.3+
- Laravel 11, 12, or 13

Installation
------------

[](#installation)

```
composer require --dev vusys/laravel-runabout
```

No service provider to register and nothing to publish — Runabout is a test-only trait you mix into a test case.

Quick start
-----------

[](#quick-start)

Add the `RunsJourneys` trait to a test case, define a `Journey`, and run it. The [Quick start guide](https://vusys.github.io/laravel-runabout/quick-start/) walks through a complete example; the short version is:

```
use Vusys\Runabout\RunsJourneys;

final class PostLifecycleTest extends TestCase
{
    use RunsJourneys;

    public function test_post_lifecycle(): void
    {
        $this->journey(PostLifecycleJourney::class)->shuffles(25)->run();
    }
}
```

Documentation
-------------

[](#documentation)

Full docs live at **[vusys.github.io/laravel-runabout](https://vusys.github.io/laravel-runabout/)**. By topic:

TopicPageWhy it exists and how it works[Introduction](docs/introduction.md)Installing and wiring it in[Installation](docs/installation.md)A complete worked example[Quick start](docs/quick-start.md)The vocabulary[Core concepts](docs/concepts.md)The step DSL[Defining steps](docs/steps.md)Trail state and seeded randomness[The context](docs/context.md)Driving the app as named users[Actors &amp; HTTP](docs/actors-http.md)Shuffling the clock[Time travel](docs/time-travel.md)Properties checked after every step[Invariants](docs/invariants.md)shuffles / repeatHeavy / exhaustive / seed[Execution modes](docs/execution-modes.md)Cross-actor and multi-tenant bugs[Interleaving journeys](docs/interleaving.md)Fresh state between trails[Resetting state](docs/database-resets.md)Seeds, artifacts, and shrinking[Reproducing failures](docs/reproducing-failures.md)Seeing what the shuffler explored[Trails &amp; coverage](docs/observability.md)The `RUNABOUT_*` knobs[Environment variables](docs/environment.md)License
-------

[](#license)

MIT. See [LICENSE](LICENSE).

###  Health Score

16

—

LowBetter than 4% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity21

Limited adoption so far

Community5

Small or concentrated contributor base

Maturity13

Early-stage or recently created project

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/4213522?v=4)[Bryan](/maintainers/Vusys)[@Vusys](https://github.com/Vusys)

### Embed Badge

![Health badge](/badges/vusys-laravel-runabout/health.svg)

```
[![Health](https://phpackages.com/badges/vusys-laravel-runabout/health.svg)](https://phpackages.com/packages/vusys-laravel-runabout)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
