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

全部评论

相关推荐

投递长鑫存储等公司8个岗位
点赞 评论 收藏
分享
06-15 18:44
黄淮学院 Java
Lynn012:如果是居民楼还是算了吧,看着有点野呢
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务