从上面可以看到,给 getPersonDetailRedis 函数做单元测试主要做了四件事情: ·生成符合 redis.Conn 接口的 mockConn · 给接口打桩序列 · 给函数 redis.Dial 打桩 · 断言
这里面同时使用了 gomock、gomonkey 和 testify 三个包作为压测工具,日常使用中,由于复杂的调用逻辑带来繁杂的单测,也无外乎使用这三个包协同完成。 查看单测报告
单元测试编写完毕之后,我们可以调用相关的指令来查看覆盖范围,帮助我们查看单元测试是否已经完全覆盖逻辑代码,以便我们及时调整单测逻辑和用例。 使用 go test 指令
默认情况下,我们在当前代码目录下执行 go test 指令,会自动的执行当前目录下面带 _test.go 后缀的文件进行测试。如若想展示具体的测试函数以及覆盖率,可以添加 -v 和 -cover 参数,如下所示:
<font size="3"> go_unit_test [master] go test -v -cover
=== RUN TestGetPersonDetail
--- PASS: TestGetPersonDetail (0.00s)
=== RUN Test_checkEmail
--- PASS: Test_checkEmail (0.00s)
=== RUN Test_checkUsername
--- PASS: Test_checkUsername (0.00s)
=== RUN Test_getPersonDetailRedis
--- PASS: Test_getPersonDetailRedis (0.00s)
PASS
coverage: 60.8% of statements
ok unit 0.131s</font>
复制代码
如果想指定测试某一个函数,可以在指令后面添加 -run ${test文件内函数名} 来指定执行。
<font size="3"> go_unit_test [master] go test -cover -v -run Test_getPersonDetailRedis
=== RUN Test_getPersonDetailRedis
--- PASS: Test_getPersonDetailRedis (0.00s)
PASS
coverage: 41.9% of statements
ok unit 0.369s</font>
复制代码
在执行 go test 命令时,需要加上 -gcflags=all=-l 防止编译器内联优化导致单测出现问题,这跟打桩代码存在密切的关系,后面我们会详细的介绍这一点。
因此,一个完整的单测指令可以是 go test -v -cover -gcflags=all=-l -coverprofile=coverage.out 生成覆盖报告
最后,我们可以执行 go tool cover -html=coverage.out ,查看代码的覆盖情况,使用前请先安装好 go tool 工具。