OOro

测试矩阵

本地测试命令、三数据库集成测试、race、benchmark、examples 和 docs 构建检查。

Oro 的测试目标是保证 SQLite、MySQL、PostgreSQL 三个首期驱动行为一致。测试文档参考主流 ORM 的方式,把“如何跑”和“覆盖什么”分开写清楚。

Go 版本

项目目标 Go 版本是 go1.27rc1

source ~/.gvm/scripts/gvm
gvm use go1.27rc1
go version

如果本地没有 gvm,可以直接使用兼容的 Go 1.27 工具链。

基础测试

go test ./...

这是提交前最低要求,覆盖根包、内部包、官方驱动包和 examples 的编译测试。

Race 测试

go test -race ./...

Race 测试会更慢,但适合改动连接池、缓存、事件、关系预加载、分片路由等并发相关代码后执行。

官方驱动测试

go test ./driver/sqlite
go test ./driver/mysql
go test ./driver/pgsql

SQLite 测试默认可直接运行。MySQL 和 PostgreSQL 需要本地数据库。

本地数据库配置

默认测试配置:

驱动 Host 用户 密码 数据库
MySQL localhost root root duxorm
PostgreSQL localhost root duxorm

可以通过环境变量覆盖:

export ORO_MYSQL_DSN='root:root@tcp(localhost:3306)/duxorm?parseTime=true&multiStatements=false'
export ORO_PGSQL_DSN='postgres://root@localhost:5432/duxorm?sslmode=disable'

再运行:

go test ./driver/mysql ./driver/pgsql

共享行为矩阵

三数据库集成测试覆盖这些共享行为:

分类 覆盖点
结构同步 建表、加字段、索引、唯一索引、全文索引、快照、危险变更拒绝
模型 CRUD CreateCreateManyCreateManyResultFindFirstGetUpdateDelete
裸表 CRUD Tableoro.MapMapTo[T]、批量写入、返回主键
默认值/null 数据库默认值、OmitOnlyoro.Null[T]、时间字段
查询条件 WhereFieldWhereGroupWhereWhenWhereRaw、列比较
高级查询 Select、聚合、GroupByHaving、排序、分页、子查询
Join inner/left/right/full/cross join、join alias、join 条件
事务 TransactionBegin、嵌套事务、savepoint、rollback、重试
LockForUpdateLockForShareNoWaitSkipLocked 能力差异
关系 BelongsToHasOneHasManyManyToMany、动态关系
预加载 With、多级预加载、回调过滤、跨连接加载
关系查询 ForWhereHasWhereDoesntHave、数量条件
关系写入 AttachDetachSyncSetClear、pivot 字段
JSON/全文 JSON path 条件、JSON contains、全文 match/score
多租户/分片 租户字段注入、租户路由、分片路由、跨分片限制
缓存/事件 查询缓存、标签失效、Hook、事件、SQL 日志事件
序列化 Serialize、Hidden、JSON tag、已加载关系、循环保护

Examples 验证

示例目录用于保证 README 和文档里的基本用法可运行。

go run ./examples/quickstart
go run ./examples/crud
go run ./examples/relations
go run ./examples/transactions
go run ./examples/multi-driver

如果某个示例依赖具体数据库,先确认本地 DSN 和驱动 import。

文档构建

文档使用 Astro + Vela,包管理器是 pnpm。

cd docs
pnpm install
pnpm run build

不要使用 npm 生成 lock 文件。

Benchmark

benchmark 位于独立模块。发布级性能参考使用同一数据库驱动、10 轮运行和中位数口径:

cd benchmarks/ormbench
ORO_BENCH_DRIVER=sqlite ORO_BENCH_SQLITE_DRIVER=mattn \
  go test -bench=. -benchmem -run '^$' -benchtime=1s -count=10 -timeout=0
ORO_BENCH_DRIVER=mysql \
  go test -bench=. -benchmem -run '^$' -benchtime=1s -count=10 -timeout=0
ORO_BENCH_DRIVER=pgsql \
  go test -bench=. -benchmem -run '^$' -benchtime=1s -count=10 -timeout=0

快速冒烟可以使用较短时间:

COUNT=1 BENTIME=100ms ./run.sh

benchmark 主要用于比较同一台机器、同一数据库配置、同一数据库驱动下的相对表现。不同机器、数据库配置和驱动实现会影响结果。

改动后该跑什么

改动类型 建议命令
普通根包逻辑 go test ./...
查询编译、字段映射 go test ./... + 三驱动测试
驱动方言 go test ./driver/sqlite ./driver/mysql ./driver/pgsql
并发、缓存、连接池 go test -race ./...
性能优化 cd benchmarks/ormbench && ORO_BENCH_DRIVER=sqlite ORO_BENCH_SQLITE_DRIVER=mattn go test -bench=. -benchmem -run '^$' -benchtime=1s -count=10 -timeout=0
文档改动 cd docs && pnpm run build
示例改动 go run ./examples/... 分目录执行

测试数据安全

MySQL/PostgreSQL 集成测试会操作 duxorm 数据库中的测试表。不要把测试 DSN 指向生产库。

建议本地准备专用数据库:

create database duxorm;

CI 环境应使用一次性数据库或容器数据库。

第三方驱动测试建议

第三方 SQL 驱动至少应复用官方驱动 smoke 测试思路,覆盖:

  • Sync 建表和加字段;
  • 模型和裸表 CRUD;
  • 批量创建和主键回填;
  • WhereJoin、子查询、聚合;
  • 事务和 savepoint;
  • 错误转换;
  • JSON/全文能力如果声明支持,也必须有测试。

Capabilities 声明什么,就应该测试什么。

编辑此页