Testing More Than the Happy Path
coreadvancedMost testing proves the system works when everything else is working. That is the least interesting case, because it is the one that happens on its own. The useful question is what happens when a dependency is slow, a node disappears, or a credential expires — and the only way to know is to make those things happen on purpose while you are watching.
Think of it as
You designed mitigations — health checks, retries, timeouts, replicas, failover. Each one is a claim: "if X happens, the system does Y." An untested claim is a belief. Chaos engineering is the discipline of turning each belief into an experiment with a stated hypothesis and an observed result.
What we're doing: Turn one design assumption into an experiment with a result you can act on.
- 1
- Design documents are full of sentences like this. Each one is a candidate experiment.
- 6
- Without a baseline you cannot tell a bad result from a normal Tuesday — this is why steady state comes first.
- 13
- The hypothesis names the mitigation, so a failure tells you which mitigation was wrong.
- 19
- The valuable outcome is a disproved hypothesis: it converts an unknown into a specific, fixable defect.
Why this works: The gap between "we designed for this" and "we verified this" is where outages live, and it is invisible from inside normal testing because normal testing never creates the condition. One experiment per design assumption, run in the order of how likely and how damaging each fault is, converts that gap into a finite list of things to fix.
Running an experiment against a workload you already know is broken
Wrong
Better
What you see: The experiment causes a real incident, teaches nothing anyone did not already know, and makes it politically much harder to run the next one.
Why: AWS states this directly: an experiment should be fail-safe and tolerated by the workload, and if you know the workload will fail, do not run it. Chaos engineering is for finding known-unknowns and unknown-unknowns; experimenting against a known break spends trust and blast radius to reconfirm something already on the backlog.
- A five-stage cycle drawn as a loop.
- Stage 1, steady state: define a measurable output that shows normal behaviour, for example 300 transactions per second at 99% success with a 500 millisecond round trip.
- Stage 2, hypothesis: state that if a specific fault occurs, a named mitigation will keep a named metric within a stated bound.
- Stage 3, run the experiment: inject the fault with a defined scope, guardrails, and stop conditions.
- Stage 4, verify: compare the observed metrics with the hypothesis.
- Stage 5, improve: if steady state was not maintained, change the design and run the experiment again; if it was, automate the experiment as a regression test.
- An arrow returns from stage 5 to stage 1.
Two kinds of testing, both needed
Together
Remember: Every mitigation in the design is an untested claim until you make the fault happen. Measure a steady state first, write the hypothesis as "if this fault, then this mitigation keeps this metric inside this bound", run it small, and measure what the user sees rather than what the servers report.
See also: the failure drill catalogue · fault injection with blast radius · testing recovery procedures · wellarchitected reliability principles

