3.2 KiB
3.2 KiB
测试计划
目录
1. 测试策略
测试金字塔
┌───────┐
│ 端到端 │ 完整建模工作流测试
├───────┤
│ 集成 │ 模块间交互测试
├───────┤
│ 单元 │ 每个函数/类的独立测试(主力)
└───────┘
| 层次 | 范围 | 工具 | 覆盖目标 |
|---|---|---|---|
| 单元测试 | 单个函数/类 | Google Test | ≥ 90% |
| 集成测试 | 模块间交互 | Google Test | 关键路径 |
| 端到端测试 | 完整工作流 | 自定义脚本 | 典型场景 |
| 性能测试 | 单个算法 | Google Benchmark | 回归监控 |
2. 测试环境
| 环境 | 编译器 | 平台 |
|---|---|---|
| CI linux-gcc | GCC 11 | Ubuntu 22.04 |
| CI linux-clang | Clang 15 | Ubuntu 22.04 |
| CI windows-msvc | MSVC 2022 | Windows Server 2022 |
| CI macos-clang | Apple Clang 14 | macOS 13 |
CI 流程
Push / PR
├──► 编译(Debug + Release)
├──► 单元测试
├──► 代码覆盖率(lcov → Codecov)
├──► 静态分析(clang-tidy)
└──► 性能基准(Release 构建,与基线对比)
3. 单元测试规范
命名规则
TEST(<模块名>Test, <函数名>_<场景描述>)
示例:TEST(MeshTest, Simplify_ReducesFaceCount)
AAA 结构
TEST(PointTest, Distance_SamePoint_ReturnsZero) {
// Arrange(准备)
Point3D a(1, 2, 3), b(1, 2, 3);
// Act(执行)
double d = (a - b).norm();
// Assert(断言)
EXPECT_DOUBLE_EQ(d, 0.0);
}
必测场景
- 正常输入(Happy Path)
- 边界条件(空集、单元素、极值)
- 退化情况(共线、共面、零面积)
- 错误输入(非法参数、无效状态)
- 精度边界(极小/极大坐标值)
4. 性能基准
| 算法 | 输入规模 | 性能目标 |
|---|---|---|
| Delaunay 2D | 10⁶ 点 | ≤ 10 秒 |
| BVH 构建 | 10⁶ 三角面 | ≤ 5 秒 |
| BVH 射线查询 | 10⁶ 三角面 | ≤ 0.1 毫秒/次 |
| GJK 碰撞检测 | 凸体 | ≤ 30 次迭代 |
| 布尔运算 2D | 10³ 顶点 | ≤ 0.1 秒 |
| NURBS 求值 | — | ≤ 1 微秒/次 |
5. 回归测试
- Golden File 测试:将标准测试用例输出与参考文件比对
- 性能回归:基准测试结果与历史对比,性能退化 > 10% 报警
6. 测试数据管理
data/
├── meshes/
│ ├── primitives/ # 基本体(球、盒、柱)
│ ├── stanford/ # Stanford 标准模型
│ │ ├── bunny.obj
│ │ ├── dragon.obj
│ │ └── armadillo.obj
│ └── degenerate/ # 退化情况
│ ├── non_manifold.obj
│ └── zero_area.obj
└── curves/
├── bezier_basic.json
└── nurbs_circle.json