单元测试

单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般要根据实际情况去判定其具体含义,如 C语言中单元指一个函数,Java 里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。

单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。

Go test

Go语言拥有一套单元测试和性能测试系统,仅需要添加很少的代码就可以快速测试一段需求代码。

自带了测试框架和工具,在testing包中,以便完成单元测试(T类型)和性能测试(B类型)。

使用go test 命令,会自动读取源码目录下面名为 *_test.go 的文件,生成并运行测试用的可执行文件。输出的信息类似

1
2
3
ok archive/tar 0.011s
FAIL archive/zip 0.022s
ok compress/gzip 0.033s

同时,性能测试系统可以给出代码的性能数据,帮助测试者分析性能问题。

单元测试,需要准备一个 go 源码文件,在命名文件时需要让文件必须以_test结尾。默认的情况下,go test 命令不需要任何的参数,它会自动把你源码包下面所有 test 文件测试完毕,当然你也可以带上参数。

这里介绍几个常用的参数:

  • -bench regexp 执行相应的 benchmarks,例如 -bench=.
  • -cover 开启测试覆盖率
  • -run regexp 只运行 regexp 匹配的函数,例如 -run=Array 那么就执行包含有 Array 开头的函数
  • -v 显示测试的详细命令

单元测试源码文件可以由多个测试用例组成,每个测试用例函数需要以Test为前缀。例如:

1
func TestXXX( t *testing.T )
  • 测试用例文件不会参与正常源码编译,不会被包含到可执行文件中。
  • 测试用例文件使用 go test 指令来执行,没有也不需要 main() 作为函数入口。所有在以_test结尾的源码内以Test开头的函数会自动被执行。
  • 测试用例可以不传入 *testing.T 参数。

Demo

1
2
3
4
5
6
7
package main_test

import "testing"

func TestHelloWorld(t *testing.T){
t.Log("hello world")
}

测试

1
2
go test helloworld_test.go 
# ok command-line-arguments 0.003s
1
go test -v helloworld_test.go

显示

1
2
3
4
5
6
=== RUN   TestHelloWorld
--- PASS: TestHelloWorld (0.00s)
helloworld_test.go:6: hello world
PASS
ok command-line-arguments 0.005s

代码说明如下:

  • 第 1 行,在 go test 后跟 helloworld_test.go 文件,表示测试这个文件里的所有测试用例。
  • 第 2 行,显示测试结果,ok 表示测试通过,command-line-arguments 是测试用例需要用到的一个包名,0.003s 表示测试花费的时间。
  • 第 3 行,显示在附加参数中添加了-v,可以让测试时显示详细的流程。
  • 第 4 行,表示开始运行名叫 TestHelloWorld 的测试用例。
  • 第 5 行,表示已经运行完 TestHelloWorld 的测试用例,PASS 表示测试成功。
  • 第 6 行打印字符串 hello world。

go test 指定文件时默认执行文件内的所有测试用例。可以使用-run参数选择需要的测试用例单独执行。这个是十分有用的。

性能测试

基准测试——获得代码内存占用和运行效率的性能数据。

1
2
3
4
5
6
func Benchmark_Add(b *testing.B) {
var n int
for i := 0; i < b.N; i++ {
n++
}
}

测试 -bench

1
go test -v -bench=. helloworld_test.go
1
2
3
4
5
6
7
8
=== RUN   TestHelloWorld
--- PASS: TestHelloWorld (0.00s)
helloworld_test.go:6: hello world
goos: darwin
goarch: amd64
Benchmark_Add-4 1000000000 0.302 ns/op
PASS
ok command-line-arguments 0.362s
  • -bench=.表示运行 benchmark_test.go 文件里的所有基准测试,和单元测试中的-run类似
  • 1000000000 表示测试的次数。.302 ns/op,表示每一个操作耗费多少时间(纳秒)。

Windows 下使用 go test 命令行时,-bench=.应写为-bench="."

参考文档

http://c.biancheng.net/view/124.html