单元测试框架Jasmine学习笔记
2016-07-27 10:24
190 查看
前言
实习期间接触很多新东西。最近又在学习如何写一个独立的测试单元。看了公司前人的代码,后来网上搜寻了相关的知识,打算还是将自己的理解简单写下来。Jasmine简介
Jasmine是一种JavaScript的测试框架,它不依赖于其他框架,也不依赖于DOM结构。其语法特点在于简单清晰,就算是刚入门没多久的JavaScript程序猿也能够写出简单的测试单元代码。Jasmine下载
下载地址为:https://github.com/jasmine/jasmine/releases其中包括很多版本,写该博文时,最新版本为2.4.1。
https://github.com/jasmine/jasmine
英文介绍地址为:http://jasmine.github.io/
Jasmine核心
Suites(describe)是Jasmine的核心,是一个测试集,里面包括多个specs(
it),而每个specs里面可能包含多个断言(
expect)。
Suites(describe
)
Suites使用describe()来定义,其中传递两个参数为:
string:用于描述测试组的名称
function:是测试组的主体函数
测试组的代码如下:
describe("This is a suite", function() { it("This is a specs", function() { var a = 'abc'; expect(a).toEqual('abc'); }); });
代码使用
describe()函数定义了一个名为“This is a suite”的测试组,测试组的内容在于判断a是否等于“abc”,主体内容将在后面继续介绍。
为了能够在测试开始前先进行部分初始化,或者在测试结束后对一些内容进行销毁,主体还包括四个全局函数:
beforeEach():在describe函数中每个Spec执行之前执行。
afterEach():在describe函数中每个Spec数执行之后执行。
beforeAll():在describe函数中所有的Specs执行之前执行,但只执行一次,在Sepc之间并不会被执行。
afterAll():在describe函数中所有的Specs执行之后执行,但只执行一次,在Sepc之间并不会被执行。
例如:
describe("This is a suite", function() { beforeEach(function(){ var a = 'abc'; }); afterEach(fu ba40 nction(){ a = ''; }) it("This is a specs1", function() { expect(a).toEqual('abc'); }); });
上述代码中,在每一个specs执行前都会声明变量a为“abc”,而在测试之后,都会将其置为空字符串。
嵌套describe
Suites可以嵌套定义,每层都可以包含自己的specs,并且进行测试。同样可以包含各自的beforeEach()和
afterEach()等函数。例如:
describe("This is the first describe", function() { var a; beforeEach(function() { a = 'abc'; }); afterEach(function() { a = ''; }); it("is just a function", function() { expect(a).toEqual('abc'); }); describe("This is the second describe", function() { var b; beforeEach(function() { b = 'abc'; }); it("is just a function too", function() { expect(b).toEqual(a); }); }); });
上述代码定义了一个Suites,其中判断变量a是否为“abc”,后嵌套定义一个Suites,判断变量b是否等于变量a。而每一层Suites都含有自己的
beforeEach()函数来给变量赋值。
Specs(it
)
Specs是测试组里的每个测试体,其中用it()函数定义测试体,传递两个参数:
string:用于描述测试体的名称
function:测试体的主体内容
如上一段代码中,
it("This is a specs", function() { expect(a).toEqual('abc'); });
则为一个测试体,当然,每个测试组Suites可以包含多个测试体,如下:
describe("This is a suite", function() { it("This is a specs1", function() { var a = 'abc'; expect(a).toEqual('abc'); }); it("This is a specs2", function() { var b = {}; expect(b).toBe({}); }); it("This is a specs3", function() { expect(c).toBeUndefined(); }); });
代码定义了一个测试组“This is a suite”,其中包括三个specs,分别测试a是否等于‘abc’,b是否和空对象一致,c是否为undefined。
断言(expect
)
Specs里面可能包含多个断言,只有在所有的断言都返回true时才会通过,否则测试失败。正如上面代码所示,expect(c).toBeUndefined();为一个测试语句,判断c变量是否为undefined。
expect()传递一个参数,为
actual,接收实际值,而后面紧跟着一个Matchers传递一个(或没有),来进行判断是否通过。如例子所示,c为实际值,而
ToBeUndefined()则为Matchers,进行的比较则为c(实际值)是否为undefined。
再比如:
expect(a).toEqual('abc');传递的实际值为a,与“abc”进行判断是否相等。
Matchers
Jasmine定义了多个Matchers,用来测试一些变量是否通过。常见的有:
toBe():判断两个变量是否全等,类似于“===”;
toNotBe():与上一个相反,判断两个变量是否不全等,类似于“!==”;
toBeDefined():检查变量或属性是否已声明且赋值;
toBeUndefined():与上一个相反;
toBeNull():判断变量是否为null;
toBeTruthy():判断变量如果转换为布尔值,是否为true;
toBeFalsy():与上一个相反;
toBeLessThan():与数值比较,是否小于;
toBeGreaterThan():与数值比较,是否大于;
toEqual():判断变量是否相等,相当于“==”;
toContain():判断一个数组中是否包含元素(值)。只能用于数组,不能用于对象;
toBeCloseTo():数值比较时定义精度,先四舍五入后再比较;
toMatch():按正则表达式匹配;
toNotMatch():与上一个相反;
toThrow():检验一个函数是否会抛出一个错误。
自定义Matchers
当然,用户可以自定义Matchers。在beforeEach()或
it()函数里调用
Jasmine.addMatchers(),其中可以传递一个参数
expected作为测试值,而实际值则保存在
this.actual中,代码如下:
describe("This is a suite", function() { beforeEach(function(){ var a = 'abc'; this.addMatchers({ toBeTrue : function(expected){ return this.actual==expected; } }); }); it("This is a specs1", function() { expect(a).toBeTrue('abc'); }); });
代码在
beforeEach()中调用
this.addMatchers()定义了一个Matchers。定义了
ToBeTrue(),传递一个参数
expected与实际值作比较。
后面调用该Matchers时,代码
expect(a).toBeTrue('abc');中,a则为实际值(
this.actual),而“abc”则为参数
expected。
该定义的Matchers与原有的
toEqual()类似。
相关文章推荐
- 计算盒子模型的尺寸、display属性、块级和内联元素、浮动、overfloat
- Redis 发布订阅
- java 8 增强的工具类:Arrays
- DNS服务器
- 顺序表应用2:多余元素删除之建表算法
- 蓝点通用管理系统《三分钟入门》图文版
- 微信分享菜单栏显示,隐藏
- solr5.0.0的使用(—)
- POJ - 2823 Sliding Window (单调队列求解区间最值)
- 【C# DateTime】如何一次性修改DateTime的默认ToString格式
- Android自定义控件之基本原理(一)
- solr5.0.0的使用(二)
- Redis HyperLogLog
- POJ3126 - Prime Path
- 简单的调用第三方XlistView的上拉加载下拉刷新
- js判断打开设备
- 如何将下载的谷歌卫星地图导出成多张等份大图
- 湘潭oj 1247 Pair-Pair
- docker命令详解
- (LeetCode)Contains Duplicate II --- 查找重复的元素升级版