Go语言精进之路:从新手到高手的编程思想、方法和技巧(2)
上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包提供的相关函数输出差异信息