[Translation]Golang中的表驱动测试

Wzy_CC · · 425 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

翻译自<Table driven tests in Go> by Alex Pliutau 2018/08/07

原文链接

practice-go中我们经常使用表驱动测试来测试所有可能的函数使用场景。例如FindAnagrams()函数对于给定输入返回字典中找到的字谜列表。

为了能够正确测试FindAnagrams()函数,我们需要测试各种情况,例如空输入,有效输入,无效输入等。我们可以修改不同断言来实现测试,但是使用表测试要容易得多。

假设有以下函数:

FindAnagrams(string word) []string
复制代码

这是“表”看起来的样子:

var tests = []struct {
	name string
	word string
	want []string
}{
	{"empty input string", "", []string{}},
	{"two anagrams", "Protectionism", []string{"Cite no imports", "Nice to imports"}},
	{"input with space", "Real fun", []string{"funeral"}},
}
复制代码

通常,表是匿名结构体数组切片,可以定义结构体或使用已经存在的结构进行结构体数组声明。name属性用来描述特定的测试用例。

有了表之后,我们可以简单地进行迭代和断言:

func TestFindAnagrams(t *testing.T) {
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got := FindAnagrams(tt.word)
			if got != tt.want {
				t.Errorf("FindAnagrams(%s) got %v, want %v", tt.word, got, tt.want)
			}
		})
	}
}
复制代码

可以使用其他函数代替t.Errorf()函数,t.Errorf()仅仅记录错误并继续测试。

在Go中很流行的Testify断言包使单元测试明确,比如:

assert.Equal(t, got, tt.want, "they should be equal")
复制代码

t.Run()将启动一个子测试,并且如果您以详细模式运行测试( go test -v),您将看到每个子测试结果:

=== RUN   TestFindAnagrams
=== RUN   TestFindAnagrams/empty_input_string
=== RUN   TestFindAnagrams/two_anagrams
=== RUN   TestFindAnagrams/input_with_space
复制代码

由于Go 1.7测试包允许使用(*testing.T).Parallel()来并行子测试。请确保并行化测试是有意义的!

t.Run(tt.name, func(subtest *testing.T) {
	subtest.Parallel()
	got := FindAnagrams(tt.word)
	// assertion
})
复制代码

就是这样,享受在Go中进行表驱动测试吧!


有疑问加站长微信联系(非本文作者)

本文来自:掘金

感谢作者:Wzy_CC

查看原文:[Translation]Golang中的表驱动测试

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

425 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传