Go语言中表驱动的测试
编写一个测试用于测试strings.Compare函数。
首先了解一下strings.Compare。Compare()函数是Go的内置包strings的一个函数,用于按字典顺序比较两个字符串(按字母顺序排列单词的顺序),返回一个整数值。
用法:
func Compare(s1, s2 string) int
如果字符串相等(s1 == s2),则返回0
如果字符串1大于字符串2(s1> s2),则返回1。
如果字符串1小于字符串2,则返回-1(s1 <s2)
现在开始编写测试代码:
import ( "strings" "testing" ) func TestCompare(t *testing.T) { var s1, s2 string var i int s1, s2 = "a", "b" i = -1 res := strings.Compare(s1, s2) if res != i { t.Errorf("want %v but compare %s %s result is %v\n", i, s1, s2, res) } s1, s2 = "a", "a" i = 0 res = strings.Compare(s1, s2) if res != i { t.Errorf("want %v but compare %s %s result is %v\n", i, s1, s2, res) } s1, s2 = "a", "ab" i = -1 res = strings.Compare(s1, s2) if res != i { t.Errorf("want %v but compare %s %s result is %v\n", i, s1, s2, res) } } $ go test -v . === RUN TestCompare --- PASS: TestCompare (0.00s) PASS ok github.com/demo/test-demo 2.743s
该示例中使用了三组预置测试数据对目标函数strings.Compare进行测试。代码逻辑非常简单,针对每组测试数据分别调用Compare函数并对函数结果进行比较。但是代码略显冗长,如果测试数据增加,测试函数将变的庞大、重复且编写费时费力。
下面对上述测试代码进行优化:
import ( "strings" "testing" ) func TestCompare(t *testing.T) { var testData = []struct { s1, s2 string i int }{ {"a", "b", -1}, {"a", "a", 0}, {"a", "ab", -1}, } for _, td := range testData { res := strings.Compare(td.s1, td.s2) if res != td.i { t.Errorf("want %v but compare %s %s result is %v\n", td.i, td.s1, td.s2, res) } } } // 代码执行结果 > go test -v . === RUN TestCompare --- PASS: TestCompare (0.00s) PASS ok github.com/demo/test-demo 0.658s
通过将测试数据放入结构体类型的切片testData中,将测试中重复的逻辑合并为一个,测试代码将变的简洁、清晰。且测试代码可扩展性变强,后续增加测试数据仅需增加切片元素。
优化后的测试代码中的自定义结构体类型切片testData就是一个表,自定义结构体中的字段就是列。基于这种数据表的测试设计和实现称为“表驱动的测试”。