JavaScript单元测试有什么用


本文摘自PHP中文网,作者青灯夜游,侵删。

在JavaScript中,单元测试是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作,其目标是隔离程序模块并证明这些单个模块是正确的。单元测试能确保在开发过程的早期就发现问题,可以使程序员方便地检查代码片断是否依然正常工作。

本教程操作环境:windows7系统、javascript1.8.5版、Dell G3电脑。

1、什么是单元测试?有什么用?

在计算机编程中,单元测试(又称为模块测试)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。

每个理想的测试案例独立于其它案例;为测试时隔离模块,经常使用stubs、mock 或fake等测试马甲程序。单元测试通常由软件开发人员编写,用于确保他们所写的代码符合软件需求和遵循开发目标。

单元测试的目标是隔离程序模块并证明这些单个模块是正确的。单元测试能确保在开发过程的早期就能发现问题,是为了让程序“死得更早”。我们应该从开发的早期就为所有函数和方法编写单元测试,可读性强的单元测试可以使程序员方便地检查代码片断是否依然正常工作。良好设计的单元测试案例覆盖程序单元分支和循环条件的所有路径。采用这种自底向上的测试路径,先测试程序模块再测试模块的集合,一旦变更导致错误发生,借助于单元测试可以快速定位并修复错误。

2、JavaScript单元测试现状

单元测试在后台开发中非常流行和普及,比如JAVA开发者的JUnit等,而在前端开发中则使用的非常少。究其原因,主要是单元测试更适用于逻辑代码的测试,这对于JAVA等后台编程语言来说测试起来非常方便,但是前端开发很多时候要要UI打交道,UI相关的代码不是不可以进行单元测试,但的确很麻烦,比起逻辑代码来说困难多了,这就导致了单元测试在前端开发没有普及起来。

但是随着单元测试的普及,尤其是敏捷开发的推动,涌现了许多优秀的JavaScript单元测试框架,如QUnit、Jasmine等。所有的这些框架基本上都能对Javascript代码进行很好的测试,当然UI部分的代码测试一样比较麻烦,但是我们可以通过精心构造我们的测试代码来测试部分UI代码。但是每个框架都不是万能的,它们都有各自擅长的领域,下面选取了几个具有代表性的框架进行介绍。

3、单元测试常用框架

l QUnit框架

a) 简介

QUnit是jQuery团队开发的JavaScript单元测试工具,功能强大且使用简单。目前所有的JQuery代码都使用QUnit进行测试,原生的JavaScript也可以使用QUnit。

最初,John Resig将QUnit设计为jQuery的一部分。2008年,QUnit才有了自己的名字、主页和API文档,也开始允许其他人用它来做单元测试。但当时QUnit还是基于jQuery的。直到2009年,QUnit才可以完全的独立运行。

b)优点

使用起来非常方便,有漂亮的外观和完整的测试功能(包括异步测试);

非常简单,容易上手,目前公开的API只有19个;

不需要依赖其它任何软件包或框架,只要能运行JS的地方就可以,QUnit本身只有一个JS文件和CSS文件,当然如果需要可以和jQuery等其它框架集成;

不仅支持在浏览器中测试,还支持在Rhino和node.js等后端测试。

c) 不足

对自动化支持不好,很难和Ant、Maven或自动构建等工具集成,主要用在浏览器中进行测试。

l Jasmine框架

a)简介

Jasmine是一个有名的JavaScript单元测试框架,它是独立的行为驱动开发框架,语法清晰易懂。

行为驱动开发(BDD):是一种敏捷软件开发的技术,它鼓励软件项目中的开发者、QA和非技术人员或商业参与者之间的协作。BDD最初是由Dan North在2003年命名,它包括验收和客户测试驱动等的极限编程的实践,作为对测试驱动开发的回应。在过去的数年里,得到了极大的发展。

BDD的重点是通过与利益相关者的讨论取得对预期的软件行为的清醒认识。它通过用自然语言书写非程序员可读的测试用例扩展了测试驱动开发方法。行为驱动开发人员使用混合了领域中统一的语言的母语语言来描述他们的代码的目的。这让开发者得以把精力集中在代码应该怎么写,而不是技术细节上,而且也最大程度的减少了将代码编写者的技术语言与商业客户、用户、利益相关者、项目管理者等的领域语言之间来回翻译的代价。

BDD的做法包括:

l 确立不同利益相关者要实现的远景目标

l 使用特性注入方法绘制出达到这些目标所需要的特性

