GO语言实战之测试 | 青训营笔记

123 阅读3分钟

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.gopackage test
​
func PassTest(score int)bool{
   if score >= 60{
      return true
   }
    return false
}

然后在同一个包下的 main_test.go 写测试函数 TestPassTest 来测试

test/main_test.gopackage 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次内存分 配。