11月阅读周·编写可测试的JavaScript代码:单元测试之单元测试框架篇
背景
去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。
没有计划的阅读,收效甚微。
新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。
这个“玩法”虽然常见且板正,但是有效,已经坚持阅读十个月。
已读完书籍:《架构简洁之道》、《深入浅出的Node.js》、《你不知道的JavaScript(上卷)》、《你不知道的JavaScript(中卷)》、《你不知道的JavaScript(下卷)》、《数据结构与算法JavaScript描述》、《WebKit技术内幕》、《前端架构:从入门到微前端》、《秒懂算法:用常识解读数据结构与算法》、《JavaScript权威指南》、《JavaScript异步编程设计快速响应的网络应用》。
当前阅读周书籍:《编写可测试的JavaScript代码》。
单元测试框架
最难编写的单元测试是第一个单元测试。第一个测试需要大量的样板代码,它还需要我们了解一些初始问题。例如,是使用现有的单元测试框架还是自己写一个?自动构建过程呢?如何收集、显示并跟踪单元测试的代码覆盖率?开发者已经几乎没有动力去编写任何单元测试,必须要处理这些只会让测试过程更加痛苦的合法问题。
可惜的是,单元测试没有神奇之药。开发人员需要专心工作才能获得回报。幸运的是,回报是巨大的。从薪水保证,到最后可维护的工作代码,单元测试提供了很多价值。作为一名开发人员,单元测试通常是唯一所需的正式测试;幸运的是,单元测试不是很困难。
就像编写JavaScript必须要使用一个健全的框架一样,不使用测试框架,是没办法进行单元测试工作的。框架提供的样板代码,使得我们不需要重新创建:测试套件/用例聚合(test suite/case aggregation)、断言(assertion)、模/桩(mock/stub)辅助器、异步测试实现以及其他更多内容。有很多好用的开源测试框架可以使用。在本章中,我们将使用YUI Test,当然所有测试实践都适用于任意测试框架——只是语法(或许是一些语义)不同而已。
测试框架最重要的部分是将测试聚合到测试套件和测试用例中。测试套件和测试用例是分散在很多文件中的,并且每个测试文件通常只包含单个模块的测试。最好的办法是将一个模块的所有测试都归类到一个单独的测试套件中。该测试套件可以包含多个测试用例,每个测试模块只测试模块的很小一部分功能。通过使用在测试套件和测试用例级别提供的setUp和tearDown函数,可以很容易地对测试前或测试后需要处理的内容进行处理,比如重置数据库状态。
单元测试中同样重要的部分是断言。断言是将期望值和实际值进行比较的实际应用。这就是理论联系实际:在测试中你所期望的值是什么?YUI测试提供了一套完整的断言函数,其结果被测试框架所记录,这样在所有测试都完成的时候,就可以很容易地看到哪些测试通过了,哪些测试失败了。
YUI Test框架还提供了一些可有可无的功能,如异步测试、强制失败、可忽略的测试以及模拟对象的支持,这使得它能够成为一个完整的单元测试工具。
最后还有一些功能,YUI Test在执行期间的不同时期所抛出的各种事件,以及YUI Test支持输出各种格式的测试结果。这些使我们可以将单元测试运行集成到自动化构建中。
最后还有一些功能,YUI Test在执行期间的不同时期所抛出的各种事件,以及YUI Test支持输出各种格式的测试结果。这些使我们可以将单元测试运行集成到自动化构建中。
另外两个流行的行为驱动开发(BDD)测试框架Vows和Jasmine也可用于服务器端测试。BDD背后的思想是使用“正常语言”结构描述我们认为代码应该做什么,或者更确切地说,函数应该返回什么。毫无疑问,这些都是100%理想的单元测试框架。最重要的是,它们也都支持异步测试,并且可以很容易地通过命令行进行安装和运行。不管你是否接受BDD,这些框架都提供了非常好的方法用于组织、执行并报告客户端和服务器端的JavaScript单元测试。
总结
YUI Test非常适合客户端JavaScript测试,也可以用于服务器端JavaScript单元测试。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
- 点赞
- 收藏
- 关注作者
评论(0)