JavaScript单元测试框架-Jasmine的核心概念

Jasmine是一种JavaScript的测试框架,它不依赖于其他框架,也不依赖于DOM结构。
以下是一些核心概念:

Suites(describe)

Suite表示一个测试集,以函数describe(string, function)封装,它包含2个参数:
string:测试组名称,
function:测试组函数。
一个Suite(describe)包含多个Specs(it),一个Specs(it)包含多个断言(expect)

describe("This is a suite", function() {
  it("This is a specs", function() {
    var a = 'abc';
    expect(a).toEqual('abc');
  });
});

Setup和Teardown操作(beforeEach,afterEach,beforeAll,afterAll)

JasmineSetupTeardown操作(Setup在每个测试用例Spec执行之前做一些初始化操作,Teardown在每个Sepc执行完之后做一些清理操作,这两个函数名称来自于JUnit),是由一组全局beforeEachafterEachbeforeAllafterAll函数来实现的。
beforeEach():在describe函数中每个Spec执行之前执行。
afterEach(): 在describe函数中每个Spec数执行之后执行。
beforeAll():在describe函数中所有的Specs执行之前执行,但只执行一次,在Sepc之间并不会被执行。
afterAll(): 在describe函数中所有的Specs执行之后执行,但只执行一次,在Sepc之间并不会被执行。
beforeAllafterAll适用于执行比较耗时或者耗资源的一些共同的初始化和清理工作。而且在使用时还要注意,它们不会在每个Spec之间执行,所以不适用于每次执行前都需要干净环境的Spec

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”,而在测试之后,都会将其置为空字符串。

this值

除了在describe函数开始定义变量,用于各it函数共享数据外,还可以通过this关键字来共享数据。
在在每一个Spec的生命周期(beforeEach->it->afterEach)的开始,都将有一个空的this对象(在开始下一个Spec周期时,this会被重置为空对象)。

嵌套Suite

describe函数可以嵌套,每层都可以定义Specs。这样就可以让一个Suite由一组树状的方法组成。
每个嵌套的describe函数,都可以有自己的beforeEachafterEach函数。
在执行每个内层Spec时,都会按嵌套的由外及内的顺序执行每个beforeEach函数,所以内层Sepc可以访问到外层Sepc中的beforeEach中的数据。类似的,当内层Spec执行完成后,会按由内及外的顺序执行每个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');
  });

多个测试体时

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();
  });
});

Expectations(expect)

Expectation就是一个断言,以expect语句表示,返回truefalsexpect语句有1个参数,代表要测试的实际值(the actual)
只有当一个Spec中的所有Expectations全为ture时,这个Spec才通过,否则失败。
Expectation带实际值,它和表示匹配规则的Matcher链接在一起,Matcher带有期望值。

Matchers

Jasmine定义了多个Matchers,用来测试一些变量是否通过。
常见的有:

  • toBe():判断两个变量是否全等,类似于“===”;
  • toNotBe():与上一个相反,判断两个变量是否不全等,类似于“!==”;
  • toBeDefined():检查变量或属性是否已声明且赋值;
  • toBeUndefined():与上一个相反;
  • toBeNull():判断变量是否为null;
  • toBeTruthy():判断变量如果转换为布尔值,是否为true;
  • toBeFalsy():与上一个相反;
  • toBeLessThan():与数值比较,是否小于;
  • toBeGreaterThan():与数值比较,是否大于;
  • toEqual():判断变量是否相等,相当于“==”;
  • toContain():判断一个数组中是否包含元素(值)。只能用于数组,不能用于对象;
  • toBeCloseTo():数值比较时定义精度,先四舍五入后再比较;
it("The 'toBeCloseTo' matcher is for precision math comparison", function() {
var pi = 3.1415926,
  e = 2.78;
expect(pi).not.toBeCloseTo(e, 2);
expect(pi).toBeCloseTo(e, 0);
  });
  • 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()类似。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容