| Flaky tests | Pass/fail without code changes | Critical | Remove non-determinism: no sleeps, no real clocks, no shared state |
| Test interdependence | Tests pass alone, fail together | Critical | Each test creates/destroys its own data |
| Testing implementation | Refactoring breaks tests | Major | Assert on outputs and side effects, not internal method calls |
| Logic in tests | Conditionals, loops, try-catch in test code | Major | Tests should be straight-line code |
| Slow tests | Suite takes minutes, developers skip it | Major | Isolate from I/O; use fakes; parallelize |
| Obscure tests | Must read full test to understand intent | Moderate | Descriptive names, visible AAA structure |
| Fragile assertions | Tests break on irrelevant output changes | Moderate | Assert on relevant fields only |
| Liar tests | Tests that always pass regardless of behavior | Critical | Verify tests fail when behavior is wrong (mutation testing) |
| Giant arrange | 50 lines of setup, 1 line of act | Moderate | Use builders/factories; consider whether unit is too large |
| Snapshot abuse | Blindly approving snapshot updates | Moderate | Prefer explicit assertions for logic |