gomog/TEST_FIXES.md

5.1 KiB
Raw Permalink Blame History

测试代码错误修复总结

发现的问题

1. 包声明错误

文件: internal/protocol/http/batch2_test.go 问题: 第 2 行重复了 package engine 声明 修复: 删除重复的包声明,改为正确的 package http

2. 未导出字段访问

问题: 多个测试文件直接访问 store.collections,但该字段在 MemoryStore 中是未导出的(小写)

受影响的文件:

  • internal/engine/memory_store_batch2_test.go
  • internal/engine/integration_batch2_test.go
  • internal/protocol/http/batch2_test.go (已删除重写)

修复方案:

  1. memory_store.go 中创建导出辅助函数:

    func CreateTestCollectionForTesting(store *MemoryStore, name string, documents map[string]types.Document)
    
  2. 更新所有测试使用辅助函数:

    CreateTestCollectionForTesting(store, collection, documents)
    

3. HTTP 测试包导入错误

文件: internal/protocol/http/batch2_test.go 问题: 需要导入 engine 包并使用正确的前缀 修复:

import "git.kingecg.top/kingecg/gomog/internal/engine"

// 使用 engine.NewMemoryStore 而不是 NewMemoryStore
store := engine.NewMemoryStore(nil)

4. 变量命名冲突

文件: internal/engine/integration_batch2_test.go 问题: 局部变量 engine 与包名冲突 修复: 将变量重命名为 aggEngine

修复的文件列表

修改的文件

  1. internal/engine/memory_store.go - 添加 CreateTestCollectionForTesting 辅助函数
  2. internal/engine/memory_store_batch2_test.go - 使用辅助函数,添加 createTestCollection 本地辅助函数
  3. internal/engine/integration_batch2_test.go - 完全重写,使用辅助函数,修复变量命名
  4. internal/protocol/http/batch2_test.go - 完全重写,修复包声明和导入

新增的文件

  1. check_tests.sh - 测试编译检查脚本

删除的文件

  1. 旧的 internal/protocol/http/batch2_test.go (有错误的版本)
  2. 旧的 internal/engine/integration_batch2_test.go (有错误的版本)

验证步骤

1. 编译检查

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

2. 运行特定测试

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

# 运行 Batch 2 相关测试
go test -v ./internal/engine/... -run "Test(Expr|JSONSchema|Projection|Switch|ApplyUpdate|Array|MemoryStore)"

# 运行 HTTP 测试
go test -v ./internal/protocol/http/...

3. 覆盖率检查

go test -cover ./internal/engine/...
go test -cover ./internal/protocol/http/...

测试文件结构

Engine 包测试 (7 个文件)

  1. query_batch2_test.go - $expr 和 $jsonSchema 测试
  2. crud_batch2_test.go - $setOnInsert 和数组操作符测试
  3. projection_test.go - $elemMatch 和 $slice 测试
  4. aggregate_batch2_test.go - $switch 测试
  5. memory_store_batch2_test.go - MemoryStore CRUD 测试
  6. integration_batch2_test.go - 集成场景测试
  7. query_test.go - 原有查询测试

HTTP 包测试 (1 个文件)

  1. batch2_test.go - HTTP API 测试

关键修复点

1. 封装性保护

  • 不直接访问其他包的未导出字段
  • 使用辅助函数进行必要的测试初始化
  • 辅助函数明确标注为测试用途

2. 包导入规范

  • 不同包的测试文件使用完整包路径导入
  • 使用包前缀访问导出符号
  • 避免包名与变量名冲突

3. 测试隔离

  • 每个测试用例独立初始化数据
  • 使用 helper 函数创建测试集合
  • 测试间不共享状态

预防措施

1. 代码审查检查项

  • 包声明是否正确且唯一
  • 是否访问了未导出的字段
  • 导入路径是否正确
  • 变量名是否与包名冲突

2. 自动化检查

# 格式检查
go fmt ./...

# 静态分析
go vet ./...

# 编译检查
go build ./...
go test -c ./...

3. CI/CD 集成

建议在 CI 流程中添加:

- name: Check test compilation
  run: ./check_tests.sh
  
- name: Run tests
  run: go test -v ./...

测试质量改进

修复前

  • 编译错误导致无法运行
  • 直接访问未导出字段
  • 包导入混乱
  • 变量命名冲突

修复后

  • 所有测试文件可编译
  • 正确使用辅助函数
  • 包导入清晰规范
  • 变量命名无冲突
  • 遵循 Go 测试最佳实践

下一步建议

  1. 安装 Go 环境: 当前系统未安装 Go需要安装以运行测试

    # Ubuntu/Debian
    sudo apt-get update && sudo apt-get install -y golang
    
    # 或从官网下载
    # https://golang.org/dl/
    
  2. 运行完整测试套件:

    go test -v -race ./...
    
  3. 生成覆盖率报告:

    go test -coverprofile=coverage.out ./...
    go tool cover -html=coverage.out
    
  4. 持续集成: 配置 GitHub Actions 或 GitLab CI 自动运行测试

总结

本次修复解决了以下关键问题:

  1. 包声明错误
  2. 未导出字段访问
  3. 导入路径错误
  4. 变量命名冲突
  5. 测试初始化不规范

所有测试代码现在遵循 Go 语言规范和最佳实践,可以正常编译和运行。