I’ve been working on Fracture, a testing framework that brings deterministic chaos engineering to async Rust.
We all know the pain: async code often passes unit test but fails in production due to timeouts, race conditions, or network blips. I built Fracture to reproduce these failures locally and deterministically.
What it does: Fracture is a drop-in replacement for Tokio during testing. It runs your async code in a pure in-memory simulation. This allows it to:
Inject Chaos: simulate packet loss, connection resets, high latency, and task aborts.
Control Time: fast-forward timeouts instantly (no real sleeping).
Guarantee Determinism: It uses a seeded RNG. If a test fails due to a specific sequence of race conditions and network drops, it gives you the seed. You can re-run that seed to trigger the exact same bug again.
How it handles dependencies: One of the hardest parts of testing async Rust is dealing with external crates (like reqwest or sqlx) that depend on the real Tokio runtime. Fracture solves this via a "shim" crate strategy. You can patch tokio in your Cargo.toml to redirect the dependency tree to Fracture’s simulation runtime, meaning you can chaos-test your entire stack without changing your production code.
Current Status: This is an Alpha (v0.1.2) release. The core concepts work, but there are edge cases we haven't found yet.
I’d love for you to try breaking it (and your code).
Hi HN,
I’ve been working on Fracture, a testing framework that brings deterministic chaos engineering to async Rust.
We all know the pain: async code often passes unit test but fails in production due to timeouts, race conditions, or network blips. I built Fracture to reproduce these failures locally and deterministically.
What it does: Fracture is a drop-in replacement for Tokio during testing. It runs your async code in a pure in-memory simulation. This allows it to:
Inject Chaos: simulate packet loss, connection resets, high latency, and task aborts.
Control Time: fast-forward timeouts instantly (no real sleeping).
Guarantee Determinism: It uses a seeded RNG. If a test fails due to a specific sequence of race conditions and network drops, it gives you the seed. You can re-run that seed to trigger the exact same bug again.
How it handles dependencies: One of the hardest parts of testing async Rust is dealing with external crates (like reqwest or sqlx) that depend on the real Tokio runtime. Fracture solves this via a "shim" crate strategy. You can patch tokio in your Cargo.toml to redirect the dependency tree to Fracture’s simulation runtime, meaning you can chaos-test your entire stack without changing your production code.
Current Status: This is an Alpha (v0.1.2) release. The core concepts work, but there are edge cases we haven't found yet.
I’d love for you to try breaking it (and your code).