Go 代码测试

2019/02/11 Go

Go 有一个由go test命令和testing包组成的轻量级测试框架。testing包为 Go 包提供自动化测试支持,并和go test命令配合使用,自动运行符合以下形式的任意函数:

func TestXxx(*testing.T)

被测试函数Xxx首字母为大写。在测试函数中使用ErrorFail或相关方法来标记失败。如果测试函数调用一个失败的函数,如t.Error或者t.Fail,则认为测试失败。

测试文件以_test.go结尾,该文件包含名为TestXxx、签名为func (t *testing.T)的函数,测试文件与被测试文件放在同一个包中。测试文件在一般的包编译时 被忽略,在运行go test命令时才会被使用。

以下是一个完整的例子,创建一个stringutil包,包文件有reverse.goreverse_test.goreverse.go文件为普通的包文件,代码如下:

package stringutil

func Reverse(s string) string {
    r := []rune(s)
    for i, j := 0, len(r) - 1; i < len(r) / 2; i, j = i + 1, j - 1 {
        r[i], r[j] = r[j], r[i]
    }
    return string(r)
}

reverse_test.go文件为reverse.go的测试文件,代码如下:

package stringutil

import (
    "testing"
)

func TestReverse(t *testing.T) {
    cases := []struct {
        in, want string
    }{
        {"Hello, world", "AAAdlrow ,olleH"},
        {"Hello, 世界", "界世 ,olleH"},
        {"", ""},
    }
    for _, c := range cases {
        got := Reverse(c.in)
        if got != c.want {
            t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want)
        }
    }
}

如上所示,TestReverse函数为Reverse函数的测试函数。现在可以进入stringutil目录,运行以下命令:

$ go test
PASS
ok      github.com/lwlwilliam/stringutil        0.199s

如果要测试的所有函数都运行正常,则会显示如上信息,否则会提示错误。

Search

    Table of Contents