Skip to content

测试策略与规范

测试基线: v0.1.2 | 总测试数: 772 | 通过率: 100%


指标目标当前值
单元测试覆盖率≥ 80%~85%
总测试用例数≥ 400772
测试通过率100%100%
模块覆盖P0-P3P0-P5
双轨制测试core + storagecore + storage + algo
  • 断言优先: 使用 assert_eq / assert_true 用于确定性结果
  • 属性检验: 验证算法不变量(如 PageRank scores 之和 ≈ 1.0、最大流 = 最小割)
  • 跨存储一致性: 算法在 AdjList/Matrix/EdgeList/CSR 上行为一致
  • 纯函数语义: 算法前深拷贝,保证输入不被修改

类型文件命名可见性用途典型场景
黑盒测试*_test.mbt仅访问 pub API验证公开行为正确性算法结果、CRUD 操作
白盒测试*_wbtest.mbt可访问 pub(all) 内部验证实现细节/TraitMockGraph、Helper 函数
///|
test "模块名_具体场景" {
// Arrange: 构建测试数据
let g = @storage.new_directed()
let n0 = @core.GraphWritable::add_node(g, 0.0)
let n1 = @core.GraphWritable::add_node(g, 1.0)
@core.GraphWritable::add_edge(g, n0, n1, 1.0) |> ignore
// Act: 执行被测操作
let result = bfs(g, n0)
// Assert: 验证结果
assert_eq(result.discovered_order.length(), 2)
assert_true(result.distance[n0] == 0)
}

命名规范: test "{module}_{scenario}"

当前白盒测试清单:

文件测试数覆盖内容
core/traits_wbtest.mbt19MockGraph 实现 5 层 Trait 共 26 方法
storage/helpers_wbtest.mbt13has_node / find_slot / remove_from_list / bubble_sort

MockGraph 设计要点:

// MockGraph 用于验证 Trait 分层的编译期约束正确性
struct MockGraph {
mut nodes : Array[Node?]
mut adj : Array[Array[(NodeId, Double)]]
mut node_cnt : Int
directed : Bool
}
// 实现 GraphReadable (12 方法)
impl @core.GraphReadable for MockGraph with node_count(self) { self.node_cnt }
impl @core.GraphWritable for MockGraph with add_node(self, data) { ... }
impl @core.GraphDirected for MockGraph with in_degree(self, id) { ... }

┌─────────────────────────────────────────────┐
│ 跨存储兼容性测试 (Cross-Storage) │ ← 多存储行为一致
├─────────────────────────────────────────────┤
│ 集成测试 (Integration) │ ← 跨模块端到端场景
├─────────────────────────────────────────────┤
│ 模块黑盒测试 (Blackbox) │ ← 公开 API 正确性
├─────────────────────────────────────────────┤
│ 模块白盒测试 (Whitebox) │ ← 内部实现/Trait 验证
├─────────────────────────────────────────────┤
│ 属性测试 (Property) │ ← 算法不变量验证
└─────────────────────────────────────────────┘

测试文件跟随源码放置在各包目录内

lib/
├── core/
│ ├── types.mbt # NodeId, Node, Edge
│ ├── traits.mbt # 5 层 trait 定义
│ ├── error.mbt # GraphError 枚举
│ ├── types_test.mbt # [Blackbox] 24 tests
│ ├── error_test.mbt # [Blackbox] 25 tests
│ └── traits_wbtest.mbt # [Whitebox] 19 tests
├── storage/
│ ├── directed_adj_list.mbt # 有向邻接表 ⭐
│ ├── directed_adj_list_test.mbt # [Blackbox] 19 tests
│ ├── matrix_test.mbt # [Blackbox] 15 tests
│ ├── csr_csc_test.mbt # [Blackbox] 15 tests
│ ├── converter_test.mbt # [Blackbox] 16 tests
│ └── helpers_wbtest.mbt # [Whitebox] 13 tests
├── algo/
│ ├── traversal/
│ │ ├── traversal_test.mbt # [Blackbox] ~47 tests
│ │ └── cross_storage_test.mbt # [Cross-Storage] 🆕
│ ├── shortest_path/
│ │ └── shortest_path_test.mbt # [Blackbox] 32 tests
│ ├── flow/
│ │ ├── flow_test.mbt # [Blackbox] EK 测试
│ │ └── dinic_test.mbt # [Blackbox] Dinic 测试
│ └── ... (各算法模块)
└── utils/
└── generators/
└── generators_test.mbt # [Blackbox] 56 tests

