日期:2014-05-16  浏览次数:20417 次

JavaScript单元测试系列二:将Jasmine集成到JsTestDriver

?

JavaScript单元测试系列二:将Jasmine集成到JsTestDriver

?

大漠穷秋

?

接着上一篇。

?

什么是Jasmine

?

Jasmine(茉莉花)是一个用来对JavaScript进行单元测试的框架。

?

核心特点:

?

1、不依赖于其它任何框架;

2、不需要DOM支持(也就是说可以脱离浏览器!);

3、行为驱动式语法,写起来非常简单;

4、支持对异步调用的测试;

5、可以在多种环境中运行(包括Ruby、NodeJS、Scala、Java、BPM、.net、Perl---我擦!真尼玛强大,具体参见下面的官方站点。)

?

官方站点: https://github.com/pivotal/jasmine/wiki

?

来自淘宝UED团队的研究文章:

?

http://www.36ria.com/4457

?

Quick Start

?

第一步:到这里https://github.com/pivotal/jasmine/downloads下载Jasmine standalone版;

?



?

?

第二步:在任意浏览器中打开SpecRunner.html,你将会看到以下内容;

?



?

?

好了,这就是Jasmine!

?

这个最简单的例子测试了src目录里面Player和Song这两个JavaScript类,测试用例代码位于spec目录中。

?

好吧,现在你还看不懂spec里面的那两个js文件到底在干嘛。为了能看懂,我们先来学一下Jasmine的基本语法。

?

快速掌握Jasmine语法

?

学习Jasmine记住四个核心的概念即可:分组用例期望匹配

?

四个核心概念分别对应Jasmine的四种函数,简要说明如下:

?

1、describe(string,function)这个函数表示分组,也就是一组测试用例。

2、it(string,function)这个函数表示测试用例。

3、expect(expression)表示期望expression这个表达式具有某个值或者具有某种行为。

4、to***(arg)这个函数表示匹配。

?

对于同一组(describe)中的多个测试用例(it),可以做一些重复性的动作,比如在每一个测试用例运行之前把某个变量+1等等。因 此,Jasmine提供了beforeEach和afterEach两个函数,这也是为什么要有分组这个概念的原因。beforeEach和 afterEach的语法细节参见:http://pivotal.github.io/jasmine/

?

最简单的例子

?

describe("Group1", function() {
   it("sample1", function() {
       expect(true).toBe(true);
   });
})

?

我们期望布尔值true恒等于另一个布尔值true,显然,这个用例永远是正确的,测试一定会通过。

?

describe可以嵌套,并且里面可以放多个it,更细节的语法这里就不赘述了,请自行阅读前面的链接。

?

内置的匹配函数解析

?

在当前最新的版本中,Jasmine内置了15个匹配函数,列表如下:

?

toBe()
toBeDefined()
toBeUndefined()
toBeNull()
toBeTruthy()
toBeFalsy()
toEqual()
toBeLessThan()
toBeGreaterThan()
toContain()
toBeCloseTo()
toHaveBeenCalled()
toHaveBeenCalledWith()
toMatch()
toThrow()

?

仔细看看这些名字,能猜到它们想干嘛不?分别看一个例子:

?

expect(a).toBe(true);//期望变量a为true
expect(a.foo).toBeDefined();//期望a.foo已定义
expect(a.foo).toBeUndefined();//期望a.foo未定义
expect(a).toBeNull();//期望变量a为null
expect(a.isMale).toBeTruthy();//期望a.isMale为真
expect(a.isMale).toBeFalsy();//期望a.isMale为假
expect(true).toEqual(true);//期望true等于true
expect(a).toBeLessThan(b);//期望a小于b
expect(a).toBeGreaterThan(b);//期望a大于b

?

toContain()用来检测数组中是否包含某个元素:

?

var a = ['foo', 'bar', 'baz'];
expect(a).toContain('bar');

?

toBeCloseTo()这个函数需要稍稍解释一下,看例子:

?

var pi = 3.1415926, e = 2.78;
expect(pi).not.toBeCloseTo(e, 2);
expect(pi).toBeCloseTo(e, 0);

?

toBeCloseTo基本的功能是,把两个数按照指定的精度都进行四舍五入,然后比较是否相等。

?

第一个例子里面有一个not,表示否定的意思(类似地,not可以加到任何一个匹配函数之前来表示否定)。变量pi保留两位小数是3.14,2.78保留两位小数还是2.78,因此不相等,第一个expect通过。

?

第二个例子,pi只保留整数,为3;而2.78只保留整数(四舍五入)之后也为3,因此相等,所以第二个expect也通过。

?

toHaveBeenCalled()

?

expect(user.setName).toHaveBeenCalled();

?

期望user.setName这个方法已经被调用过。

?

toHaveBeenCalledWith()

?

expect(user.setName).toHaveBeenCalledWith("damoqiongqiu");

?

期望在调用user.setName这个方法的时候传递了"damoqiongqiu"这个参数。

?

toMatch()

?

expect(message).toMatch(/bar/);

?

用来对字符串进行正则匹配。

?

toThrow(