gomog/TEST_DOCUMENTATION.md

9.0 KiB
Raw Permalink Blame History

Batch 2 单元测试和集成测试文档

测试文件清单

1. 查询操作符测试 (query_batch2_test.go)

TestExpr - $expr 操作符测试

  • 简单字段比较 ($gt with $qty and $minQty)
  • 比较失败场景
  • 等值检查 ($eq)
  • 算术表达式 ($add)
  • 条件表达式 ($gte)

TestJSONSchema - JSON Schema 验证测试

  • bsonType object 验证
  • required 必填字段验证
  • required 字段缺失
  • properties 属性验证
  • enum 枚举验证(成功/失败)
  • minimum/maximum 数值范围验证
  • minLength/maxLength 字符串长度验证
  • pattern 正则表达式验证
  • array items 数组元素验证
  • anyOf 组合验证

TestIsTrueValue - 布尔转换辅助函数测试

  • nil 值
  • 布尔值 (true/false)
  • 整数 (零/非零)
  • 浮点数 (零/非零)
  • 字符串 (空/非空)
  • 数组 (空/非空)
  • map (空/非空)

测试覆盖: 3 个测试函数,约 20+ 个测试用例


2. CRUD 操作测试 (crud_batch2_test.go)

TestApplyUpdateSetOnInsert - $setOnInsert 测试

  • upsert 插入时 setOnInsert 生效
  • 非 upsert 插入时 setOnInsert 不生效
  • setOnInsert 仅在插入时应用

TestArrayPositionalOperators - 数组位置操作符测试

  • $[] 更新所有元素
  • $[identifier] 配合 arrayFilters 更新匹配元素

TestUpdateArrayAtPath - 数组路径更新测试

  • $[] 操作符更新所有
  • $ 操作符更新第一个(简化实现)

TestConvertFiltersToMaps - 过滤器转换测试

  • nil filters
  • empty filters
  • single filter
  • multiple filters

测试覆盖: 4 个测试函数,约 10+ 个测试用例


3. 投影操作符测试 (projection_test.go)

TestProjectionElemMatch - $elemMatch 测试

  • elemMatch 找到第一个匹配元素
  • elemMatch 无匹配返回 nil
  • elemMatch 用于非数组字段

TestProjectionSlice - $slice 测试

  • slice 正数限制(前 N 个)
  • slice 负数限制(最后 N 个)
  • slice skip + limit 组合
  • slice skip 超出数组长度
  • slice 零限制

TestApplyProjection - 投影应用测试

  • 包含模式投影
  • 排除模式投影
  • 排除 _id 字段

TestApplyProjectionToDoc - 单文档投影测试

  • 包含指定字段
  • 排除指定字段

测试覆盖: 4 个测试函数,约 12+ 个测试用例


4. 聚合表达式测试 (aggregate_batch2_test.go)

TestSwitchExpr - $switch 条件表达式测试

  • switch 匹配第一个分支
  • switch 匹配第二个分支
  • switch 无匹配使用 default
  • switch case 中使用算术表达式

TestEvaluateExpressionWithSwitch - $switch 在聚合中测试

  • 嵌套 switch 在表达式中

测试覆盖: 2 个测试函数,约 5+ 个测试用例


5. 内存存储测试 (memory_store_batch2_test.go)

TestMemoryStoreUpdateWithUpsert - Upsert 功能测试

  • upsert 创建新文档
  • 更新现有文档不应用 setOnInsert
  • 检查 upsertedIDs 返回

TestMemoryStoreUpdateWithArrayFilters - ArrayFilters 功能测试

  • arrayFilters 过滤更新
  • 验证更新正确应用到匹配元素

TestMemoryStoreGetAllDocuments - 获取所有文档测试

  • 返回所有文档

TestMemoryStoreCollectionNotFound - 集合不存在测试

  • 获取不存在的集合返回错误

TestMemoryStoreInsert - 插入功能测试

  • 插入文档到内存
  • 验证插入数据

TestMemoryStoreDelete - 删除功能测试

  • 删除匹配的文档
  • 验证只删除匹配的文档

测试覆盖: 6 个测试函数,约 10+ 个测试用例


6. HTTP API 测试 (http/batch2_test.go)

TestHTTPUpdateWithUpsert - HTTP upsert 测试

  • HTTP API upsert 请求
  • 验证响应状态码
  • 验证影响文档数

TestHTTPUpdateWithArrayFilters - HTTP arrayFilters 测试

  • HTTP API arrayFilters 请求
  • 验证更新正确应用

TestHTTPFindWithProjection - HTTP 投影测试

  • HTTP API 投影请求
  • 验证只返回指定字段
  • 验证排除字段不在结果中

TestHTTPAggregateWithSwitch - HTTP $switch 聚合测试

  • HTTP API 聚合管道含 $switch
  • 验证 grade 分配正确

TestHTTPHealthCheck - 健康检查测试

  • /health 端点返回 healthy

