testify/assert库通过提供Equal、Error、Nil等丰富断言函数,简化了Go测试中结果验证的代码,相比标准库手动编写if判断和t.Errorf,其断言失败时能自动生成包含预期值与实际值差异的清晰错误信息,使测试代码更简洁、易读且易于维护。

在Go语言中进行测试时,对函数或方法的返回结果进行断言是核心环节。虽然标准库
testing
testify/assert
要使用
testify/assert
go get github.com/stretchr/testify/assert
安装完成后,在你的测试文件中,你可以像这样使用它:
package main
import (
"errors"
"testing"
"github.com/stretchr/testify/assert" // 引入assert包
)
// 假设我们有一个简单的函数需要测试
func Add(a, b int) int {
return a + b
}
func Divide(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("cannot divide by zero")
}
return a / b, nil
}
// 这是一个使用 testify/assert 的测试示例
func TestAdd(t *testing.T) {
// assert.Equal 检查两个值是否相等
assert.Equal(t, 5, Add(2, 3), "2 + 3 应该等于 5") // 最后一个参数是可选的失败消息
assert.Equal(t, 0, Add(-1, 1), "负数和正数相加")
}
func TestDivide(t *testing.T) {
// 测试正常除法
result, err := Divide(10, 2)
assert.NoError(t, err, "10 除以 2 不应该有错误") // 检查错误是否为 nil
assert.Equal(t, 5, result, "10 除以 2 应该等于 5")
// 测试除以零的情况
result, err = Divide(10, 0)
assert.Error(t, err, "10 除以 0 应该有错误") // 检查错误是否不为 nil
assert.Contains(t, err.Error(), "cannot divide by zero", "错误信息应包含特定字符串") // 检查错误信息内容
assert.Equal(t, 0, result, "除以零时结果应为 0")
}
// 还可以使用 assert.True, assert.False, assert.Nil, assert.NotNil 等
func TestBooleanAndNil(t *testing.T) {
var ptr *int
assert.Nil(t, ptr, "指针应该为 nil")
val := 10
ptr = &val
assert.NotNil(t, ptr, "指针不应该为 nil")
assert.True(t, 1 > 0, "1 应该大于 0")
assert.False(t, 1 == 0, "1 不应该等于 0")
}通过这些断言函数,你的测试代码不仅简洁,而且当测试失败时,
testify/assert
t.Errorf
立即学习“go语言免费学习笔记(深入)”;
这其实是一个很经典的权衡问题,就像你选择用手工刀切菜还是用切菜机一样。Go标准库的
testing
*testing.T
t.Errorf
t.Fatal
想象一下,如果你要断言一个值是否等于另一个,你可能需要写:
actual := MyFunction()
expected := "some_value"
if actual != expected {
t.Errorf("Expected %s, got %s", expected, actual)
}这没毛病,对吧?但如果你有十几个甚至几十个这样的断言,你的测试文件很快就会被大量的
if
而
testify/assert
assert.Equal(t, expected, actual)
testify/assert
testify/assert
这里列举一些最常用的:
相等性断言:
assert.Equal(t, expected, actual, msg...)
assert.NotEqual(t, expected, actual, msg...)
assert.Exactly(t, expected, actual, msg...)
assert.InDelta(t, expected, actual, delta, msg...)
assert.ElementsMatch(t, expected, actual, msg...)
assert.Contains(t, haystack, needle, msg...)
haystack
needle
assert.Subset(t, list, subset, msg...)
subset
list
布尔值/空值断言:
assert.True(t, condition, msg...)
assert.False(t, condition, msg...)
assert.Nil(t, object, msg...)
nil
assert.NotNil(t, object, msg...)
nil
assert.Empty(t, object, msg...)
assert.NotEmpty(t, object, msg...)
错误断言:
assert.NoError(t, err, msg...)
nil
assert.Error(t, err, msg...)
nil
assert.ErrorContains(t, err, contains, msg...)
assert.ErrorIs(t, err, target, msg...)
errors.Is
assert.ErrorAs(t, err, target, msg...)
errors.As
恐慌(Panic)断言:
assert.Panics(t, func, msg...)
panic
assert.NotPanics(t, func, msg...)
panic
高效使用技巧:
nil
assert.Nil
assert.Equal(t, nil, obj)
msg
assert.Equal(t, 5, result, "计算结果不正确,预期是5")
assert
testify/assert
虽然
testify/assert
assert.Equal
assert.Equal
assert.Equal
assert.Equal
assert.DeepEqual
Equal
assert.True(t, actual.Equal(expected))
错误断言的粒度: 仅仅使用
assert.Error(t, err)
assert.NoError(t, err)
assert.ErrorContains(t, err, "specific message")
errors.Is
errors.As
assert.ErrorIs(t, err, targetErr)
assert.ErrorAs(t, err, &targetType)
过度依赖 assert.Panics
assert.Panics
panic
panic
assert.Panics
测试的粒度和可读性:
testify/assert
与 testify/suite
testify
assert
suite
suite
assert
总的来说,
testify/assert
以上就是Golang测试结果断言 使用testify/assert的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号