打桩测试

github.com/golang/mock

代码

这里我们使用 github.com/agiledragon/gomonkey 来实现。

实际中,经常在代码中会遇到一些随机值的情况,比如验证码。为了方便测试,我们会想要 mock 掉随机值方法,让每次产生的值固定方便后续的测试。

rand.Number()gomonkey.ApplyFunc

注意事项

gomonkey-gcflags=all=-lgo test -gcflags=all=-l -vGOARCH=amd64

压测

b *testing.B

代码

非常容易上手,让我们直接来看代码

使用

-bench=.

➜ go test -bench=. b_test.go
goos: darwin
goarch: arm64
BenchmarkPrimeNumbers/calc_num_100-8             3391329               348.9 ns/op
BenchmarkPrimeNumbers/calc_num_1000-8             293733              3979 ns/op
BenchmarkPrimeNumbers/calc_num_77777-8               730           1619089 ns/op
BenchmarkPrimeNumbers/calc_num_666666-8               42          28509805 ns/op
PASS
ok      command-line-arguments  5.846s

可以看到次数和耗时,这样的数据经常会被贴在开源项目README的性能比较板块中。

测试覆盖率

单元测试当然少不了覆盖率咯,看着高高的覆盖率才有成就感对不对?

-cover

➜ go test -cover .           
ok      go-demo/m/unit-test/service     0.879s  coverage: 70.0% of statements

还可以生成 profile 然后通过可视化网页查看分析

➜ go test ./... -coverprofile=cover.out
ok      go-demo/m/unit-test/service     0.108s  coverage: 70.0% of statements
➜ go tool cover -html=cover.out

当然,如果你和我一样使用 goland 进行开发,可以直接在界面上点击单元测试,就可以快速进行覆盖率测试,并且展示也很方便,很快能看到有哪些代码没有被测试覆盖。

表格驱动测试

TDT 的提出也算是给单元测试提供了一条不错的思路。主要的形式就是将测试的数据做成类似表格,然后测试的时候遍历所有的数据来进行测试,测试代码不动,只需要增加测试数据就可以了。go 很多官方库用了这样的写法来做测试。

我们可以通过 github.com/cweill/gotests 来帮助我们快速生成想要的表格驱动测试代码