持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
前言
- Cypress 底层依赖于很多优秀的开源测试框架,其中就有 Mocha
- Mocha 是一个适用于 Node.js 和浏览器的测试框架,它使得异步测试变得简单
JS 语言带来的问题
JS 是单线程异步执行的,这使得测试变得复杂,因为无法像测试同步执行的代码那样,直接判断函数的返回值是否符合预期(因为给函数赋值时函数可能并未执行)
如何验证异步函数的正确性
- 需要测试框架支持回调,Promise 或者其他方式来验证异步函数的正确性
- Mocha 提供了出色的异步支持包括 Promise ,从而使得异步测试变得简单
Cypress 结合 Mocha
Cypress 继承并扩展了 Mocha 对异步的支持
Mocha 提供了什么
- 多种接口来定义测试套件,Hooks,单个测试( Individual )
- BDD(Behavior-Driven Development,行为驱动开发)
- TDD(Test-Driven Development,测试驱动开发)
- Exports、QUnit、Require
Cypress 采纳了 Mocha 的 BDD 语法
- 该语法非常适合集成测试和单元测试
- 在 Mocha 中,一个 BDD 风格的测试用例看起来是这样的
常见 Mocha 模块
Cypress 将 Mocha 硬编码在自己的框架中,所以编写测试用例都是基于 Mocha 提供的如下基本功能模块:
- describe()
- context()
- it()
- before()
- beforeEach()
- afterEach()
- after()
- .only()
- .skip()
对于一条可执行的测试用例来说,有以下两个必要的组成部分
describe()
- 代表测试套件,里面可以设定 context() ,也可以包括多个测试用例 it() ,还能嵌套子测试套件
- 一个测试套件可以不包括任何钩子函数(Hook),但必须包含至少一条测试用例 it()
it()
代表一条测试用例
其他模块
- 除上述两个功能模块外,其他功能模块对于一条可执行的测试来说,都是可选的
- 例如 context() 是 describe() 的别名,其行为方式是一致的,直接用 context() 代替 describe() 也是可以的哦
可以看到,一共有三层的 context() ;
运行成功看看下面的结果
Hook
就是常说的钩子函数,在 pytest 框架里面也有 hook 这个概念;接下来就让我们来看看 Mocha 提供的 Hook 函数叭!
Mocha 提供的 Hook 函数
- before()
- beforeEach()
- afterEach()
- after()
hook 的作用
利用钩子函数可以在所有测试用例执行前做一些预置操作(如:准被测试数据、测试环境)
或者在测试结束后做一些后置操作(如:清理测试数据)
hook 具体写法的栗子(比较长,耐心敲,耐心看)
运行结果
知识点
若包含多级测试套件,那么父级套件、祖父级套件声明的 hook 函数会作用于所有子级套件的测试用例,孙子级套件的测试用例...以此类推 (如:栗子中的二级套件、孙子级套件)
before()
- 该测试套件下,所有测试用例的统一前置操作
- 它在一个 describe() 或 context() 内只会执行一次,在所有 it() 之前执行
- 在运行结果可以看到是叫 BEFORE ALL
after()
- 该测试套件下,所有测试用例的统一后置操作
- 它在一个 describe() 或 context() 内只会执行一次,在所有 it() 之后执行
- 在运行结果可以看到是叫 AFTER ALL ,而且是在最后一行
beforeEach()
- 该测试套件下,每个测试用例的前置操作
- 一个 describe() 或 context() 内有多少个测试用例 it() ,就会执行几次 beforeEach()
- 在运行结果可以看到是叫 BEFORE EACH
afterEach()
- 该测试套件下,每个测试用例的后置操作
- 一个 describe() 或 context() 内有多少个测试用例 it() ,就会执行几次 afterEach()
- 在运行结果可以看到是叫 AFTER EACH