
1.4.5 更多内容
想把测试做好也不是一件容易的事情,除要理解测试框架的用法外,还有很多高级玩法,这里暂列一二。
➘ 5种测试写法
第1种写法最简单,代码如下。

第2种写法支持Promise,注意return关键字的用法,代码如下。

第3种写法支持原始的回调API,只有遇到t.end才会结束测试,是典型的采用异步思想的方法,代码如下。

第4种写法支持ES6里的Generator,代码如下。

第5种写法支持async函数,代码如下。

以上5种写法几乎涵盖了所有的异步流程控制技术,通过编写测试来加强对异步流程控制技术的理解也是非常好的,单个测试里的代码不会特别多,难度不大,是帮助学习的利器。
➘ 测试生命周期
测试生命周期是测试框架必备的特性,通过测试生命周期函数来体现。我们能够在测试的各个生命周期环境注入我们自己的逻辑,比如,为了测试之前准备的数据、打桩甚至数据库连接,可以在测试之后进行收尾处理。
测试生命周期如图1-8所示,before和after是开始和结束时调用的钩子方法,而beforeEach和afterEach是每次测试用例执行前后要调用的钩子方法。

图1-8
测试生命周期的示例代码如下。

➘ 原子性测试
在测试数据库增删改查操作时,顺序执行可能没有问题,但并行执行的时候问题可能就来了,只有创建操作是无依赖的,而删、改、查等操作都需要实现存在对象才能完成。
执行ava-v test/controller/y.js-s是可以的,-s表示顺序执行,而无-s意味着是并行执行的。
此时为了保证测试代码的原子性,我们要为每个测试都准备好数据,然后测试其他内容,示例如下。

原子性测试是AVA特有的,因为AVA之前的Mocha被诟病最多的就是其执行速度,而AVA是真正采用并行执行方式的,所以在AVA里除非特指,否则每个测试用例都要尽量保证原子性,避免因并行执行而导致测试故障。
➘ 常用模块
常用模块如表1-7所示。
表1-7

基本上你能想到的模块,在npm或GitHub上都能找到,比如,Ruby测试常用的factory_girl模块等都有对应的Node.js版本的实现,各位读者一定要善用各种开源神器。
通过学习和使用AVA,我们可以对Node.js v4以上的相关技术有较好的理解,无论Generator、async/await,还是传统的Promise写法。我们平常工作和学习的时候,也要尽量从写测试开始,未来必将受益无穷。