测试覆盖: 5 个测试函数,约 8+ 个测试用例


7. 集成测试 (integration_batch2_test.go)

TestAggregationPipelineIntegration - 聚合管道集成测试

  • match + group with sum
  • project with switch expression
  • addFields with arithmetic

TestQueryWithExprAndJsonSchema - $expr 和 $jsonSchema 组合测试

  • $expr 与字段比较
  • $jsonSchema 验证
  • $expr 与常规过滤器组合

TestUpdateWithProjectionRoundTrip - 更新后查询投影完整流程

  • 使用 $[] 更新数组
  • 查询验证更新结果
  • 投影验证

TestComplexAggregationPipeline - 复杂聚合管道测试

  • match → addFields → group → project 完整管道
  • 验证计算字段total, avgTotal, maxTotal

测试覆盖: 4 个测试函数,约 8+ 个测试用例


测试统计

测试文件 测试函数 测试用例 覆盖率目标
query_batch2_test.go 3 20+ 查询操作符 90%
crud_batch2_test.go 4 10+ CRUD 操作 85%
projection_test.go 4 12+ 投影操作符 95%
aggregate_batch2_test.go 2 5+ 聚合表达式 80%
memory_store_batch2_test.go 6 10+ 内存存储 90%
http/batch2_test.go 5 8+ HTTP API 85%
integration_batch2_test.go 4 8+ 集成场景 80%
总计 28 73+ 总体 85%

运行测试

方法 1: 运行所有 Batch 2 测试

cd /home/kingecg/code/gomog
./test_batch2.sh

方法 2: 运行特定测试

# 运行 $expr 测试
go test -v ./internal/engine/... -run TestExpr

# 运行 $jsonSchema 测试
go test -v ./internal/engine/... -run TestJSONSchema

# 运行投影测试
go test -v ./internal/engine/... -run TestProjection

# 运行 $switch 测试
go test -v ./internal/engine/... -run TestSwitch

# 运行所有 CRUD 测试
go test -v ./internal/engine/... -run TestApplyUpdate

# 运行所有内存存储测试
go test -v ./internal/engine/... -run TestMemoryStore

# 运行所有 HTTP API 测试
go test -v ./internal/protocol/http/... -run TestHTTP

# 运行集成测试
go test -v ./internal/engine/... -run Test.*Integration

方法 3: 运行带覆盖率的测试

# 生成覆盖率报告
go test -v -coverprofile=coverage.out ./internal/engine/...
go tool cover -html=coverage.out -o coverage.html

# 查看覆盖率
go tool cover -func=coverage.out

测试场景覆盖

查询操作符场景

  • 字段间比较($expr
  • 类型验证($jsonSchema bsonType
  • 必填字段验证($jsonSchema required
  • 枚举值验证($jsonSchema enum
  • 数值范围验证($jsonSchema minimum/maximum
  • 字符串模式验证($jsonSchema pattern
  • 组合验证($jsonSchema anyOf/allOf

更新操作场景

  • upsert 插入新文档
  • upsert 更新现有文档
  • $setOnInsert 条件应用
  • $[] 更新所有数组元素
  • $[identifier] 精确更新
  • arrayFilters 过滤条件

投影场景

  • $elemMatch 数组元素投影
  • $slice 数组切片投影
  • 包含模式投影
  • 排除模式投影
  • _id 特殊处理

聚合场景

  • $switch 多分支条件
  • 嵌套表达式
  • 算术运算
  • 管道链式执行

集成场景

  • 查询 + 投影组合
  • 更新 + 查询验证
  • 多阶段聚合管道
  • HTTP API 端到端流程

已知限制和改进建议

当前限制

  1. 位运算操作符测试较少(需要专门的二进制测试)
  2. 日期操作符测试未包含在 Batch 2 测试中
  3. 性能基准测试未包含

改进建议

  1. 添加模糊测试fuzzing测试边界条件
  2. 添加性能基准测试
  3. 添加并发安全测试
  4. 添加大数据量测试
  5. 添加错误处理测试(无效输入、边界值)

测试质量指标

  • 单元测试覆盖率: 目标 85%+
  • 集成测试覆盖: 主要业务场景 100%
  • 边界条件测试: 包含 nil、空值、极值
  • 错误处理测试: 包含异常情况
  • 回归测试: 所有已修复 bug 都有对应测试

结论

Batch 2 测试套件包含 28 个测试函数73+ 个测试用例,覆盖了:

  • 新增的所有查询操作符($expr, $jsonSchema
  • 新增的所有更新操作符($setOnInsert, 数组位置操作符)
  • 新增的所有投影操作符($elemMatch, $slice
  • 新增的聚合表达式($switch
  • 所有 API 变更upsert, arrayFilters
  • 主要集成场景

测试代码遵循 Go 测试最佳实践,使用表格驱动测试,易于维护和扩展。