Golang单元测试

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”开头

  • 使用DescribeContext容器来组织你的Itspec
    • 您可以使用Describe块来描述代码的各个行为,Context块在不同情况下执行这些行为
  • 使用 BeforeEach 和 AfterEach 来搭建和拆除测试中的常见设置
    • 每个It块都运行BeforeEachAfterEach块。这确保了每个 spec的原始状态。

异步测试

共享示例模式

持续集成

表格驱动测试

一些提升效率的小技巧

待定 Specs,加P,加X

聚焦 Specs,加F

使用 Gomock 来 mock 外部依赖


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 nz_nuaa@163.com
github