GO语言实战之测试
单元测试
不会写测试的不是一个好的程序员,当我们完成一个项目之后,我们要对项目进行测试,测试是避免事故的最后一道屏障。
测试函数必须满足以下条件:
1、文件名必须以xx_test.go命名
2、方法必须是Testa-z开头
3、方法参数必须 t *testing.T
4、使用go test执行单元测试
目录结构
test
—— calc.go 存放被测试函数的文件
—— calc_test.go 存放测试函数的文件
在终端使用命令 go test 即可执行测试函数
举个例子吧
首先在 main.go 里面写函数 PassTest 来判断成绩是否及格
test/main.go
package test
func PassTest(score int)bool{
if score >= 60{
return true
}
return false
}
然后在同一个包下的 main_test.go 写测试函数 TestPassTest 来测试
test/main_test.go
package test
import (
"github.com/stretchr/testify/assert"
"testing"
)
func TestPassTest(t *testing.T) {
inPath := PassTest(40)
expectOutput := false
assert.Equal(t, expectOutput,inPath)
}
最后在终端执行命令可以看到如下结果:
=== RUN TestPassTest --- PASS: TestPassTest (0.00s) PASS ok project1/test04 0.573s
Process finished with the exit code 0
测试覆盖率
测试覆盖率是你的代码被测试套件覆盖的百分比。通常我们使用的都是语句的覆盖率,也就是在测试中 至少被运行一次的代码占总代码的比例。
跟刚刚的单元测试函数一样,要想测覆盖率,只需要要在输入命令后买你加上 -cover就可以了,完整的命令就是 go test -cover
PS D:\code\golandprojects\project1> go test project1\test04 -cover
ok project1/test04 0.576s coverage: 66.7% of statements
Go还提供了一个额外的-coverprofile参数,用来将覆盖率相关的记录信息输出到一个文件。例如:
go test -cover -coverprofile=c.out
上面的命令会将覆盖率相关的信息输出到当前文件夹下面的c.out文件中,然后我们执行go tool cover -html=c.out,使用cover工具来处理生成的记录信息,该命令会打开本地的浏览器窗口生成 一个HTML报告。
基准测试
基准测试就是在一定的工作负载之下检测程序性能的一种方法。
基准测试以Benchmark为前缀,需要一个 *testing.B 类型的参数b,基准测试必须要执行b.N次, 这样的测试才有对照性,b.N的值是系统根据实际情况去调整的,从而保证测试的稳定性。
举个例子吧:
这里用的还是之前的测试成绩是否及格的函数
func PassTest(score int)bool{
if score >= 60{
return true
}
return false
}
下面是写的基准测试函数
func BenchmarkPassTest(b *testing.B) {
for i:= 0;i<b.N;i++{
PassTest(70)
}
}
这次的执行命令为 go test -bench=函数名
执行结果如下:
PS D:\code\golandprojects\project1> go test project1\test04 -bench=PassTest goos: windows goarch: amd64 pkg: project1/test04 cpu: AMD Ryzen 7 5800H with Radeon Graphics BenchmarkPassTest-16 1000000000 0.2526 ns/op PASS ok project1/test04 0.827s
其中BenchmarkPassTest-16表示对Split函数进行基准测试,数字16表示GOMAXPROCS的值,这个对于并发基准测试很重要。1000000000和0.2526 ns/op表示每次调用PassTest函数耗时0.2526 ns,这个结果是 1000000000次调用的平均值。
我们还可以为基准测试添加-benchmem参数,来获得内存分配的统计数据。
PS D:\code\golandprojects\project1> go test project1\test04 -bench=PassTest -benchmem goos: windows goarch: amd64 pkg: project1/test04 cpu: AMD Ryzen 7 5800H with Radeon Graphics BenchmarkPassTest-16 1000000000 0.2470 ns/op 0 B/op 0 allocs/op PASS ok project1/test04 0.351s
其中,0 B/op 表示每次操作内存分配了0字节, 0 allocs/op则表示每次操作进行了0次内存分 配。