淺談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執行後執行,並且只執行一次。
相關文章
相關標籤/搜索