表格驱动测试通过结构体切片集中管理多场景用例,循环执行并验证输入输出,提升Go测试的可读性与可维护性。

在Go语言中,表格驱动测试是一种常见且高效的测试模式,特别适合对多个输入输出场景进行验证。它通过定义一个包含测试用例的切片(通常为结构体切片),然后循环执行每个用例,从而避免重复代码。
为什么使用表格驱动测试
当一个函数需要覆盖多种输入情况时,比如边界值、错误输入、正常流程等,如果每个情况都写一个独立测试函数,会显得冗长且难以维护。表格驱动测试将所有用例集中管理,提升可读性和可扩展性。
基本结构示例
假设我们有一个函数 IsEven,用于判断整数是否为偶数:
func IsEven(n int) bool { return n%2 == 0}
对应的表格驱动测试可以这样写:
立即学习“go语言免费学习笔记(深入)”;
大师兄智慧家政
58到家打造的AI智能营销工具
99 查看详情
func TestIsEven(t *testing.T) { tests := []struct { name string input int expected bool }{ {"positive even", 4, true}, {"positive odd", 3, false}, {"negative even", -2, true}, {"negative odd", -3, false}, {"zero", 0, true}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result := IsEven(tt.input) if result != tt.expected { t.Errorf("IsEven(%d) = %v; expected %v", tt.input, result, tt.expected) } }) }}
说明:
使用匿名结构体定义测试用例,包含描述、输入和期望输出。 t.Run 为每个用例创建子测试,便于定位失败用例。 循环遍历所有测试用例,逐个验证结果。
处理错误返回的场景
对于返回错误的函数,比如解析字符串为百分比:
func ParsePercentage(s string) (int, error) { if strings.HasSuffix(s, "%") { i, err := strconv.Atoi(s[:len(s)-1]) if err != nil { return 0, err } if i 100 { return 0, fmt.Errorf("out of range") } return i, nil } return 0, fmt.Errorf("invalid format")}
测试可以这样设计:
func TestParsePercentage(t *testing.T) { tests := []struct { name string input string expected int wantErr bool }{ {"valid percent", "50%", 50, false}, {"max value", "100%", 100, false}, {"min value", "0%", 0, false}, {"invalid number", "abc%", 0, true}, {"out of range", "150%", 0, true}, {"missing percent sign", "50", 0, true}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { result, err := ParsePercentage(tt.input) if (err != nil) != tt.wantErr { t.Fatalf("ParsePercentage(%q): unexpected error presence = %v", tt.input, err) } if !tt.wantErr && result != tt.expected { t.Errorf("ParsePercentage(%q) = %d; expected %d", tt.input, result, tt.expected) } }) }}
关键点:
增加 wantErr 字段标识是否预期出错。 使用 t.Fatalf 在错误状态不匹配时提前终止,避免后续断言误报。基本上就这些。表格驱动测试让Go的单元测试更简洁、清晰,尤其适合数据密集型逻辑验证。
以上就是Golang测试表格驱动方法使用示例的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1108318.html
微信扫一扫
支付宝扫一扫