Golang单元测试
程序测试
对于程序或软件的测试也分很多种:
单元测试(又称程序员测试)
- 功能测试类(test)
- 基准测试类(benchmark)
- 示例测试类(example)
API测试
集成测试
灰度测试
单元测试
单元测试也叫做”程序员测试“,顾名思义就是程序员自己要做的测试。
为什么人们不愿意写单元测试?从人的本性来讲,我们都或多或少会否定“对自我的否定”。我们不愿意看到我们编写的程序有 Bug(即程序错误或缺陷),尤其是刚刚倾注心血编写的,并且信心满满交付的程序。还以一个原因就是需求太多,没时间。
Go 语言的缔造者们从一开始就非常重视程序测试,并且为 Go 程序的开发者们提供了丰富的 API 和工具。利用这些 API 和工具,我们可以创建测试源码文件,并为命令源码文件和库源码文件中的程序实体,编写测试用例。
在 Go 语言中,一个测试用例往往会由一个或多个测试函数来代表,不过在大多数情况下,每个测试用例仅用一个测试函数就足够了。测试函数往往用于描述和保障某个程序实体的某方面功能,比如,该功能在正常情况下会因什么样的输入,产生什么样的输出,又比如,该功能会在什么情况下报错或表现异常,等等。
Go 语言对测试文件的规定
位置
一般情况下,一个测试源码文件只会针对于某个命令源码文件,或库源码文件(以下简称被测源码文件)做测试,所以我们总会(并且应该)把它们放在同一个代码包内。
文件名
测试源码文件的主名称应该以被测源码文件的主名称为前导,并且必须以“_test”为后缀。例如,如果被测源码文件的名称为 demo52.go,那么针对它的测试源码文件的名称就应该是 demo52_test.go。
函数的分组、数量、顺序
每个测试源码文件都必须至少包含一个测试函数。并且,从语法上讲,每个测试源码文件中,都可以包含用来做任何一类测试的测试函数,即使把这三类测试函数都塞进去也没有问题。我通常就是这么做的,只要把控好测试函数的分组和数量就可以了。我们可以依据这些测试函数针对的不同程序实体,把它们分成不同的逻辑组,并且,利用注释以及帮助类的变量或函数来做分割。同时,我们还可以依据被测源码文件中程序实体的先后顺序,来安排测试源码文件中测试函数的顺序。
Go 语言对测试函数的名称和签名的规定
对于功能测试函数来说,其名称必须以Test为前缀,并且参数列表中只应有一个*testing.T类型的参数声明。
对于性能测试函数来说,其名称必须以Benchmark为前缀,并且唯一参数的类型必须是*testing.B类型的。
对于示例测试函数来说,其名称必须以Example为前缀,但对函数的参数列表没有强制规定。
基于 Ginkgo 框架编写单元测试
基本用法简介
Describe:描述一个行为
Context:某个行为的不同情况
It:通常It的描述以“should”开头
- 使用
Describe
和Context
容器来组织你的It
和spec
- 您可以使用
Describe
块来描述代码的各个行为,Context
块在不同情况下执行这些行为
- 您可以使用
- 使用 BeforeEach 和 AfterEach 来搭建和拆除测试中的常见设置
- 每个
It
块都运行BeforeEach
和AfterEach
块。这确保了每个 spec的原始状态。
- 每个
异步测试
共享示例模式
持续集成
表格驱动测试
一些提升效率的小技巧
待定 Specs,加P,加X
聚焦 Specs,加F
使用 Gomock 来 mock 外部依赖
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 nz_nuaa@163.com