前言
实习期间接触很多新东西。最近又在学习如何写一个独立的测试单元。看了公司前人的代码,后来网上搜寻了相关的知识,打算还是将自己的理解简单写下来。
简介
Jasmine是一种JavaScript的测试框架,它不依赖于其他框架,也不依赖于DOM结构。其语法特点在于简单清晰,就算是刚入门没多久的JavaScript程序猿也能够写出简单的测试单元代码。
下载 & 部署
下载地址:https://github.com/jasmine/jasmine/releases
环境部署:
解压后,dist 下就是各个版本的独立运行包,解压最新的 2.x 版本,双击打开 SpecRunner.html 即可运行测试,注意要在SpecRunner.html 的 <head> 内引用 Jasmine 的 js 文件和测试文件。想简单使用的话,将 soucre/spec 下的测试文件替换成你自己的即可。
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Jasmine Spec Runner v2.0.0</title> <link rel="shortcut icon" type="image/png" href="lib/jasmine-2.0.0/jasmine_favicon.png"> <link rel="stylesheet" type="text/css" href="lib/jasmine-2.0.0/jasmine.css"> <script type="text/javascript" src="lib/jasmine-2.0.0/jasmine.js"></script> <script type="text/javascript" src="lib/jasmine-2.0.0/jasmine-html.js"></script> <script type="text/javascript" src="lib/jasmine-2.0.0/boot.js"></script> <!-- 被测试的代码 --> <script type="text/javascript" src="src/xxx.js"></script> </head> <body> </body> </html>
快速入门
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="jquery-1.11.3.js"></script> <link rel="stylesheet" type="text/css" href="jasmine-2.8.0/jasmine.css"> <script src="jasmine-2.8.0/jasmine.js"></script> <script src="jasmine-2.8.0/jasmine-html.js"></script> <script src="jasmine-2.8.0/boot.js"></script> </head> <body> <script> function get1() { $.getJSON("http://localhost:8080/test/get").then(function(result) { console.log(result); }); } // 每一个测试用例的超时时间 jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000; // 请求的接口的前缀 // http://localhost:8080/test var base = "/ajaxserverapache"; //测试模块 describe("ajax", function() { // 测试方法 it("get请求", function(done) { // 服务器返回的结果 var result; $.getJSON(base + "/get").then(function(jsonObj) { result = jsonObj; }); // 由于是异步请求,需要使用setTimeout来校验 setTimeout(function() { expect(result).toEqual({ "data" : "get ok" }); // 校验完成,通知jasmine框架 done(); }, 100); }); }); </script> </body> </html>
核心
Suites(describe
)是Jasmine的核心,是一个测试集,里面包括多个specs(it
),而每个specs里面可能包含多个断言(expect
)。
1、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(function(){ a = ''; }) it("This is a specs1", function() { expect(a).toEqual('abc'); }); });
上述代码中,在每一个specs执行前都会声明变量a为“abc”,而在测试之后,都会将其置为空字符串。
2、嵌套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); }); }); });
3、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。
4、断言(expect
)
Specs里面可能包含多个断言,只有在所有的断言都返回true时才会通过,否则测试失败。正如上面代码所示,expect(c).toBeUndefined();
为一个测试语句,判断c变量是否为undefined。
expect()传递一个参数,为actual,接收实际值,而后面紧跟着一个Matchers传递一个(或没有),来进行判断是否通过。如例子所示,c为实际值,而ToBeUndefined()则为Matchers,进行的比较则为c(实际值)是否为undefined。
再比如:expect(a).toEqual('abc');传递的实际值为a,与“abc”进行判断是否相等。
注意:it函数块可以包含多个expect过程,只要有其中的expect不符合期望,it就会测试不通过;而describe也可以包含多个it,只要有中有一个it报错,那么describe就会测试不通过。