表驱动单元测试

这种类型的测试是用于使用预定义输入和输出值进行测试的常用技术。

使用内容创建名为 main.go 的文件:

package main

import (
    "fmt"
)

func main() {
    fmt.Println(Sum(4, 5))
}

func Sum(a, b int) int {
    return a + b
}

运行后,你将看到输出为 9。虽然 Sum 函数看起来很简单,但测试代码是个好主意。为此,我们在与 main.go 相同的文件夹中创建另一个名为 main_test.go 的文件,其中包含以下代码:

package main

import (
    "testing"
)

// Test methods start with Test
func TestSum(t *testing.T) {
    // Note that the data variable is of type array of anonymous struct,
    // which is very handy for writing table-driven unit tests.
    data := []struct {
        a, b, res int
    }{
        {1, 2, 3},
        {0, 0, 0},
        {1, -1, 0},
        {2, 3, 5},
        {1000, 234, 1234},
    }

    for _, d := range data {
        if got := Sum(d.a, d.b); got != d.res {
            t.Errorf("Sum(%d, %d) == %d, want %d", d.a, d.b, got, d.res)
        }
    }
}

如你所见,创建了一片匿名结构,每个结构都有一组输入和预期结果。这允许在一个地方一起创建大量测试用例,然后在循环中执行,减少代码重复并提高清晰度。