Suitcase
The structured test toolkit. A lightweight sync Rust library for named cases, optional setup / teardown at suite scope and before_each / after_each around each case. Build case lists with cases!; use test_suite! so each case appears as its own line in cargo test, with all those tests sharing one suite behind a Mutex.
Heavy development: The API is still evolving. Expect breaking changes between releases until a stable 1.0; pin an exact version (or git revision) in Cargo.toml if you need upgrades to be predictable.
Install · Usage · Examples · Docs (after publish; cargo doc --open locally)
- Sync runner —
runorchestrates hooks and case bodies; integrate async I/O with something liketokio::runtime::Handle::block_onin hooks or cases. - Hooks as optional fns —
HookFnsholdsOption<fn(&mut S)>per lifecycle slot; use [None] to skip. - Macros —
cases!builds&'static [Case<S>].test_suite!emits one#[test]per case name; each run usesRunConfig::filterand the same shared suite (see macro docs forSendand ordering).
Install
Add suitecase to your Cargo.toml (no required dependencies beyond std):
[]
= "0.1"
Usage
Quickstart
Put this in tests/suite.rs or #[cfg(test)] mod tests { ... }. The example is cargo test --example quickstart — one test line that runs every case in order on one suite.
use ;
static MY_CASES: & = cases!;
static MY_HOOKS: = HookFns ;
Run: cargo test.
Hooks
Pass HookFns as the last argument to run. Each field is Option<fn(&mut S)> — [Some(...)] or [None] / [HookFns::default()].
One line per case in cargo test (test_suite!)
test_suite! expands to one #[test] per listed case. Each test locks a shared Mutex<S> (keyed by a static name you choose), then calls [run] with [RunConfig::filter] for that case. Later tests can observe mutations from earlier runs on the same suite value.
use ;
// MY_CASES, MY_HOOKS, Counter …
test_suite!;
Run: cargo test. See the macro’s rustdoc for ordering (parallel harness) vs a single run with RunConfig::all.
Examples
| Example | Run |
|---|---|
examples/quickstart.rs |
cargo test --example quickstart |
examples/sqlx_sqlite.rs |
cargo test --example sqlx_sqlite |
| Every example at once | cargo test --examples |
Integration tests (tests/suite.rs) |
cargo test |
The sqlx example uses sqlx + tokio, embedded migrations in setup_suite, and cases! blocks that call helper functions, plus test_suite!.
[]
= "0.1"
= { = "0.8", = ["runtime-tokio", "sqlite", "migrate"] }
= { = "1", = ["macros", "rt-multi-thread"] }
More documentation
cargo doc --open—cases!andtest_suite!include declaration / description / examples.- Crate root and
suitedescribe howrunselects cases and orders hooks.