天天看点

《JavaScript忍者秘籍》——2.4 测试套件基础知识

本节书摘来自异步社区《javascript忍者秘籍》一书中的第2章,第2.4节,作者:【美】john resig(莱西格) , bear bibeault(贝比奥特) 译者: 徐涛 更多章节内容可以访问云栖社区“异步社区”公众号查看。

测试套件的主要目的是聚合代码中的所有单个测试,将其组合成为一个单位,这样它们可以批量运行,提供一个可以轻松反复运行的单一资源。

为了更好地理解测试套件的工作原理,我们有必要了解如何构建一个测试套件。或许有些出人意料,构建javascript测试套件确实很容易。大约只需要40行代码就可以构建好一个功能。

人们可能会问“为什么要创建一个新的测试套件?”,大多数情况下,可能没有必要编写自己的javascript测试套件。目前已经有大量的高质量测试套件可供选择。但是,构建自己的测试套件可以作为很好的学习经验,尤其是了解异步测试是如何工作的时候。

2.4.1 断言

单元测试框架的核心是断言方法,通常叫assert()。该方法通常接收一个值——需要断言的值,以及一个表示该断言目的的描述。如果该值执行结果为true,换句话说是“真值”,断言就会通过;否则,断言就会被认为是失败的。通常用一个相应的通过(pass)/失败(fail)标记记录相关的信息。

从下面的代码清单中,可以看到一个简单的实现。

代码清单2.4 javascript断言的一个简单

《JavaScript忍者秘籍》——2.4 测试套件基础知识

名为assert()的函数1极为简单。它创建一个新

元素并包含描述,分配其一个pass或fail样式,该样式取决于断言参数的值(value),并将新元素附加到body4内的一个列表元素上。

该测试套件包括两个微不足道的测试3:一个总是成功,另一个总是失败。pass和fail的样式规则2,则使用颜色在视觉上表示成功或失败。

该函数很简单,但对于未来开发,它将会作为良好的构建块,在本书中,我们将使用这个assert()方法测试不同的代码片段,验证代码的完整性。

2.4.2 测试组

简单的断言是很有用的,但真正发力,却是在测试上下文中将它们组合在一起形成测试组的时候。

执行单元测试时,一个测试组可能代表一组断言,因为它们在我们的api或程序里关联的是一个单一的方法。如果是在做行为驱动开发,测试组将通过任务集成断言。不管是哪种方式,其实现实际上是相同的。

在示例测试套件中,测试组将单个断言的结果插入到结果中。此外,如果任何断言失败,那么整个测试组标记为失败。如下代码清单的输入相当简单——在实践中动态控制层级被证明是非常有用的(如果测试失败的话,可以收缩/展开测试组,并且过滤测试)。

代码清单2.5 测试分组的实现

《JavaScript忍者秘籍》——2.4 测试套件基础知识
《JavaScript忍者秘籍》——2.4 测试套件基础知识

如代码清单2.5中看到的,其代码实现和基本的断言日志记录真的是没有太大区别。一个主要的区别是包含一个results变量,该变量持有当前测试组的引用(这样可以正确插入断言)。

除了简单的测试代码以外,测试框架的另外一个重要方面是异步操作的处理。

2.4.3 异步测试

很多开发人员在开发测试套件时遇到的一个艰巨而复杂的任务是对异步测试的处理。这些测试的结果在一段不确定的时间后会返回,这种场景的常见例子如ajax请求和动画。

处理该问题的方式通常是过度设计,并且设计的要比实际需要的更复杂。处理异步测试,我们需要遵循一些简单的步骤。

1.将依赖相同异步操作的断言组合成一个统一的测试组。

2.每个测试组需要放在一个队列上,在先前其他的测试组完成运行之后再运行。

因此,每个测试组必须能够异步运行。

让我们来看一个下面清单中的例子。

代码清单2.6 简单的异步测试套件

《JavaScript忍者秘籍》——2.4 测试套件基础知识

让我们分解代码清单2.6中的功能。有三个公开函数:test()、pause()和resume()。这三个函数有以下功能。

test(fn)接受一个包含多个断言的函数,这些断言可以是同步的,也可以是异步的——并放置在队列中等待执行。

pause()应该在test函数内部调用,告诉该测试套件暂停执行测试,直到测试组完成。

resume()恢复测试,经过短暂的延迟,开始下一个测试的运行,旨在避免出现长时间运行的代码块。

内部的实现函数runtest(),在测试排队时从列中移除时进行调用。它用于检查当前套件目前是否没被暂停以及队列中是否有测试任务,一旦满足情况,将从队列中取出一个测试并尝试执行它。此外,测试组完成执行之后,runtest()会检查该套件目前是否暂停了,如果没暂停(这意味着,测试组中只有异步测试),runtest()将开始执行下一组测试。

我们将在第8章仔细研究延迟执行,其重点是定时器,我们将深入研究有关javascript代码延迟执行的细节。

继续阅读