测试

测试策略

三层各有独立测试,互不耦合:

测试方式依赖
repositoryPostgreSQL 测试数据库真实 DB
servicemock repository内存 mock
handlermock 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_HOSTlocalhost测试数据库主机
TEST_DB_PORT5432测试数据库端口
TEST_DB_USERpostgres测试数据库用户
TEST_DB_PASSWORDpostgres测试数据库密码
TEST_DB_NAMEhr_test测试数据库名
TEST_DB_SSLMODEdisableSSL 模式

如果没有可用的 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 实体为例:

  1. repository/position_repo_test.go — 用测试数据库测试 CRUD
  2. service/position_service_test.go — 用 mock repo 测试业务逻辑
  3. handler/position_handler_test.go — 用 mock service 测试 HTTP 层