浅谈Jasmine的安装和拆卸函数

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

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

函数名称 描述
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

 

以上示例有这样的输出结果是由于:spa

  • 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执行后执行,并且只执行一次。
相关文章
相关标签/搜索