Javascript单元测试框架比较Qunit VS Jasmine
Javascript单元测试框架比较Qunit VS Jasmine
工欲行其事必先利其器,好的单元测试框架是TDD成功的一半。Javascript优秀的测试框架很多, 包括Jasmine,Qunit,JsTestDriver,JSUnit,Mocha等,当然你也可以写自己的单元测试框架,本文主角是Jasmine和Qunit。我之前一直用Qunit来做单元测试,Qunit在中国占有率是非常高的,我也不例外,而美国同事们已经用到Jasmine了,为了做一个更好的选型,决定对这两个框架做了一个小小的比较。
先看看作者对自己框架的描述:
Jörn Zaefferer( QUnit作者 ) : QUnit是一个JavaScript单元测试框架,主要用于在浏览器中运行单元测试。虽然这个项目从属于jQuery,但却不依赖于jQuery,也不依赖于浏览器DOM。因此你也可以在node.js或Rhino上使用。QUnit很容易学习,你只需在html页面中包含两个文件,不需要安装或者构建任何其他东西。最短的测试集只需要一个11行的html文件。
Davis Frank(Jasmine作者): Jasmine是一个 JavaScript测试框架,目的是将BDD风格引入JavaScript测试之中。至于区别嘛,我们的目标是BDD(相比标准的TDD),因此我们尽 力帮助开发人员编写比一般xUnit框架表达性更强,组织更好的代码。此外我们还力图减少依赖,这样你可以在node.js上使用Jasmine,也可以在浏览器或移动程序中使用。
1、Jasmine和Qunit报表比较
Qunit报表

Jasmine报表

从报表来看都非常精致,结果一目了然。Jasmine有子分组,而且分组很清晰,而Qunit可以在一个测试现在多个断言数。这是他们各自的优点,这块各有千秋。
2、Jasmine和Qunit的断言比较
Jamine,他有12种原生断言比较,同时我们可以很容易的定义自己的断言,这是一个很大的优点。
Qunit自带8种断言,当然你可以自己扩展,但相对比较麻烦,唯一优势是断言可以带自定义描述。
从断言比较这块来讲,Jasmine略带优势。
3、Jasmine和Qunit的分组(分模块)比较
Jasmine用describe()来进行分组和模块,它的优势是可以嵌套,也就是可以很好的区分子模块,非常明了使用的功能。
Qunit用module()进行分组,不能区分子木块。
从这块来函,Jasmine再下一城。
4、Jasmine和Qunit的测试比较
Jasmine只有it()一个用来操作测试的方法。
Qunit包含3个测试用的方法,这个比较多。多了异步测试的方法,而且expect()可以限制断言个数。
这块Qunit略丰富于Jasmine。
5、Jasmine和Qunit的异步控制
先看Jasmine的异步控制方法,很长,很麻烦,需要自己从新封装。

//其中player.openLibrary含异步调用
it('The music library should be opend', function() {
var flag; runs(function() {
flag = false;
player.openLibrary(function() {
flag = true;
});
});
waitsFor(function() {
return flag;
}, "aaaaaaa", 500);
runs(function() {
expect(player.library.openLibrary).toEqual(true);
});
});

再看Qunit的,很简单明了。

//其中player.openLibrary含异步调用
asyncTest('The music library should be opend', function() {
player.openLibrary(function() {
start();
ok(player.library != null, 'The "player.library" should be not null.');
ok(player.library.openLibrary === true, 'The music library should be opened');
});
});
//或则
test('The music library should be opend', function() {
stop();
player.openLibrary(function() {
start();
ok(player.library != null, 'The "player.library" should be not null.');
ok(player.library.openLibrary === true, 'The music library should be opened');
});
});

