BDD風格
mocha “接口” 系統允許開發者選擇自身喜愛的特定領域語言風格, mocha 提供 TDD(測試驅動開發)、BDD (行為驅動開發) 和 exports 風格的接口。
BDD是“行為驅動的開發”(Behavior-Driven Development)的簡稱,指的是寫出優秀測試的最佳實踐的總稱。
BDD認為,不應該針對代碼的實作細節寫測試,而是要針對行為寫測試。BDD測試的是行為,即軟體應該怎樣運作。
BDD接口提供以下方法:
- describe():測試套件
- it():測試用例
- before():所有測試用例的統一前置動作
- after():所有測試用例的統一後置動作
- beforeEach():每個測試用例的前置動作
- afterEach():每個測試用例的後置動作
BDD的特征就是使用describe()和it() 這兩個方法。
before()、after()、beforeEach()和afterEach() 是為測試做輔助的作用域,它們合起來組成了hook的概念。
descript()和it()
descript()
describe()方法接收兩個參數:第一個參數是一個字元串,表示測試套件的名字或标題,表示将要測試什麼。第二個參數是一個函數,用來實作這個測試套件。
上述中引出了一個概念:測試套件。那什麼是測試套件呢?
測試套件(test suite)指的是,一組針對軟體規格的某個方面的測試用例。也可以看作,對軟體的某個方面的描述(describe)。結構如下:
describe("A suite", function() {
// ...
});
it()
要想了解it(),首先我們要知道什麼是測試用例? 測試用例(test case)指的是,針對軟體一個功能點的測試,是軟體測試的最基本機關。一組相關的測試用例,構成一個測試套件。
測試用例由it函數構成,它與describe函數一樣,接受兩個參數:第一個參數是字元串,表示測試用例的标題;第二個參數是函數,用來實作這個測試用例。
BDD風格用例
var expect = require('chai').expect;
describe('Array', function(){
before(function(){
console.log('在測試之前運作');
});
describe('#indexOf()', function(){
it('當值不存在時應該傳回 -1', function(){
expect([1,2,3].indexOf(4)).to.equal(-1);
});
});
});
- 點選檔案管理按鈕,點選我們新建立的tests檔案夾右鍵,再點選建立一個expect.js檔案,然後輕按兩下檔案。
- 再把上述中的示例寫入到我們新建立的expect.js檔案當中,然後點選儲存檔案。(不建議拷貝)
- 最後在右邊linux環境中輸入指令 mocha expect.js , 運作我們的示例。
TDD風格
TDD(測試驅動開發)組織方式是使用測試集(suite)和測試(test)。
每個測試集都有 setup 和 teardown 函數。這些方法會在測試集中的測試執行前執行,它們的作用是為了避免代碼重複以及最大限度使得測試之間互相獨立。
TDD接口:
- suite:類似BDD中 describe()
- test:類似BDD中 it()
- setup:類似BDD中 before()
- teardown:類似BDD中 after()
- suiteSetup:類似BDD中 beforeEach()
- suiteTeardown:類似BDD中 afterEach()
var assert = require("assert");
suite('Array', function(){
setup(function(){
console.log('測試執行前執行');
});
suite('#indexOf()', function(){
test('當值不存在時應該傳回 -1', function(){
assert.equal(-1, [1,2,3].indexOf(4));
});
});
});
運作mocha:
mocha --ui tdd *.js (*表示的是檔案名)
PS:mocha 預設是使用 bdd 的接口,是以在這裡我們告訴mocha我們用的是tdd.
- 點選檔案管理按鈕,點選新建立的tests檔案夾右鍵,再點選建立一個tdd.js檔案,然後輕按兩下檔案。
- 再把上述中的示例寫入到我們新建立的tdd.js檔案當中,然後點選儲存檔案。(不建議拷貝)
- 最後在右邊linux環境中輸入指令 mocha --ui tdd tdd.js , 運作我們的示例。
exports
exports類似于nodejs裡的子產品文法,關鍵字 before, after, beforeEach, 和 afterEach 是特殊保留的,值為對象時是一個測試套件,為函數時則是一個測試用例。
示例如下:
module.exports = {
before: function(){
// ...
},
'Array': {
'#indexOf()': {
'當值不存在時應該傳回 -1': function(){
expect([1,2,3].indexOf(4)).to.equal(-1);
}
}
}
};
運作 mocha
mocha --ui exports *.js
總結
我們在前文中講到了 mocha 提供 TDD(測試驅動開發)、BDD (行為驅動開發) 和 exports 風格的接口。其實還有 QUnit 和 require 風格的接口。
但是比較常用就是 BDD 和 TDD,mocha 預設的也是BDD,且 BDD 是 TDD 的一個專業版本,它指定了從業務需求的角度出發需要哪些單元測試。本課程中主要講解的是 mocha BDD風格的接口。
聲明 歡迎轉載,但請保留文章原始出處:)如出現轉載未聲明 将追究法律責任~謝謝合作