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就是一个表,自定义结构体中的字段就是列。基于这种数据表的测试设计和实现称为“表驱动的测试”。
查看19道真题和解析