层级黑盒白盒总计
基础类型core491968
存储层storage9215~107
算法 (P0-P4)algo/*2260226
算法 (P5)algo/*1500150
高级算法pagerank/centrality/community65065
链接预测/稠密子图link_prediction/dense_subgraph~48048
图算子/图识别operators/recognition~55055
I/Oio~42042
集成测试integration~60060
其他生成器/哈密顿~76076
合计~730~37768

文件测试数测试内容
types_test.mbt24NodeId 构造/等价/无效值;Node/Edge 字段正确性
error_test.mbt253 种错误变体构造匹配、Eq 实现、Result 集成测试
traits_wbtest.mbt19MockGraph 实现 5 层 Trait 共 26 方法
测试文件测试数关键验证点
directed_adj_list_test.mbt19图 CRUD、有向图 API、自环处理
undirected_adj_list_test.mbt15无向对称性、半存储优化(无重复边)、度数计算
matrix_test.mbt15稠密图创建、O(1) 访问正确性
csr_csc_test.mbt15Builder 模式、batch_operations、只读强制(LSP 原则)
converter_test.mbt16三层转换架构:有向/无向/语义转换
helpers_wbtest.mbt13has_node / find_slot / remove_from_list
测试用例说明
bfs_linear_graph线性图 BFS 顺序正确
bfs_distances距离计算正确
bfs_disconnected不连通图仅遍历可达节点
cycle_detection有向/无向环检测
topological_sortDAG 拓扑序、有环图报错

跨存储兼容性测试:

///|
test "bfs_consistent_across_storages" {
let adj = make_linear_adjlist()
let mat = make_linear_matrix()
let el = make_linear_edgelist()
let csr = make_linear_csr()
let r_adj = bfs(&adj, @core.NodeId(0))
let r_mat = bfs(&mat, @core.NodeId(0))
let r_el = bfs(&el, @core.NodeId(0))
let r_csr = bfs(&csr, @core.NodeId(0))
assert_eq(r_adj.discovered_order.length(), r_mat.discovered_order.length())
assert_eq(r_mat.discovered_order.length(), r_el.discovered_order.length())
assert_eq(r_el.discovered_order.length(), r_csr.discovered_order.length())
}
测试用例算法验证点
dijkstra_simpleDijkstra3 节点三角图最短路径
dijkstra_early_terminationDijkstra指定 target 提前终止
dijkstra_negative_weightDijkstra负权边返回错误
bf_negative_cycleBellman-Ford检测负权环
bf_vs_dijkstraBellman-Ford非负权图与 Dijkstra 一致
fw_all_pairsFloyd-Warshall全源最短路径矩阵正确
测试用例验证点
kruskal_complete_k4总权重最小,无环
prim_vs_kruskal与 Kruskal 权重一致
mst_disconnected不连通图返回森林
测试用例算法验证点
ek_simple_flowEdmonds-Karp标准 4 节点网络
dinic_vs_ekDinic与 EK 结果一致
mcmf_basicMin-Cost Max-Flow带费用的流量优化
stoer_wagner_simpleStoer-Wagner全局最小割正确性
类别比例内容
基础功能测试~30%类型创建 / 方法正确性
算法正确性测试~40%经典案例 / 已知答案
边界情况测试~20%空图 / 越界 / 异常输入
属性验证测试~10%不变性 / 一致性约束

方式函数适用场景
布尔断言assert_eq(a, b)简单值比较
布尔断言assert_true(cond)条件验证
快照测试inspect(value, content="...")复杂结构输出
错误测试inspect 错误结果异常处理验证

Terminal window
# 全量测试
moon test
# 单模块测试
moon test lib/algo/pagerank
# 更新快照
moon test --update
# 覆盖率分析
moon coverage analyze
moon coverage report # 生成 HTML 报告

GitHub Actions 自动执行:

# 每次 push 自动运行:
# 1. moon fmt 格式检查
# 2. moon check 类型检查
# 3. moon test 全量测试
# 4. 覆盖率报告生成

提示: 添加新算法时,遵循”类型 → 算法 → 测试 → 文档”的提交顺序。