go单元测试和集成测试

Go单元测试与集成测试

单元测试

单元测试聚焦于独立代码单元的验证(通常是一个函数或方法),特点:

  1. 隔离性:使用mock/stub隔离外部依赖
  2. 快速执行:通常在毫秒级完成
  3. 高频运行:开发过程中持续执行

示例代码

// 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

集成测试

集成测试验证多个组件的协同工作,特点:

  1. 真实依赖:使用数据库、网络等真实服务
  2. 环境要求:需要预配置测试环境
  3. 执行较慢:可能需秒级或分钟级完成

示例代码

// 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)真实服务
执行速度毫秒级秒/分钟级
运行频率每次代码变更提交/部署前
失败定位精确到具体代码行需排查交互链路
最佳实践
  1. 分层策略
    • 单元测试覆盖率应 $$ \geq 80% $$
    • 关键路径配置集成测试
  2. 命名规范
    • 单元测试:Test[函数名]
    • 集成测试:Test[功能]_Integration
  3. 工具选择
    • Mock工具:testify
    • 测试框架:标准库testing+httptest
    • 覆盖率:go test -coverprofile=coverage.out

推荐模式:测试金字塔 - 单元测试为基础(70%),集成测试为中间层(20%),端到端测试为顶层(10%)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值