单元测试
单元测试
1. 创建单元测试
-
测试文件以
_test.go
结尾:每一个go文件,都有一个属于自己的单元测试文件,命名为xxx_test.go
。例如:publish_post.go
文件的单元测试文件为publish_post_test.go
。 -
func TestXxx(*testing.T)
:每一个函数所对应的测试函数命名为TestXxx
,参数为*testing.T
。例如:PublicPost函数,其测试函数为func TestPublishPost(t *testing.T)
。 -
初始化逻辑放到TestMain中:当前包下的所有测试函数的初始化逻辑,都放到TestMain函数中,再调用Run函数执行测试,再进行资源的释放等操作。
func TestMain(m *testing.M) { |
2. 单元测试例子
2.1 情景假设
假设有函数HelloTom
,应该返回string:“Tom”
。
func HelloTom() string { |
那么针对该函数的测试应为:
func TestHelloTom(t *testing.T) { |
2.2 执行测试
使用go test
命令执行单元测试。
go test [flags] [packages] |
3. 单元测试框架-assert
有现成的第三方包提供单元测试框架。例如:
import( |
4. 单元测试覆盖率
单元测试的覆盖率是衡量单元测试质量的一个重要指标。使用时,在go test
后加上--cover
的参数即可在执行单元测试时同时计算出覆盖率。
go test judgement_test.go judgement.go --cover |
5. Mock
为了保证单元测试的稳定性:减少单元测试受外部影响(文件丢失,网络不稳定等),常使用Mock的方法对函数进行打桩。
5.1 情景假设
假设需要读取一个文件的一行,并将其中的字符串11
改成00
。
func ReadFirstLine() string { |
这是它的单元测试:
func TestProcessFirstLine(t *testing.T) { |
这个函数的测试,依赖于log
文件中的行字符串为“line11"
。
5.2 使用Mock
快速Mock函数可以做到:
-
为一个函数打桩
-
为一个方法打桩
5.2.1 monkey介绍
假设使用的是monkey
库:https://github.com/bouk/monkey。它包含两个方法:Patch和UnPatch。
//将target的函数执行换成replacement的函数执行 |
5.2.2 monkey使用
此处对ReadFirstLine
函数进行打桩操作,使其摆脱依赖本地文件的影响:
func TestProcessFirstLineWithMock(t *testing.T) { |
6. 基准测试框架
基准测试是指对一段代码的性能和CPU使用情况进行分析测试。