返回介绍

上卷 程序设计

中卷 标准库

下卷 运行时

源码剖析

附录

12.1.2 表驱动

发布于 2024-10-12 19:15:50 字数 955 浏览 0 评论 0 收藏 0

表驱动(table driven)将数据和逻辑分离,便于维护和扩展。

  • 子测试,确保所有数据被测试。(不会因错误中断)
  • 并行子测试,提高效率。
  • 建议用相同命名,规范化。(让维护数据的人更易读)
  • 使用短名 want/got 要比 expected/actual 易读。
  • 输出信息应该面向自然阅读。
func add(x, y int) int {
	return x + y
}

func TestAdd(t *testing.T) {
    
    // 数据表
	var tests = []struct {
		x    int
		y    int
		want int
	}{
		{1, 1, 2},
		{2, 2, 6},
		{3, 2, 5},
	}

    // 测试
	for _, tt := range tests {
        
        // 规避闭包延迟。
		o := tt 
        
        // 并发子测试。
		t.Run("", func(t *testing.T) {
			t.Parallel()

            // 测试逻辑,匹配参数和结果。
			got := add(o.x, o.y)
			if got != o.want {
				t.Errorf("add(%d, %d): want %d, got %d", o.x, o.y, o.want, got)
			}
		})
	}
}
$ go test -run "Add"

--- FAIL: TestAdd (0.00s)
    --- FAIL: TestAdd/#01 (0.00s)
    
        main_test.go:29: add(2, 2): want 6, got 4
        
FAIL
exit status 1
FAIL	test	0.005s

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文