gomog/TEST_DOCUMENTATION.md

326 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 测试
```bash
cd /home/kingecg/code/gomog
./test_batch2.sh
```
### 方法 2: 运行特定测试
```bash
# 运行 $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: 运行带覆盖率的测试
```bash
# 生成覆盖率报告
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 测试最佳实践,使用表格驱动测试,易于维护和扩展。