Ginkgo使用笔记

2022-09-05
2分钟阅读时长

go自带的单元测试比较适合测一个小函数,如果要做一系列的流程测试,则显得较为繁琐。

推荐使用ginkgo来做流程测试,BDD风格写出来的测试代码非常容易读懂和维护。

安装

这里使用v2版本进行测试,首先安装二进制文件

go install github.com/onsi/ginkgo/v2/ginkgo@latest

在待测试的项目中运行:

go get github.com/onsi/gomega

生成

在待测试的package下面跑

ginkgo bootstrap

生成suit_test文件。

然后对单个文件跑

ginkgo generate xxx

xxx是待测试文件的名字。

语法

这个生成的xxx_test.go被称为一个spec. spec分为三类结点:

  • 容器节点,如DescribeContextIt,可以理解为前端的div,就是用来组织代码的;一般用来说明测试的场景;
  • setup结点,如BeforeEach,用来初始化数据;
  • 主题结点,一般用gomega里面的各种断言,形如Except(xxx).To(),后面会详细解释;

JustBeforeEach

该节点运行在BeforeEach之后,主题节点之前,可以用来做统一初始化;

BeforeEach

运行所有主题节点之前都要跑的函数

AfterEach

在主题节点结束之后运行

JustAfterEach

在主题节点结束之后,AfterEach节点运行之前

DeferCleanUp

可以在BeforeEach里面写的闭包,代替AfterEach清理,代码更为简单

BeforeSuite和AfterSuite

在整个测试集开始之前和结束之后运行的代码,通过全局变量写在suite_test文件里;

DescribeTable与Entry

可以配合用来测试多个case,避免重复代码

生命周期

Ginkgo默认支持并行测试,所以必须知道整个测试树的生命周期。

  1. 测试树构建阶段:
    1. 遍历顶层容器(Describe),并调用其匿名函数;
    2. 定义在顶层容器中的闭包变量被初始化;
    3. 注册BeforeEach,并传递内嵌的匿名函数(不会执行);
    4. 注册It,并传递内嵌的匿名函数(不会执行);
    5. 注册Context,并传递内嵌的匿名函数(立即执行);
    6. 递归构建Context中的内容;
  2. 测试树调用阶段:
    1. 将BeforeEach和It关联起来,依次运行这些函数;

所以需要注意:

  • 2阶段中不能包含1阶段定义的函数,即It中不能再包含Context等;
  • 2阶段不会重新初始化1阶段匿名函数中的变量,所以小心测试污染;
  • 不要在1阶段容器中使用断言;
  • BeforeSuite在测试树调用阶段只运行一次;
Avatar

个人介绍

兴趣使然的程序员,博而不精,乐学不倦