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

2.4 测试套件基础知识

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

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

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

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

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

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

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

元素并包含描述,分配其一个pass或fail样式,该样式取决于断言参数的值(value),并将新元素附加到body4内的一个列表元素上。
该测试套件包括两个微不足道的测试3:一个总是成功,另一个总是失败。pass和fail的样式规则2,则使用颜色在视觉上表示成功或失败。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

时间: 2024-09-18 15:45:33

《JavaScript忍者秘籍》——2.4 测试套件基础知识的相关文章

《JavaScript忍者秘籍》——导读

**前言**Web应用程序将为用户提供丰富的用户界面体验,没有JavaScript,我们也就只能显示几张小图片.Web开发人员比以往任何时候都更需要熟练掌握能够为Web应用程序带来生命的语言. 像橙汁和早餐一样,JavaScript不再只用于浏览器了.该语言推倒了浏览器的界限,可用在Rhino和V8等引擎的服务器上,也可以用于像node.js这样的框架. 虽然本书主要是介绍用于Web应用程序的JavaScript,但本书第二部分提出的JavaScript基础适用范围也很广泛. 随着使用JavaS

《JavaScript忍者秘籍》——第1章 进入忍者世界 1.1即将探索的JavaScript库

第1章 进入忍者世界 本章涵盖以下内容: 介绍本书的目的和结构 将要关注的库 什么才是JavaScript高级编程 跨浏览器编程 测试套件示例 如果你正在阅读本书,应该知道,没有什么简单方法可以创建有效且跨浏览器的JavaScript 代码,除了编写整洁代码的常规挑战外,我们还要额外应对各种浏览器的差异和复杂性.为了应对这些挑战,JavaScript开发人员通常使用JavaScript库来实现通用和可重用的功能. 这些库虽然在方法.内容和复杂性方面有很大差异,但唯一不变的是:它们都需要简单易用,

《JavaScript忍者秘籍》——第2章 利用测试和调试武装 自己2.1 调试代码

第2章 利用测试和调试武装 自己 本章涵盖以下内容. JavaScript代码调试工具 测试用例生成技术 构建测试套集 如何测试异步操作 为代码构建有效的测试套件是非常重要的,所以在我们进入任何编码之前,要首先对它进行讨论.和可靠的测试策略同样重要的是要对所有代码进行测试,外部因素有可能影响代码的操作效果这点十分重要,这正是我们在跨浏览器JavaScript开发时要面对的情况. 我们不仅要处理典型问题:确保代码质量,尤其是与多位同时编写一段代码的开发人员打交道时,并避免出现会破坏API的回归错误

《JavaScript忍者秘籍》——2.3 测试框架

2.3 测试框架 测试套件应该作为基本开发流程的一部分,所以应该选择一个非常适合自己代码风格和代码库的测试套件.一个JavaScript测试套件应该满足一个唯一需求:显示测试的结果,以便很容易地确定哪些测试通过的,哪些是失败的.测试框架可以帮助我们达到这一目标,除了创建测试并将其组织到测试套件中以外,不用再担心别的事情. 根据测试的需要,我们可以从JavaScript测试框架中找到很多功能.其中一些功能包括: 能够模拟浏览器行为(单击按键等). 测试的交互式控制(暂停和恢复测试). 处理异步测试

《JavaScript忍者秘籍》——第2章 利用测试和调试武装自己 2.1调试代码

第2章 利用测试和调试武装自己 本章涵盖以下内容. JavaScript代码调试工具 测试用例生成技术 构建测试套集 如何测试异步操作 为代码构建有效的测试套件是非常重要的,所以在我们进入任何编码之前,要首先对它进行讨论.和可靠的测试策略同样重要的是要对所有代码进行测试,外部因素有可能影响代码的操作效果这点十分重要,这正是我们在跨浏览器JavaScript开发时要面对的情况. 我们不仅要处理典型问题:确保代码质量,尤其是与多位同时编写一段代码的开发人员打交道时,并避免出现会破坏API的回归错误(

《JavaScript忍者秘籍》——2.5 总结

2.5 总结 在这一章中,我们已经学习了一些与调试JavaScript代码相关的基本技术,以及基于这些结果构建简单的测试用例. 我们研究了在代码执行时,如何使用日志记录来观察代码的行为,我们甚至实现了一个方便的方法,可以确保在现代和传统浏览器上都能够成功记录日志,不管它们之间有多少差异. 我们探索了如何使用断点,在特定的代码行上停止代码的执行,以便能够了解代码执行时的状态. 然后学习了测试用例生成,定义并关注良好测试的特性:可重复性(repeatability).简单性(simplicity)和

《JavaScript忍者秘籍》——2.2 测试用例生成

2.2 测试用例生成 Robert Frost曾写道:篱笆筑得牢,邻居处得好,Web应用程序也是如此,不管是何种编程准则,好的测试铸就好的代码.注意对这个"好"字的强调.如果测试用例的构建很差,它很有可能只是大量的测试套件,不会真正帮助我们提高代码质量. 优秀的测试用例具有三个重要特征. 可重用性(repeatability)--测试结果应该是高度可再生的.多次运行测试应该产生相同的结果.如果测试结果是不确定的,那我们又如何知道哪些结果是有效的,哪些又是无效的呢?此外,可重现性可以确保

《JavaScript忍者秘籍》——1.2 理解JavaScript语言

1.2 理解JavaScript语言 很多JavaScript程序员,在工作中不断进步,直到能够熟练使用大量的JavaScript语言元素,包括对象.函数(如果他们始终关注编码趋势)甚至是匿名内联函数.然而,在许多情况下,这些技巧可能并没有超出基础水平.此外,这些程序员,通常对JavaScript中闭包(closures)的目的和实现有着非常匮乏的理解,而闭包从根本上例证了函数对于该语言的重要性. JavaScript中,对象.函数和闭包之间有着很密切的关系(如图1.1所示).理解这三个概念之间

Javascript核心读书有感之语言核心_基础知识

读此书之前,感谢淘宝技术团队对此javascript核心的翻译,感谢弗拉纳根写出此书.感谢你们无私的分享,仅以此笔记献给你们的辛勤付出. 一:javascript语言核心 本章之后,我们将主要关注javascript的基础知识.第二章我们讲解javascript的注释,分号和unicode字符集:第三章会更有意思,主要讲解javascript的变量和赋值 这里有一些实例代码说明前两章的重点内容. 复制代码 代码如下: <script type="text/javascript"&