单元测试中,我们通常需要在执行测试代码前准备一些测试数据,建立测试场景,这些为了测试成功而所做的准备工作称为Test Fixture。而测试完毕后也需要释放运行测试所需的资源。这些铺垫工作占据的代码可能随着测试复杂度的增加而增加。为了避免在每个测试用例里重复这些代码,测试框架一般都会提供安装(Setup)和拆卸(Teardown)函数。

Jasmine提供了4个全局函数用于安装和拆卸:

函数名称 描述
beforeEach 在每一个测试用例执行之前都执行一遍beforeEach函数
afterEach 在每一个测试用例执行完成之后都执行一遍afterEach函数
beforeAll 在测试套件中所有测试用例执行之前执行一遍beforeAll函数
afterAll 在测试套件中所有测试用例执行完成之后执行一遍afterAll函数

这些函数接受一个回调函数作为参数,执行相关的安装代码和拆卸代码。例如:

describe(‘Player’, function() {
var player;
beforeEach(function() {
player = new Player();
});
afterEach(function() {
/* cleanup code */
});
it(‘should be able to play a Song’, function() {
/* code and assertions */
});
});

在Jasmine中describe块可以嵌套,所以测试用例可以定义在任何一层describe块里。理解Jasmine安装和拆卸函数在嵌套describe情况下的执行顺序,有助于合理组织测试用例。

我们使用以下这个例子:

describe('Jasmine Execution Sequence', function () {
beforeAll(function () {
console.log('outer beforeAll');
});
beforeEach(function () {
console.log('outer beforeEach');
});
it('spec 1', function () {
console.log('spec 1');
});
console.log('statement 1');
describe('inner', function () {
beforeAll(function () {
console.log('inner beforeAll');
});
afterAll(function () {
console.log('inner afterAll');
});
console.log('statement 3');
beforeEach(function () {
console.log('inner beforeEach');
});
it('spec 3', function () {
console.log('spec 3');
});
afterEach(function () {
console.log('inner afterEach');
});
});
it('spec 2', function () {
console.log('spec 2');
});
console.log('statement 2');
afterEach(function () {
console.log('outer afterEach');
});
afterAll(function () {
console.log('outer afterAll');
});
});

输出结果如下:

statement 1
statement 3
statement 2
outer beforeAll
outer beforeEach
spec 1
outer afterEach
inner beforeAll
outer beforeEach
inner beforeEach
spec 3
inner afterEach
outer afterEach
inner afterAll
outer beforeEach
spec 2
outer afterEach
outer afterAll

以上示例有这样的输出结果是因为:

  • Jasmine会先执行describe块的代码,然后再执行beforeAll,beforeEach和it函数。所以“statement 1”,“statement 3”,“statement 2”首先被输出。
  • describe块的代码从上到下依次执行。尽管console.log('statement 2')在外层describe块里,但是它还是排在内层describe块的console.log('statement 3')后面执行。
  • beforeAll会在它所在describe块的测试用例和beforeEach执行前执行,而且只执行一次。
  • beforeEach会在它所在describe块和内层describe块里的测试用例执行前被执行。所以“outer beforeEach”会在外层的测试用例“spec 1”之前执行,也会在内层的测试用例“spec 3”之前执行。而“inner beforeEach”只会在“spec 3”之前执行。
  • 在每个测试用例执行前,Jasmine会从最外层的describe块开始,顺序执行每个beforeEach,直到这个测试用例所在的describe块为止。所以在执行测试用例“spec 3”之前,Jasmine先执行“outer beforeEach”,然后执行“inner beforeEach”。
  • 测试用例会从上到下依次执行。虽然“spec 2”在外层,但是它还是在内层的测试用例“spec 3”后面执行。
  • 测试用例执行完后,Jasmine会执行测试用例所在describe块的afterEach,然后依次执行外层的afterEach,直至最外层describe块。例如在“spec 3”测试用例完成后,“inner beforeEach”会先被执行,然后是“outer afterEach”。
  • afterAll会在它所在describe块的测试用例和afterEach执行后执行,而且只执行一次。

  

