go test命令使用
单元测试
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般要根据实际情况去判定其具体含义,如 C语言中单元指一个函数,Java 里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。
单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
Go test
Go语言拥有一套单元测试和性能测试系统,仅需要添加很少的代码就可以快速测试一段需求代码。
自带了测试框架和工具,在testing包中,以便完成单元测试(T类型)和性能测试(B类型)。
使用go test 命令,会自动读取源码目录下面名为 *_test.go 的文件,生成并运行测试用的可执行文件。输出的信息类似
1 | ok archive/tar 0.011s |
同时,性能测试系统可以给出代码的性能数据,帮助测试者分析性能问题。
单元测试,需要准备一个 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 | package main_test |
测试
1 | go test helloworld_test.go |
1 | go test -v helloworld_test.go |
显示
1 | === RUN TestHelloWorld |
代码说明如下:
- 第 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 | func Benchmark_Add(b *testing.B) { |
测试 -bench
1 | go test -v -bench=. helloworld_test.go |
1 | === RUN TestHelloWorld |
-bench=.
表示运行 benchmark_test.go 文件里的所有基准测试,和单元测试中的-run
类似- 1000000000 表示测试的次数。.302 ns/op,表示每一个操作耗费多少时间(纳秒)。
Windows 下使用 go test 命令行时,-bench=.
应写为-bench="."
。
参考文档
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 螃蟹壳!