单元测试中,我们通常需要在执行测试代码前准备一些测试数据,建立测试场景,这些为了测试成功而所做的准备工作称为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. 简易的AJAX工具[转]

    关键字: ajax 1.创建XMLHttpRequest对象的js文件 Ajax.js function Ajax(){    var xmlHttp=null;    if(window.XMLHt ...

  2. 计时器chronometer补充

    项目中要实现关于安卓控件chronometer这部分的功能需求: 1.计时器的功能对用户答题时间进行时间统计,用户答完该题,进入下一题,计时器接续上一题的结束时间继续计时: 2.用户可以跳出答题界面, ...

  3. Docker学习计划

    刚开始学习Docker的时候,找资料在网上看到最多的是Docker的好处.比如: 1.Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多 2.Docker 对系统资源的利用率很高, ...

  4. layer弹窗插件实战用法小结1—— layer.alert()

    http://layer.layui.com 第一节:layer.alert()弹窗的用法 1.解压layer-v2.2.zip压缩包 2.拷贝layer文件夹到实战项目目录 3.注意:layer.j ...

  5. PHP格式化字符串函数 sprintf()

    定义和用法 sprintf() 函数把格式化的字符串写入一个变量中. 语法 sprintf(format,arg1,arg2,arg++) 参数 描述 format 必需.转换格式. arg1 必需. ...

  6. centos 安装mysql 5.5.12

    1.安装gcc-c++  gcc make cmake编译器 2.安装ncurses 3.添加用户组 groupadd mysql useradd -r -g mysql mysql 4.安装 tar ...

  7. Angular - - $resource 更高端的数据交互

    $resource 创建一个resource对象的工厂函数,可以让你安全的和RESFUL服务端进行数据交互. 需要注入 ngResource 模块.angular-resource[.min].js ...

  8. Intent的属性及Intent-filter配置——Component属性

    Intent的Component属性需要接受一个ComponentName对象,ComponentName对象包含如下几个构造器. ComponentName(String pkg,String cl ...

  9. C#中IDisposable

    在Net中,由GC垃圾回收线程掌握对象资源的释放,程序员无法掌控析构函数的调用时机.对于一些非托管资源,比如数据库链接对象等,需要实现IDisposable接口进行手动的垃圾回收.那么什么时候使用Id ...

  10. 细数JDK里的设计模式

    原文出处: javacodegeeks   译文出处:deepinmind 这也是篇老文了,相信很多人也看过.前面那些废话就不翻译了,直接切入正题吧~ 结构型模式: 适配器模式: 用来把一个接口转化成 ...