t.Run用于创建子测试,每个子测试独立运行并报告结果。通过表驱动测试结合t.Run可提升测试可读性和维护性,支持并行执行(t.Parallel)、条件跳过或终止(t.Skip/t.Fatal)。子测试名称应清晰描述场景,可用嵌套结构组织逻辑,如测试不同HTTP路由。合理使用t.Run能使测试更模块化、便于定位问题。

在Go语言中,使用
t.Run
可以方便地实现子测试(subtests),这有助于组织测试用例、提高可读性,并支持更灵活的测试控制。每个子测试独立运行,能单独通过或失败,便于定位问题。
基本用法:t.Run 创建子测试
通过
*testing.T
的
Run
方法,可以为不同的测试场景创建子测试。每个子测试有唯一名称,且会单独报告结果。
func TestAdd(t *testing.T) { tests := map[string]struct { a, b, expected int }{ "positive numbers": {1, 2, 3}, "negative numbers": {-1, -2, -3}, "zero values": {0, 0, 0}, }for name, tc := range tests { t.Run(name, func(t *testing.T) { result := Add(tc.a, tc.b) if result != tc.expected { t.Errorf("got %d, want %d", result, tc.expected) } })}
}
上述代码中,每个测试用例作为子测试运行。若某个用例失败,其他仍会继续执行,且输出会清晰标明是哪个子测试出错。
立即学习“go语言免费学习笔记(深入)”;
优点:隔离与控制
子测试具有独立的生命周期,支持使用
t.Parallel()
并行运行,也能在特定条件下跳过或标记失败。
调用
t.Parallel()
可使多个子测试并行执行,提升测试效率使用
t.Skip()
或
t.Fatal()
仅影响当前子测试,不会中断外部测试函数
t.Run("parallel test", func(t *testing.T) { t.Parallel() // 模拟耗时测试 time.Sleep(100 * time.Millisecond) if Add(2, 3) != 5 { t.Error("expected 5") }})
命名建议与结构组织
子测试名称应清晰表达测试意图,推荐使用描述性字符串。对于复杂结构,可通过层级嵌套进一步划分逻辑。
名称避免空格,可用连字符或下划线分隔,如 "valid_input" 或 "invalid-auth"可在表驱动测试中结合范围循环,动态生成子测试
例如,在测试API路由时:
t.Run("router", func(t *testing.T) { r := NewRouter() t.Run("GET /users", func(t *testing.T) { req := httptest.NewRequest("GET", "/users", nil) // 测试逻辑... }) t.Run("POST /users", func(t *testing.T) { req := httptest.NewRequest("POST", "/users", nil) // 测试逻辑... })})
基本上就这些。合理使用
t.Run
能让测试更模块化、易维护,尤其适合需要多场景验证的函数或方法。
以上就是Golang使用t.Run实现子测试方法的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1407814.html
微信扫一扫
支付宝扫一扫