l 通过由外及内的软件开发方法,把涉及到的利益相关者融入到实现的过程中

l 使用例子来描述应用程序的行为或代码的每个单元

l 通过自动运行这些例子,提供快速反馈,进行回归测试

l 使用“应当(should)”来描述软件的行为,以帮助阐明代码的职责,以及回答对该软件的功能性的质疑

l 使用“确保(ensure)”来描述软件的职责,以把代码本身的效用与其他单元(element)代码带来的边际效用中区分出来。

l 使用mock作为还未编写的相关代码模块的替身

BDD特性注入:一个公司可能有多个会带来商业利益的不同愿景,通常包括盈利、省钱或保护钱。一旦某个愿景被开发小组确定为当前条件下的最佳愿景,他们将需要更多的帮助来成功实现这个远景。

然后确定该愿景的主要利益相关者,会带入其他的利益相关者。每个相关者要定义为了实现该愿景他们需要完成的目标。例如,法务部门可能要求某些监管要得到满足。市场营销负责人可能要参加将使用该软件的用户的社区。安全专家需要确保该软件不会受到SQL注入的攻击。

通过这些目标,会定义出要实现这些目标所需要的大概的题目或者特性集合。例如,“允许用户排序贡献值”或“交易审计”。从这些主题,可以确定用户功能以及用户界面的第一批细节。

b) 优点

它是基于行为驱动开发实现的测试框架,它的语法非常贴近自然语言,简单明了,容易理解。

能很方便的和Ant、Maven等进行集成进行自动化测试,也可以方便和Jekins等持续集成工具进行集成,可以生成测试结果的XMl文档。

它有丰富的API,同时用户也支持用户扩展它的API,这一点很少有其它框架能够做到。

使用方便简单,只需要引入两个js文件即可

不仅支持在浏览器中测试,还支持在Rhino和node.js等后端测试。

对于Ruby语言有特别的支持,能够非常方便的集成到Ruby项目中去

c) 不足

在浏览器中的测试界面不如QUnit美观、详细。

l JsTestDriver

a) 简介

JsTestDriver是一个JavaScript单元测试工具,易于与持续构建系统相集成并能够在多个浏览器上运行测试轻松实现TDD风格的开发。当在项目中配置好JsTestDriver以后,如同junit测试java文件一般,JsTestDriver可以直接通过运行js文件来进行单元测试。JsTestDriver框架本身就是JAVA的jar包,需要在本地运行并监听一个端口。

b) 优点

可以一次测试多个浏览器,使用方法是在启动服务时可以将多个浏览器的路径作为参数传进去。可以在多台机器上的浏览器中运行,包括移动设备。

测试运行得很快,因为不需要将结果添加到DOM中呈现出来,它们能够同时在任意多的浏览器中运行,未修改的文件浏览器会从缓存提取。

不需要HTML配件文件,仅仅只需提供一个或多个脚本和测试脚本,测试运行器运行时会创建一个空文件。

能很方便的和Ant、Maven等进行集成进行自动化测试,也可以方便和Jekins等持续集成工具进行集成,可以生成测试结果的XML文档。

有Eclipse和IntelliJ插件,可以很方便的在这两个IDE中进行测试,和JUnit很像。

支持其它测试框架,可以测试其它测试框架写的测试代码,比如有对应的插件可以将QUnit和Jasmine测试代码转换成JsTestDriver的测试代码。

c) 不足

不能在浏览器中测试,只能通过自动化工具或控制台运行。生成的结果不够直观。

安装使用稍微有点麻烦,依赖于JAVA环境。

l FireUnit

a) 简介

FireUnit是一个基于Firebug的Javascript的单元测试框架。简单说来,FireUnit给Firebug增加了一个标签面板,并提供了一些简单的JavaScript API来记录和查看测试。

b) 优点

简单易用

c) 不足

功能不多,测试代码常常写在源码里,虽然可以实时地看到效果,但耦合太强,不易清理

只运行在Firefox下

【相关推荐:javascript学习教程

以上就是JavaScript单元测试有什么用的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

javascript中bind是什么意思

javascript怎么让div隐藏

href怎么调用javascript

javascript开发中常用的方法集

详解javascript扩展运算符的10种用法(总结)

深入浅出了解javascript的node中间件原理

html标签伪元素绑定事件的三种方式

javascript归属哪个公司

javascript的alert是什么

json.stringify()是干嘛的

更多相关阅读请进入《javascript》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...