go test 命令
go test
命令是一个按照一定的约定和组织来测试代码的程序。在包目录内,所有以_test.go
为后缀名的源文件在执行go build
时不会被构建成包的一部分,它们是go test
测试的一部分。
在*_test.go
文件中,有三种类型的函数:测试函数、基准测试(benchmark)函数、示例函数。
- 测试函数是以Test为函数名前缀的函数,用于测试程序的一些逻辑行为是否正确;go test命令会调用这些测试函数并报告测试结果是PASS或FAIL。
- 基准测试函数是以Benchmark为函数名前缀的函数,它们用于衡量一些函数的性能;go test命令会多次运行基准测试函数以计算一个平均的执行时间。
- 示例函数是以Example为函数名前缀的函数,提供一个由编译器保证正确性的示例文档。
go test
可以使用额外参数打印更多的信息,不过大部分IDE集成了这部分功能
参数名 | 功能 |
---|---|
-v | 打印每个测试函数的名字和运行时间 |
-run | -run = xxx对应一个正则表达式,只有测试函数名被它正确匹配的测试函数才会被go test 测试命令运行 |
-cover | 获得测试的代码覆盖率摘要 |
-bench | -bench = xxx 指定要运行的基准测试函数 |
测试函数
- 每个测试函数必须导入testing包。
- 测试函数名必须以 Test 开头
*testing.T
类型参数用于报告测试失败和附加的日志信息
func TestName(t *testing.T) {
// ...
}
表格驱动的测试
为了方便添加测试数据,我们可以将测试数据合并到一个表格之中,比如一个结构体数组中,这种测试方式称之为表格驱动的测试。
func TestBruteForce(t *testing.T) {
var tests = []struct {
s string // 主串
pattern string // 模式串
want int // 主串中匹配到的模式串的起始下标
}{
{
"abcd", "bcd", 1},
{
"abcd", "e", -1},
{
"abcd", "", 0},
}
for _, test := range tests {
if got := bruteForce(test.s, test.pattern); got != test.want {
t