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

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

本节书摘来自异步社区《JavaScript忍者秘籍》一书中的第2章,第2.4节,作者:【美】John Resig(莱西格) , Bear Bibeault(贝比奥特)著,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.4 测试套件基础知识

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

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

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

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

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

代码清单2.4 JavaScript断言的一个简单实现
screenshot
名为assert()的函数1极为简单。它创建一个新

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

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

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

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

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

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

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

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

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

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

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

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

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

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

代码清单2.6 简单的异步测试套件
screenshot
让我们分解代码清单2.6中的功能。有三个公开函数:test()、pause()和resume()。这三个函数有以下功能。
test(fn)接受一个包含多个断言的函数,这些断言可以是同步的,也可以是异步的——并放置在队列中等待执行。
pause()应该在test函数内部调用,告诉该测试套件暂停执行测试,直到测试组完成。
resume()恢复测试,经过短暂的延迟,开始下一个测试的运行,旨在避免出现长时间运行的代码块。

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

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

相关文章
|
8天前
|
Web App开发 JavaScript 前端开发
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
|
2月前
|
Web App开发 应用服务中间件 定位技术
three.js:三维模型加载量测试
three.js:三维模型加载量测试
|
2月前
|
JavaScript 前端开发 测试技术
Vue.js开发者必看!Vue Test Utils携手端到端测试,打造无懈可击的应用体验,引领前端测试新风尚!
【8月更文挑战第30天】随着Vue.js的普及,构建可靠的Vue应用至关重要。测试不仅能确保应用质量,还能提升开发效率。Vue Test Utils作为官方测试库,方便进行单元测试,而结合端到端(E2E)测试,则能构建全面的测试体系,保障应用稳定性。本文将带你深入了解如何使用Vue Test Utils进行单元测试,通过具体示例展示如何测试组件行为;并通过Cypress进行E2E测试,确保整个应用流程的正确性。无论是单元测试还是E2E测试,都能显著提高Vue应用的质量,让你更加自信地交付高质量的应用。
45 0
|
2月前
|
JavaScript 前端开发 应用服务中间件
【qkl】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能
【区块链】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能
|
4月前
|
自然语言处理 JavaScript 前端开发
【JavaScript】JavaScript基础知识强化:变量提升、作用域逻辑及TDZ的全面解析
【JavaScript】JavaScript基础知识强化:变量提升、作用域逻辑及TDZ的全面解析
53 3
|
4月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的高中信息技术课程在线测试系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的高中信息技术课程在线测试系统附带文章和源代码部署视频讲解等
42 6
|
4月前
|
Java 测试技术
Java一分钟之-JUnit测试框架:断言与测试套件
【6月更文挑战第3天】本文介绍了JUnit在Java单元测试中的应用,包括断言基础如`assertEquals`、`assertTrue`等,用于验证代码预期结果;利用`@Suite`创建测试套件以组合多个测试;并讨论了常见问题及解决方法,如忽略测试、错误断言、异常处理和保持测试简洁。理解并熟练运用这些概念能提升测试代码的质量和效率。
74 2
|
4月前
|
前端开发 JavaScript 程序员
探索JavaScript宝库:打开基础知识与实用技能之门(数据类型与变量+ 条件与循环+函数与模块+DOM+异常+ES6)
探索JavaScript宝库:打开基础知识与实用技能之门(数据类型与变量+ 条件与循环+函数与模块+DOM+异常+ES6)
31 0
|
4月前
|
JavaScript 程序员 索引
老程序员分享:JS基础知识(正则)
老程序员分享:JS基础知识(正则)
21 0
|
4月前
|
前端开发 JavaScript 算法
JavaScript事件监听测试代码
JavaScript事件监听测试代码
27 0
下一篇
无影云桌面