Skip to content

Testing Strategy

EnerOS Bot edited this page Jul 5, 2026 · 1 revision

中文 | English

测试策略

维护版本:v0.51.2 | 最后更新:2026-07-06

EnerOS 采用多层测试策略,覆盖单元 / 集成 / e2e / 混沌 / fuzz / proptest / 协议一致性 7 个层次。v0.51.2 测试规模:7700+ tests / 0 failed / 78 ignored / 0 clippy warning / cargo deny 全绿。本页为策略摘要;完整测试指南请参阅主仓库 docs/developer-guide.md §v0.51.0。

测试金字塔

                    ┌──────────┐
                    │   Fuzz   │  4 协议 × 24h
                    └──────────┘
                ┌───────────────────┐
                │  混沌 Chaos       │  5 类故障注入
                └───────────────────┘
            ┌─────────────────────────────┐
            │  e2e 端到端 (tests/e2e)      │  HTTP API 全链路
            └─────────────────────────────┘
        ┌─────────────────────────────────────┐
        │  集成测试(跨 crate)                 │
        └─────────────────────────────────────┘
    ┌─────────────────────────────────────────────┐
    │  单元测试(crate 内 tests/)                 │  ~7000+
    └─────────────────────────────────────────────┘

7 层测试

1. 单元测试

每个 crate 的 src/#[cfg(test)] mod tests + tests/ 目录。

cargo test --workspace

v0.51.2 规模:7700+ tests passed / 0 failed / 78 ignored。

2. 集成测试

跨 crate 集成测试位于 tests/ 目录:

目录 用途
tests/e2e/ HTTP API 端到端
tests/protocol_conformance/ 协议一致性(7 协议 275 测试)
tests/llm_verify/ LLM 100 场景验证(v0.50.1+)
tests/llm_verify_semantic_20/ LLM 20 轮语义验证(v0.50.2+)
tests/chaos/ 混沌测试
tests/integration/ 跨 crate 模块边界测试

3. e2e 测试

tests/e2e/ 使用真实 eneros-api 实例 + HTTP 客户端,覆盖:

  • /health 健康检查
  • /api/v1/demo/* 演示 API
  • /api/v1/devices/* 设备管理
  • /api/v1/timeseries/* 时序查询
  • /api/v1/analysis/* 分析计算
  • /api/v1/ops/* 运维端点

4. 混沌测试

tests/chaos/ 注入 5 类故障:

故障类型 注入方式 验证
网络分区 iptables 阻断 HA 故障切换
进程崩溃 kill -9 守护进程重启
磁盘满 tmpfs 填充 优雅降级
CPU 饱和 stress-ng 调度优先级生效
内存压力 cgroups 限制 OOM 不影响实时域

5. Fuzz 测试(v0.51.0+)

fuzz/ 目录提供 4 个 fuzz 目标,使用 libFuzzer 引擎:

目标 协议
fuzz_iec104 IEC 104
fuzz_iec103 IEC 103
fuzz_dlt698 DL/T 698
fuzz_pmu_c37118 PMU C37.118
# Smoke 测试(60s)
cargo fuzz run fuzz_iec104 -- -max_total_time=60

# 长时运行(24h)
cargo fuzz run fuzz_iec104 -- -max_total_time=86400

Windows 平台 libFuzzer 链接问题(LNK1104),需在 Linux / WSL2 环境运行。

6. proptest 属性测试(v0.51.0+)

5 个 crate × 256 cases = 30720 verifications(v0.51.1 已扩到 1024 cases = 30720 verifications,0 violations):

crate 属性数 用途
eneros-powerflow 6 潮流求解收敛性 + 守恒律
eneros-topology 5 拓扑搜索不变式
eneros-linalg 6 矩阵运算性质
eneros-timeseries 7 时序聚合无丢点
eneros-constraint 6 约束检查幂等性

eneros.toml [quality].proptest_cases = 256 配置每个属性的用例数。

7. 协议一致性测试(v0.51.0+)

tests/protocol_conformance/ 提供 7 协议 275 测试,详见本 wiki 协议支持 页。

性能基准

benches/ 目录使用 criterion:

cargo bench --workspace

benches/baseline.json 保存性能基线,PR 不应导致关键路径性能回退超过 5%。

质量门禁

门禁 命令 失败处理
格式化 cargo fmt --all -- --check 阻塞
Lint cargo clippy --workspace --all-targets -- -D warnings 阻塞
构建 cargo build --workspace 阻塞
测试 cargo test --workspace 阻塞
文档 cargo doc --workspace --no-deps 警告
依赖 cargo deny check 阻塞
覆盖率 llvm-cov 阈值检查

已知限制(v0.51.2)

  • Fuzz 60s smoke 与 24h 长时运行待 Linux/WSL2 环境验证
  • proptest 仅 5 crate 覆盖,待扩展到全部 L0/L1 crate
  • 67 个 unwrap/expect 残留于非测试代码(v0.51.0 已移除 88 个)
  • WCET 测试需 --test-threads=1(避免噪声)
  • test_wcet_over_budget_under_2x_audit_sink_records 为已知 flaky(基于时序)

相关文档

Clone this wiki locally