Go单元测试与集成测试
单元测试
单元测试聚焦于独立代码单元的验证(通常是一个函数或方法),特点:
- 隔离性:使用mock/stub隔离外部依赖
- 快速执行:通常在毫秒级完成
- 高频运行:开发过程中持续执行
示例代码:
// math.go
func Add(a, b int) int {
return a + b
}
// math_test.go
func TestAdd(t *testing.T) {
tests := []struct {
a, b, want int
}{
{2, 3, 5},
{-1, 1, 0},
{0, 0, 0},
}
for _, tt := range tests {
got := Add(tt.a, tt.b)
if got != tt.want {
t.Errorf("Add(%d, %d) = %d; want %d", tt.a, tt.b, got, tt.want)
}
}
}
执行命令:
go test -v -run TestAdd
集成测试
集成测试验证多个组件的协同工作,特点:
- 真实依赖:使用数据库、网络等真实服务
- 环境要求:需要预配置测试环境
- 执行较慢:可能需秒级或分钟级完成
示例代码:
// db_integration_test.go
func TestUserCRUD(t *testing.T) {
// 初始化真实数据库连接
db := setupTestDB()
defer db.Close()
// 测试用户创建
user := User{Name: "Alice"}
if err := db.CreateUser(&user); err != nil {
t.Fatalf("Create failed: %v", err)
}
// 测试用户查询
got, err := db.GetUser(user.ID)
if err != nil || got.Name != "Alice" {
t.Errorf("GetUser failed: got %v, error %v", got, err)
}
}
执行命令:
go test -tags=integration -v
关键差异对比
| 特性 | 单元测试 | 集成测试 |
|---|---|---|
| 测试范围 | 单个函数/方法 | 多组件交互 |
| 外部依赖 | 模拟(mock) | 真实服务 |
| 执行速度 | 毫秒级 | 秒/分钟级 |
| 运行频率 | 每次代码变更 | 提交/部署前 |
| 失败定位 | 精确到具体代码行 | 需排查交互链路 |
最佳实践
- 分层策略:
- 单元测试覆盖率应 $$ \geq 80% $$
- 关键路径配置集成测试
- 命名规范:
- 单元测试:
Test[函数名] - 集成测试:
Test[功能]_Integration
- 单元测试:
- 工具选择:
- Mock工具:testify
- 测试框架:标准库
testing+httptest - 覆盖率:
go test -coverprofile=coverage.out
推荐模式:测试金字塔 - 单元测试为基础(70%),集成测试为中间层(20%),端到端测试为顶层(10%)
894

被折叠的 条评论
为什么被折叠?



