Files
oci-portal/.trellis/spec/backend/testing.md
T
2026-07-09 19:18:04 +08:00

1.0 KiB

测试规范

Go 后端测试约定。

  • 新逻辑配 table-driven 测试,用例含名字、输入、期望值;go test ./... 全绿才算完成。
  • 断言失败时输出 got/want 对比,便于定位。
  • 辅助函数标注 t.Helper(),清理动作用 t.Cleanup()

常见坑::memory: SQLite 每个连接是独立库

症状:被测代码里有异步 goroutine 写库(如日志异步落库)时,测试偶发 no such table: xxx

原因:glebarez/sqlite 的 :memory: 数据库按连接隔离;GORM 连接池为新 goroutine 开新连接时,拿到的是一个没跑过 AutoMigrate 的空库。

修复:测试 helper 建库后锁单连接,生产文件库不受影响:

sqlDB, _ := db.DB()
sqlDB.SetMaxOpenConns(1) // :memory: 每连接独立库,异步写复用同一连接

预防:测试涉及「后台 goroutine 写库」时一律加此设置(参照 internal/api/router_test.go 与 internal/service 各测试 helper);异步写路径同时拆出同步内核函数(如 record / Record)供测试直调断言。