Go语言go test命令的用法(非常详细)
Go语言拥有一套单元测试和性能测试系统,仅需要添加很少代码就可以快速测试代码。go test命令自动读取源码目录下面名为 *_test.go 的文件,生成并运行测试用的可执行文件。
单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
开始单元测试前,需要准备一个 go 源码文件,在命名文件时,该文件必须以 _test 结尾。在默认情况下,go test 命令不需要任何参数,它可以自动测试源码包下面所有 test 文件。
这里介绍几个 go test 命令常用的参数:
单元测试源码文件可以由多个测试用例组成,每个测试用例函数需要以 Test 为前缀,例如:
测试用例可以并发执行,使用 testing.T 提供的日志输出可以保证日志跟随这个测试上下文一起打印输出。
testing.T 提供了几种日志输出函数如下表所示:
基准测试框架对一个测试用例的默认测试时间是 1s。如果以 Benchmark 开头的基准测试用例函数返回时还不到 1s,那么 testing.B 中的 N 值将按 1、2、5、10、20、50…… 递增,同时以递增后的值重新调用基准测试用例函数。
基准测试的主要用途如下:
1) 通过 -benchtime 参数可以自定义测试时间。
2) 基准测试可以统计一段代码可能存在的内存分配,例如,有一个使用字符串格式化的函数,并在函数内部进行一些分配操作。在命令行中添加 -benchmem 参数就可以显示内存分配情况。开发者能根据这些信息迅速找到可能的分配点,对代码进行优化和调整。
3) 有些测试需要一定的启动和初始化时间,如果从 Benchmark() 函数开始计时将在很大程度上影响测试结果的精准程度。testing.B 提供了一系列的方法可以方便地控制计时器,从而让计时器只在需要的区间进行测试。
从 Benchmark() 函数开始,Timer 就开始计数。StopTimer() 函数可以停止计数过程,做一些耗时的操作,通过 StartTimer() 函数重新开始计时。ResetTimer() 函数可以重置计数器的数据。计数器内部不仅包含耗时数据,还包括内存分配的数据。
单元测试
单元测试(unit testing)是指检查和验证软件中的最小可测试单元。对于单元测试中单元的含义,一般要根据实际情况判定,如 C语言中单元指一个函数,Java 中单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
开始单元测试前,需要准备一个 go 源码文件,在命名文件时,该文件必须以 _test 结尾。在默认情况下,go test 命令不需要任何参数,它可以自动测试源码包下面所有 test 文件。
这里介绍几个 go test 命令常用的参数:
- -bench regexp:执行相应的 benchmarks,如 -bench=.;
- -cover:开启测试覆盖率;
- -run regexp:只运行 regexp 匹配的函数,如 -run=Array,仅执行以 Array 开头的函数;
- -v:显示测试的详细命令。
单元测试源码文件可以由多个测试用例组成,每个测试用例函数需要以 Test 为前缀,例如:
func TestXXX( t *testing.T )
- 测试用例文件不参与正常源码编译,不编译在可执行文件中;
- 测试用例文件使用 go test 命令执行,没有也不需要 main() 函数作为函数入口。所有在以 _test 结尾的源码中,将自动执行以 Test 开头的函数;
- 测试用例可以不传入 *testing.T 参数。
测试用例可以并发执行,使用 testing.T 提供的日志输出可以保证日志跟随这个测试上下文一起打印输出。
testing.T 提供了几种日志输出函数如下表所示:
函数名称 | 说明 |
---|---|
Log | 打印日志,同时结束测试 |
Logf | 格式化打印日志,同时结束测试 |
Error | 打印错误日志,同时结束测试 |
Errorf | 格式化打印错误日志,同时结束测试 |
Fatal | 打印致命日志,同时结束测试 |
Fatalf | 格式化打印致命日志,同时结束测试 |
基准测试
基准测试可以测试一段程序的运行性能及耗费 CPU 的程度。Go 语言基准测试框架的使用方法类似于单元测试,使用者无须准备高精度的计时器和各种分析工具,基准测试本身即可以打印出非常标准的测试报告。基准测试框架对一个测试用例的默认测试时间是 1s。如果以 Benchmark 开头的基准测试用例函数返回时还不到 1s,那么 testing.B 中的 N 值将按 1、2、5、10、20、50…… 递增,同时以递增后的值重新调用基准测试用例函数。
基准测试的主要用途如下:
1) 通过 -benchtime 参数可以自定义测试时间。
2) 基准测试可以统计一段代码可能存在的内存分配,例如,有一个使用字符串格式化的函数,并在函数内部进行一些分配操作。在命令行中添加 -benchmem 参数就可以显示内存分配情况。开发者能根据这些信息迅速找到可能的分配点,对代码进行优化和调整。
3) 有些测试需要一定的启动和初始化时间,如果从 Benchmark() 函数开始计时将在很大程度上影响测试结果的精准程度。testing.B 提供了一系列的方法可以方便地控制计时器,从而让计时器只在需要的区间进行测试。
从 Benchmark() 函数开始,Timer 就开始计数。StopTimer() 函数可以停止计数过程,做一些耗时的操作,通过 StartTimer() 函数重新开始计时。ResetTimer() 函数可以重置计数器的数据。计数器内部不仅包含耗时数据,还包括内存分配的数据。