异步控制测试来看Qunit更清晰明了。
6、Mock Clock和Spies
这是两个Jasmine独有的东西,非常好。我也非常喜欢这两个功能Mock Clock能让你Mock一个时间间隔(这里我们可以精确的测试我们的代码执行时间),Spies可以用你知道函数的被调用次数和调用的方式,这是Jasmine优越的地方。
7、市场占用额:Jasmine51%,Qunit31%,这是去年12月份的统计数据。
8、 集成和配置:这块也是非常重要的,这里Qunit和Jasmine都是可以集成到Jenskin和VS2012的,也都可以用来测试RequireJs.
9、数据装载和卸载:这块也是Qunit和Jasmine都可以实现的功能非常有用。
有了这些比较,我承认我更喜欢Jasmine了,以后改用Jasmine做Javascript测试了。
Jasmine官网:http://pivotal.github.io/jasmine/
Qunit官网:http://qunitjs.com/
Javascript测试框架汇总:http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#JavaScript
下面附上我之前的比较表
|
Jasmine
|
Qunit
|
Result
|
|
|---|---|---|---|
| Assert |
expect(x).toEqual(y) expect(x).toBe(y) expect(x).toMatch(pattern) expect(x).toBeDefined() expect(x).toBeUndefined() expect(x).toBeNull() expect(x).toBeTruthy() expect(x).toBeFalsy() expect(x).toContain(y) expect(x).toBeLessThan(y) expect(x).toBeGreaterThan(y) expect(function(){fn();}).toThrow(e) We can write custom matchers when you want to assert a more specific sort of expectation.
|
deepEqual() equal() notDeepEqual() notEqual() notStrictEqual() ok() strictEqual() throws() |
Jasmine ≈ Qunit |
| Grouping |
describe() |
module() Group related tests under a single label. |
Jasmine > Qunit |
| Test |
it() It with two parameters: a string and a function. |
Qunit can display number of assertions in a test asyncTest() expect() test() |
Jasmine ≈ Qunit |
| Asynchronous Control |
runs() waits() waitsFor() |
asyncTest() start() stop() |
Jasmine < Qunit |
| Mock and Spies |
Providing mock and spies are good functions for unit test. |
\ | Jasmine > Qunit |
| Market share | 45% | 31% | Jasmine > Qunit |
| Test Report | Jasmine report | Qunit report | Jasmine ≈ Qunit |
| Integrate VS | Y | Y | Jasmine ≈ Qunit |
| Integrate CI | Y | Y | Jasmine ≈ Qunit |
| Parameterized tests | \ | plugins qunit-parameterize | Jasmine < Qunit |
| Configuration with RequireJs | Y | Y | Jasmine ≈ Qunit |
| Setup and Teardown | Y | Y | Jasmine ≈ Qunit |
Javascript单元测试框架比较Qunit VS Jasmine的更多相关文章
- JavaScript单元测试框架-Jasmine
Jasmine的开发团队来自PivotalLabs,他们一开始开发的JavaScript测试框架是JsUnit,来源于著名的JAVA测试框架JUnit.JsUnit是xUnit的JavaScript实 ...
- javascript单元测试框架mochajs详解
关于单元测试的想法 对于一些比较重要的项目,每次更新代码之后总是要自己测好久,担心一旦上线出了问题影响的服务太多,此时就希望能有一个比较规范的测试流程.在github上看到牛逼的javascript开 ...
- javascript单元测试框架mochajs详解(转载)
章节目录 关于单元测试的想法 mocha单元测试框架简介 安装mocha 一个简单的例子 mocha支持的断言模块 同步代码测试 异步代码测试 promise代码测试 不建议使用箭头函数 钩子函数 钩 ...
- JavaScript单元测试框架JsUnit基本介绍和使用
JavaScript单元测试框架JsUnit基本介绍和使用 XUnit framework XUnit是一套标准化的独立于语言的概念和结构集合,用于编写和运行单元测试(Unit tests). 每一个 ...
- JavaScript单元测试框架:Jasmine
摘抄:http://blog.csdn.net/GuoJiangweigege/article/details/52130589 互联网的快速发展,给web开发人员带来了前所未有的挑战.对于前端开发, ...
- JS单元测试框架:QUnit
QUnit:jQuery的单元测试框架,但不仅限于jQuery(从这个工具不需要引用jquery.js可以看出) index.html <!-- 官网 http://qunitjs.com/ - ...
- javascript单元测试(转)
1. 什么是单元测试 在计算机编程中,单元测试(又称为模块测试)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.程序单元是应用的最小可测试部件.在过程化编程中,一个单元就是单 ...
- (译)学习如何构建自动化、跨浏览器的JavaScript单元测试
作者:Philip Walton 译者:Yeaseon 原文链接:点此查看 译文仅供个人学习,不用于任何形式商业目的,转载请注明原作者.文章来源.翻译作者及链接,版权归原文作者所有. ___ 我们都知 ...
- [转]javascript单元测试
1. 什么是单元测试 在计算机编程中,单元测试(又称为模块测试)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.程序单元是应用的最小可测试部件.在过程化编程中,一个单元就是单 ...
随机推荐
- Linux 时区变化
1.查看当前的时区 date -R 2.改动当前时区 tzselect 之后会出来一个选项菜单,选择你想要的时区就OK了 3.替换系统时区文件 cp /usr/share/zoneinfo/XXX/Y ...
- iOS开发的一些奇巧淫技2
能不能只用一个pan手势来代替UISwipegesture的各个方向? - (void)pan:(UIPanGestureRecognizer *)sender { typedef NS_ENUM(N ...
- Django----模板
为了将html页面和python代码分离开来,有必要介绍一下模板的作用,Django中自带很多模板. 以下一个html模板文件: <html> <head><title& ...
- DB2建表语句
db2 => create table test (name char(8) not null primary key,depid smallint,pay bigint) DB20000I S ...
- PHP系列目录
原文:PHP系列目录 PHP系列的对象是已经熟悉了一门或多门语言的开发人员.如果你是其中一份子,而且你也打算学习PHP,相信你根据本系列会很快掌握PHP的.欢迎大家给出意见或建议.同时也欢迎大家的批评 ...
- selenium2入门 定位 窗体切换等等 (二)
定位用的html素材有两个 demo.html <html> <head> <title>UI Automation Testing</title> & ...
- 【转】NuGet的安装与使用
学习了一段时间的MVC,今天想自己尝试初步搭建一个MVC框架,结果新建MVC4.0(MVC3.0同样)项目时,弹出一个错误提示框,如下图.上网一搜,说是要安装一个第三方组件NuGet.刚接触MVC,更 ...
- Error with mysqld_safe
出处:http://bugs.mysql.com/bug.php?id=18403 Description: - I downloaded the binary file “Standard 5.0. ...
- C语言移位运算
移位运算有两种:>>(右移),<<(左移). a>>b表示将a的二进制值右移b位. a<<b 表示将a的二进制值左移 b位.要求 a和 b都是整型, b ...
- android的EditText获取另一个焦点
在android关于开发过程EditText在setFocusable(false);后,设置时需要再次获得输入焦点setFocusable(true);问题后仍然无法获得焦点: 解决的方法: 对Ed ...