在Golang的单元测试场景中,assert是常用的断言工具,能够帮助开发者快速验证函数的返回结果、变量的状态是否符合预期,避免手动编写大量if判断逻辑。相比原生的testing包,assert提供了更简洁的API和更清晰的错误提示,大幅降低测试代码的复杂度。

assert库的安装与引入
常用的assert库是github.com/stretchr/testify/assert,使用前需要先安装依赖,执行以下命令完成安装:
go get github.com/stretchr/testify/assert
安装完成后,在测试文件中引入对应的包即可使用:
package main
import (
"testing"
"github.com/stretchr/testify/assert"
)
常用断言函数使用
基础相等性断言
Equal和NotEqual是最常用的断言函数,用于验证两个值是否相等或不相等,示例代码如下:
func TestEqual(t *testing.T) {
// 验证两个整型值相等
assert.Equal(t, 10, add(3, 7), "3加7的结果应该等于10")
// 验证两个字符串不相等
assert.NotEqual(t, "hello", "world", "两个字符串内容不同")
}
// 待测试的加法函数
func add(a, b int) int {
return a + b
}
布尔值断言
True和False函数用于验证表达式的布尔结果是否符合预期:
func TestBool(t *testing.T) {
result := isPositive(5)
// 验证结果为true
assert.True(t, result, "5是正数,结果应该为true")
// 验证结果为false
assert.False(t, isPositive(-3), "-3不是正数,结果应该为false")
}
func isPositive(num int) bool {
return num > 0
}
空值与非空值断言
Nil和NotNil用于验证变量是否为nil,适合检查指针、切片、映射等类型的状态:
func TestNil(t *testing.T) {
var slice []int
// 验证切片为nil
assert.Nil(t, slice, "未初始化的切片应该为nil")
slice = append(slice, 1)
// 验证切片不为nil
assert.NotNil(t, slice, "添加元素后的切片不为nil")
}
错误断言
NoError和Error用于验证函数返回的错误是否符合预期:
func TestError(t *testing.T) {
// 验证没有返回错误
result, err := divide(10, 2)
assert.NoError(t, err, "正常除法不应该返回错误")
assert.Equal(t, 5, result)
// 验证返回了错误
_, err = divide(10, 0)
assert.Error(t, err, "除数为0应该返回错误")
}
func divide(a, b int) (int, error) {
if b == 0 {
return 0, fmt.Errorf("除数不能为0")
}
return a / b, nil
}
自定义断言消息
所有断言函数的最后一个参数都是可选的自定义消息,当断言失败时,该消息会显示在测试结果中,帮助快速定位问题:
func TestCustomMsg(t *testing.T) {
user := getUserById(1)
// 自定义失败提示
assert.NotNil(t, user, "ID为1的用户应该存在,查询结果为空")
if user != nil {
assert.Equal(t, "张三", user.Name, "ID为1的用户姓名应该是张三")
}
}
type User struct {
Id int
Name string
}
func getUserById(id int) *User {
if id == 1 {
return &User{Id: 1, Name: "张三"}
}
return nil
}
断言失败后的执行控制
默认情况下,断言失败只会标记测试失败,不会终止测试函数执行。如果需要断言失败时立即终止后续测试逻辑,可以使用assert的FailNow相关方法,或者使用require包(同属testify库):
func TestFailNow(t *testing.T) {
// 使用require包,断言失败会直接终止测试
require.Equal(t, 10, add(3, 7), "结果不符合预期,终止测试")
// 如果上面的断言失败,下面的代码不会执行
t.Log("测试继续执行")
}
实践注意事项
- 断言消息尽量清晰明确,说明预期和实际的情况,方便定位问题
- 不要过度使用断言,只验证核心逻辑的正确性,避免无关断言增加测试维护成本
- 对于复杂的断言逻辑,可以封装成自定义的断言函数,提升代码复用性
- 测试函数需要以Test开头,参数为*testing.T,否则不会被go test命令识别执行