浅谈Jasmine的安装和拆卸的更多相关文章

  1. 浅谈Redis及其安装配置

    一.Redis的介绍 二.Redis的安装配置 三.Redis的配置文件说明 四.Redis的简单操作 简介: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型. ...

  2. 浅谈 zookeeper 原理,安装和配置

    当前云计算流行, 单一机器额的处理能力已经不能满足我们的需求,不得不采用大量的服务集群.服务集群对外提供服务的过程中,有很多的配置需要随时更新,服务间需要协调工作,那么这些信息如何推送到各个节点?并且 ...

  3. 我的QT5学习之路(一)——浅谈QT的安装和配置

    一.前言 说到Qt,不能不说到C++,这门伟大的语言.因为其面向对象的编程思想和陡峭的学习曲线,一开始学习起来很是吃力.Qt从QT4开始基本封装了很多C++的工具库和界面库,而且支持跨平台,这是它最大 ...

  4. 浅谈scrapy框架安装使用

    Scrapy笔记: 一 安装: pip3 install wheel pip3 install lxml pip3 install pyopenssl pip3 install -i https:// ...

  5. 安装JDK后JRE与JVM联系浅谈

    转自安装JDK后JRE与JVM联系浅谈 安装JDK后JRE.JVM之间的关系是什么呢?那么我们要从安装JDK慢慢说起. 如果安装了JDK,会发同你的电脑有两套JRE: 一套位于 <JDK安装目录 ...

  6. Linux CentOS下MySQL的安装配置之浅谈

    前期必备安装:VMware虚拟机,CentOS镜像[注意:Linux下使用CentOS   MySQL是不用在官网下载的,只需要配置就OK了] 下面开始正式操作: //CentOS安装MySQL之浅谈 ...

  7. 浅谈angular2+ionic2

    浅谈angular2+ionic2   前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2 ...

  8. 浅谈Hybrid技术的设计与实现第二弹

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...

  9. 浅谈Hybrid技术的设计与实现

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 随着移动浪潮的兴起,各种APP层出不穷,极速的业务扩展提升了团队对开发 ...

随机推荐

  1. ashx文件中使用session提示“未将对象引用设置到对象的实例”

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Data;u ...

  2. 13.TCP的超时与重传

    TCP提供可靠的运输层.它使用的方法之一就是确认从另一端收到的数据.但数据和确认都有可能会丢失.TCP通过在发送时设置一个定时器来解决这种问题.如果当定时器溢出时还没有收到确认,它就重传该数据. 对于 ...

  3. 封装bt轮播图淡入淡出效果样式

    <!--BT轮播图-->    <div data-ride="carousel" class="carousel slide carousel_inn ...

  4. 在 AngularJS 中将 XML 转换为 JSON

    在这篇文章中,我们将谈谈如何在Angular JS中将XML文件转换为JSON.大家都知道Angular JS是开发应用程序的JavaScript框架.所以基本上Angular  JS期望得 到的响应 ...

  5. Android Studio快捷键汇总

  6. HDU-2031-进制转换

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2031 进制转换 Time Limit: 2000/1000 MS (Java/Others)    M ...

  7. 实例:基于ListActivity实现列表

    如果程序的窗口仅仅需要显示一个列表,则可以直接让Activity继承ListActivity来实现,ListActivity的子类无须调用setContentView()方法来显示某个界面,而是可以直 ...

  8. Raphael的transform用法

    Raphael的transform用法 <%@ page language="java" contentType="text/html; charset=UTF-8 ...

  9. ubuntu和Deepin下chrome浏览器提示flash下载失败或者过期的解决方案

    问题:更新了下Deepin系统,打开chrome发现,视频放不了了,提示flash"下载失败" 谷歌浏览器版本是Version 55.0.2883.87 (64-bit) flas ...

  10. HDU4496(并查集)

    D-City Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Subm ...