# 压力、故障与长跑测试

rs-zero 把 cache/resilience 的可靠性测试分成两类：默认确定性测试和显式长跑测试。

## 默认测试

默认测试随 `cargo test --workspace` 运行，不依赖外部服务，重点验证并发和故障下的不变量，而不是固定性能耗时。

```bash
cargo test --test cache_stress
cargo test --test resilience_stress
```

覆盖范围：

- `CacheAside`：同 key singleflight、多 key 热点、loader 失败、set/delete 故障、负缓存、腐坏值清理。
- `LruCacheStore`：并发 set/get、容量上限、TTL 清理和淘汰计数。
- `TwoLevelCacheStore`：L1/L2 backfill、并发删除、L2 set 失败时不污染 L1。
- `ConcurrencyLimit`：高并发下的 fail-fast 拒绝和 permit 回收。
- `SharedCircuitBreaker`：并发成功/失败、open/half-open、guard drop 和半开试探上限。
- `AdaptiveShedder`：过载拒绝、in-flight 回收、drop/failure 统计。
- `RollingWindow`：bucket 轮转、失败率、drop 率和延迟快照。
- REST/RPC resilience 集成：局部压力下的成功/拒绝状态和低基数 metrics。

## 长跑测试

长跑测试默认 ignored，需要显式运行。短 profile 适合本机或 CI 手动验证：

```bash
RS_ZERO_LONG_TEST_SECONDS=2 \
RS_ZERO_LONG_TEST_TASKS=8 \
RS_ZERO_LONG_TEST_KEYS=16 \
  cargo test --test cache_resilience_long_running -- --ignored
```

变量说明：

- `RS_ZERO_LONG_TEST_SECONDS`：每个长跑用例的目标运行秒数，默认 `5`。
- `RS_ZERO_LONG_TEST_TASKS`：并发任务数，默认 `16`。
- `RS_ZERO_LONG_TEST_KEYS`：cache key 空间大小，默认 `64`。

手动加压时可以逐步增加 seconds/tasks/keys。测试只断言状态不变量，例如 loader error 计数、LRU 容量、breaker/shedder in-flight 回收，不使用机器相关的固定耗时 SLA。

## 排障建议

- 如果默认压力测试失败，先看断言中的 snapshot、stats 和错误文本；这些测试会尽量输出 cache/resilience 的最终状态。
- 如果长跑测试偶发失败，先用短 profile 复现，再单独运行失败的 ignored 用例。
- 如果修改了 cache/resilience 生产代码，至少运行默认 workspace、目标压力测试、短 profile 长跑测试和文档链接检查。
