上QQ阅读APP看书,第一时间看更新
42.1 Go测试代码的一般逻辑
众所周知,Go的测试函数就是一个普通的Go函数,Go仅对测试函数的函数名和函数原型有特定要求,对在测试函数TestXxx或其子测试函数(subtest)中如何编写测试逻辑并没有显式的约束。对测试失败与否的判断在于测试代码逻辑是否进入了包含Error/Errorf、Fatal/Fatalf等方法调用的代码分支。一旦进入这些分支,即代表该测试失败。不同的是Error/Errorf并不会立刻终止当前goroutine的执行,还会继续执行该goroutine后续的测试,而Fatal/Fatalf则会立刻停止当前goroutine的测试执行。
下面的测试代码示例改编自$GOROOT/src/strings/compare_test.go:
// chapter8/sources/non_table_driven_strings_test.go func TestCompare(t *testing.T) { var a, b string var i int a, b = "", "" i = 0 cmp := strings.Compare(a, b) if cmp != i { t.Errorf(`want %v, but Compare(%q, %q) = %v`, i, a, b, cmp) } a, b = "a", "" i = 1 cmp = strings.Compare(a, b) if cmp != i { t.Errorf(`want %v, but Compare(%q, %q) = %v`, i, a, b, cmp) } a, b = "", "a" i = -1 cmp = strings.Compare(a, b) if cmp != i { t.Errorf(`want %v, but Compare(%q, %q) = %v`, i, a, b, cmp) } }
上述示例中的测试函数TestCompare中使用了三组预置的测试数据对目标函数strings.Compare进行测试。每次的测试逻辑都比较简单:为被测函数/方法传入预置的测试数据,然后判断被测函数/方法的返回结果是否与预期一致,如果不一致,则测试代码逻辑进入带有testing.Errorf的分支。由此可以得出Go测试代码的一般逻辑,那就是针对给定的输入数据,比较被测函数/方法返回的实际结果值与预期值,如有差异,则通过testing包提供的相关函数输出差异信息。