51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1933|回复: 0
打印 上一主题 下一主题

[讨论] 单元测试框架Jasmine学习笔记

[复制链接]
  • TA的每日心情
    无聊
    2024-9-27 10:07
  • 签到天数: 62 天

    连续签到: 1 天

    [LV.6]测试旅长

    跳转到指定楼层
    1#
    发表于 2018-3-7 15:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    前言

    实习期间接触很多新东西。最近又在学习如何写一个独立的测试单元。看了公司前人的代码,后来
    网上搜寻了相关的知识,打算还是将自己的理解简单写下来。

    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:是测试组的主体函数
    测试组的代码如下:
    1. describe("This is a suite", function() {
    2.   it("This is a specs", function() {
    3.     var a = 'abc';
    4.     expect(a).toEqual('abc');
    5.   });
    6. });
    复制代码
    代码使用describe()函数定义了一个名为“This is a suite”的测试组,测试组的内容在于判断a是否等
    于“abc”,主体内容将在后面继续介绍。

    为了能够在测试开始前先进行部分初始化,或者在测试结束后对一些内容进行销毁,主体还包括
    四个全局函数:
    beforeEach():在describe函数中每个Spec执行之前执行。
    afterEach():在describe函数中每个Spec数执行之后执行。
    beforeAll():在describe函数中所有的Specs执行之前执行,但只执行一次,在Sepc之间并不会被
    执行。
    afterAll():在describe函数中所有的Specs执行之后执行,但只执行一次,在Sepc之间并不会被执
    行。
    例如:
    1. describe("This is a suite", function() {
    2.   beforeEach(function(){
    3.     var a = 'abc';
    4.   });
    5.   afterEach(function(){
    6.     a = '';
    7.   })
    8.   it("This is a specs1", function() {
    9.     expect(a).toEqual('abc');
    10.   });
    11. });
    复制代码
    上述代码中,在每一个specs执行前都会声明变量a为“abc”,而在测试之后,都会将其置为空字符串。

    嵌套describe

    Suites可以嵌套定义,每层都可以包含自己的specs,并且进行测试。同样可以包含各自的before
    Each()和afterEach()等函数。例如:
    1. describe("This is the first describe", function() {
    2.   var a;

    3.   beforeEach(function() {
    4.     a = 'abc';
    5.   });

    6.   afterEach(function() {
    7.     a = '';
    8.   });

    9.   it("is just a function", function() {
    10.     expect(a).toEqual('abc');
    11.   });

    12.   describe("This is the second describe", function() {
    13.     var b;

    14.     beforeEach(function() {
    15.       b = 'abc';
    16.     });

    17.     it("is just a function too", function() {
    18.       expect(b).toEqual(a);
    19.     });
    20.   });
    21. });
    复制代码
    上述代码定义了一个Suites,其中判断变量a是否为“abc”,后嵌套定义一个Suites,判断变量b是否等
    于变量a。而每一层Suites都含有自己的beforeEach()函数来给变量赋值。

    Specs(it)

    Specs是测试组里的每个测试体,其中用it()函数定义测试体,传递两个参数:
    string:用于描述测试体的名称
    function:测试体的主体内容
    如上一段代码中
    1. it("This is a specs", function() {
    2.     expect(a).toEqual('abc');
    3.   });
    复制代码
    则为一个测试体,当然,每个测试组Suites可以包含多个测试体,如下:
    1. describe("This is a suite", function() {
    2.   it("This is a specs1", function() {
    3.     var a = 'abc';
    4.     expect(a).toEqual('abc');
    5.   });
    6.   it("This is a specs2", function() {
    7.     var b = {};
    8.     expect(b).toBe({});
    9.   });
    10.   it("This is a specs3", function() {
    11.     expect(c).toBeUndefined();
    12.   });
    13. });
    复制代码
    代码定义了一个测试组“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中,代码如下:

    1. describe("This is a suite", function() {
    2.   beforeEach(function(){
    3.     var a = 'abc';
    4.     this.addMatchers({
    5.       toBeTrue : function(expected){
    6.         return this.actual==expected;
    7.       }
    8.     });
    9.   });
    10.   it("This is a specs1", function() {
    11.     expect(a).toBeTrue('abc');
    12.   });
    13. });
    复制代码
    代码在beforeEach()中调用this.addMatchers()定义了一个Matchers。定义了ToBeTrue(),传递一个参
    数expected与实际值作比较。
    后面调用该Matchers时,代码expect(a).toBeTrue('abc');中,a则为实际值(this.actual),而“abc”
    则为参数expected。
    该定义的Matchers与原有的toEqual()类似。

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-23 09:23 , Processed in 0.062216 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表