测试
测试策略
三层各有独立测试,互不耦合:
| 层 | 测试方式 | 依赖 |
|---|---|---|
| repository | PostgreSQL 测试数据库 | 真实 DB |
| service | mock repository | 内存 mock |
| handler | mock service | 内存 mock |
运行测试
# 全部测试(需要 PostgreSQL)
go test ./...
# 指定包
go test ./repository/...
go test ./service/...
go test ./handler/...
# 显示详细输出
go test -v ./...
# 运行单个测试
go test -run TestEmployeeService_Create ./service/...
测试数据库配置
Repository 测试需要 PostgreSQL。通过环境变量配置:
| 变量 | 默认值 | 说明 |
|---|---|---|
| TEST_DB_HOST | localhost | 测试数据库主机 |
| TEST_DB_PORT | 5432 | 测试数据库端口 |
| TEST_DB_USER | postgres | 测试数据库用户 |
| TEST_DB_PASSWORD | postgres | 测试数据库密码 |
| TEST_DB_NAME | hr_test | 测试数据库名 |
| TEST_DB_SSLMODE | disable | SSL 模式 |
如果没有可用的 PostgreSQL,测试会自动跳过(t.Skip)。
每个测试开始前清空 employees 和 departments 表,保证测试之间互不影响。
用 docker-compose 运行测试
# 启动数据库
docker compose up -d db
# 创建测试数据库
docker compose exec db psql -U postgres -c "CREATE DATABASE hr_test;"
# 运行测试
go test ./...
# 关闭
docker compose down
Repository 测试
使用真实 PostgreSQL 数据库。测试辅助函数定义在 repository/test_helpers.go:
setupTestDB(t)— 连接测试数据库,清空表,执行迁移seedDept(t, db, name)— 插入测试部门seedEmployee(t, db, name, email, deptID)— 插入测试员工
Service 测试
使用 mock 实现,不依赖数据库。通过接口 mock 可以控制 repository 的行为,专注测试业务逻辑。
Handler 测试
使用 mock service,通过 httptest 模拟 HTTP 请求。测试请求解析、响应格式、错误映射。
添加新测试
以添加 Position 实体为例:
repository/position_repo_test.go— 用测试数据库测试 CRUDservice/position_service_test.go— 用 mock repo 测试业务逻辑handler/position_handler_test.go— 用 mock service 测试 HTTP 层