go test [flag] flag 有:
go help testflag
查看有那些 flag:
-args
: 测试函数接收命令行参数,注意:该参数后所有参数会被当做命令行参数传递给测试用例,正确使用方式举例:go test -v -run TestFibOnce b_test.go -args "in 7" expected=13
;-c
: 将测试文件编译生成可执行函数, 加-o
指定文件名(默认文件名test.test
);- 编译:
go test -c -o test_fib.test b_test.go
; - 使用二进制文件:
./test_fib.test -test.v -test.run TestFibOnce "in=7" expected=13
测试用例同上;T -i
: 安装作为测试依赖项的软件包。不要运行测试。-json
: 以 json 格式输出。-bench regexp
:仅运行与正则表达式匹配的那些基准。多个正则表达式以/
隔开-benchtime t
: 对每个基准运行足够的迭代,以t
表示为time.Duration
(例如-benchtime 1h30s
)。- 默认值为1秒(1s)。
- 特殊语法
Nx
意味着要运行基准测试N次(例如,-benchtime 100x
)。 -count n
: 运行每个测试和基准测试n
次(默认为1)。如果设置了-cpu
,则对每个GOMAXPROCS
值运行n次。示例始终运行一次。-cover
: 覆盖率-covermode set,count,atomic
: 设置要测试的包装的覆盖率分析的模式。-cpu
: 指定应为其执行测试或基准的GOMAXPROCS值的列表。 默认值为GOMAXPROCS的当前值。-failfast
: 第一次测试失败后,请勿开始新的测试。-list regexp
: 列出 与正则匹配的测试用例列表,例如go test -list Test .
列出名字以Test
为开头的测试用例;-parallel n
: 调用t.Parallel的测试功能。并设置 并行运行的测试数量为n,n 默认为GOMAXPROCS
,请注意,-parallel仅适用于单个测试二进制文件。-run regexp
: 执行与正则表达式相匹配的测试用例;-short
: 一个快速测试的标记,在测试用例中可以使用testing.Short()
来绕开一些测试,详细使用方法看 -short 的使用;-timeout d
: 如果测试用例的运行时间超过持续时间 d,则出现恐慌。如果 d 为 0,则禁用超时。默认值为 10分钟(10m
);-v
: 显示详细测试信息,打印t.Log()
和t.Logf()
输出;-benchmem
: 打印基准测试的内存分配统计信息。-blockprofile block.out
: 性能剖析, 记录 阻塞事件的分析数据 到block.out
,可以供给go tool pprof
使用。- 例如:
go tool pprof test.test block.out
输入web
会生成 svg 图像(需要安装graphviz
):
-blockProfilerate n
: 探查器每n纳秒中采样一个阻塞事件;-coverprofile cover.out
: 看覆盖率;-cpuprofile cpu.out
: 性能剖析, 记录 cpu 性能刨析 到文件,可以供给go tool pprof
使用- 例如:
go tool pprof test.test cpu.out
输入web
会生成 svg 图像(需要安装graphviz
):
-memprofile mem.out
: 性能剖析, 同上 记录内存使用数据到文件,可以供给go tool pprof
使用- 例如:
go tool pprof test.test mem.out
输入web
会生成 svg 图像(需要安装graphviz
):
打印/报告
- 当我们遇到一个断言错误的时候,标识这个测试失败,会使用到:
Fail: 测试失败,测试继续,也就是之后的代码依然会执行
FailNow: 测试失败,测试中断
在 FailNow 方法实现的内部,是通过调用 runtime.Goexit()
来中断测试的。
- 当我们遇到一个断言错误,只希望跳过这个错误,但是不希望标识测试失败,会使用到:
SkipNow: 跳过测试,测试中断
在 SkipNow 方法实现的内部,是通过调用 `runtime.Goexit()` 来中断测试的。
- 当我们只希望打印信息,会用到 :
Log: 输出信息
Logf: 输出格式化的信息
注意:默认情况下,单元测试成功时,它们打印的信息不会输出,可以通过加上 -v` 选项,输出这些信息。但对于基准测试,它们总是会被输出。
- 当我们希望跳过这个测试,并且打印出信息,会用到:
Skip: 相当于 Log + SkipNow
Skipf: 相当于 Logf + SkipNow
- 当我们希望断言失败的时候,标识测试失败,并打印出必要的信息,但是测试继续,会用到:
Error: 相当于 Log + Fail
Errorf: 相当于 Logf + Fail
- 当我们希望断言失败的时候,标识测试失败,打印出必要的信息,但中断测试,会用到:
Fatal: 相当于 Log + FailNow
Fatalf: 相当于 Logf + FailNow
T 类型 普通测试用例
T 类型用于管理测试状态并支持格式化测试日志。测试日志会在执行测试的过程中不断累积,并在测试完成时转储至标准输出。测试用例以 Test
开头:
// 被测试的函数
func Fib(n int) int {
if n < 2 {
return n
}
return Fib(n-1) + Fib(n-2)
}
// 执行测试
func TestFib(t *testing.T) {
var fibTests = []struct {
in int // input
expected int // expected result
}{
{
1, 1},
{
2, 1},
{
3, 2},
{
4, 3},
{
5, 5},
{
6, 8},
{
7, 13},
}
for _, tt := range fibTests {
actual := Fib(tt.in)
if actual != tt.expected {
// 断言结果是否和预期相等
t.Errorf("Fib(%d) = %d; expected %d", tt.in, actual, tt.expected)
}
}
}
/* go test -v -run TestFib b_test.go
# 参数说明:
-v 打印详细信息
-run 运行执行测试用例函数
后跟用例寻找范围,文件名 或 "."(代表当前目录下所有文件)
# 输出:
=== RUN TestFib
--- PASS: TestFib (0.00s)
PASS
ok command-line-arguments 0.002s
*/
除了打印报告的方法外还有:方法:
Name 返回当前测试用例名称
func (t *T