测试Go函数参数边界需覆盖极值、零值、空值和非法值,使用testing库结合表驱动测试。例如测试整数运算需考虑math.MaxInt等极值,字符串需测空、超长、特殊字符,切片要覆盖nil、空、单元素等情况,通过结构体定义用例统一验证。

测试 Go 函数的参数边界条件,关键在于明确输入的合法范围,并通过单元测试覆盖极值、零值、空值和非法值。使用标准库 testing 结合表驱动测试(table-driven tests)是最有效的方式。
理解边界条件的常见类型
不同类型的参数有不同的边界情况,常见的包括:
整数类型:最小值、最大值、零、负数字符串:空字符串、超长字符串、特殊字符切片/数组:nil、空切片、单元素、超大长度指针:nil 指针、有效指针自定义结构体:字段为零值或极端值
使用表驱动测试覆盖边界值
表驱动测试能用统一结构验证多个输入,特别适合边界测试。
例如,测试一个计算切片平均值的函数:
func CalculateAverage(nums []int) (float64, error) { if len(nums) == 0 { return 0, fmt.Errorf("slice is empty") } sum := 0 for _, v := range nums { sum += v } return float64(sum) / float64(len(nums)), nil}
对应的测试可以这样写:
立即学习“go语言免费学习笔记(深入)”;
func TestCalculateAverage(t *testing.T) { tests := []struct { name string input []int want float64 expectErr bool }{ {"正常情况", []int{1, 2, 3}, 2.0, false}, {"单个元素", []int{5}, 5.0, false}, {"空切片", []int{}, 0, true}, {"nil 切片", nil, 0, true}, {"包含负数", []int{-1, 0, 1}, 0.0, false}, }for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := CalculateAverage(tt.input) if tt.expectErr { if err == nil { t.Fatalf("expected error but got none") } return } if err != nil { t.Fatalf("unexpected error: %v", err) } if math.Abs(got-tt.want) > 1e-9 { t.Errorf("got %v, want %v", got, tt.want) } })}
}
测试整数溢出与极值
当函数涉及数值运算时,需测试 math.MaxInt64、math.MinInt32 等极值。
比如一个加法函数:
func SafeAdd(a, b int) (int, error) { if (b > 0 && a > math.MaxInt-b) || (b < 0 && a < math.MinInt-b) { return 0, fmt.Errorf("overflow") } return a + b, nil}
测试时加入最大值场景:
tests := []struct { a, b int want int overflow bool}{ {math.MaxInt, 1, 0, true}, {math.MaxInt - 1, 1, math.MaxInt, false}, {0, 0, 0, false},}
处理字符串和结构体边界
对字符串长度、内容做限制的函数,要测试空串、Unicode 字符、超长字符串。
结构体则关注字段是否为零值,或嵌套结构为 nil 的情况。例如:
type User struct { Name string Age int}func ValidateUser(u *User) error {if u == nil {return fmt.Errorf("user is nil")}if u.Name == "" {return fmt.Errorf("name is required")}if u.Age < 0 {return fmt.Errorf("age cannot be negative")}return nil}
对应测试应包含 nil 指针、空名字、负年龄等边界。
基本上就这些。关键是把可能出错的输入列出来,用表驱动方式逐一验证,确保函数在异常输入下行为可控。
以上就是Golang如何测试函数参数边界条件的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1409611.html
微信扫一扫
支付宝扫一扫