組裏立刻要轉變開發模式,由傳統的開發模式(Developer開發,QA測試),轉變爲嘗試TDD(Test-driven development,測試驅動開發)的開發模型。由此將不存在QA的角色,或者僅存不多的QA用於系統模塊間的集成測試。node
所以代碼的測試與開發都將由開發者(Developer)來保證。npm
這就須要藉助優秀測試框架的幫助,尤爲是支持TDD開發模式的自動化測試框架更爲重要,由於我使用的編程是語言是Node.js,那麼普遍使用的Mocha.js將成爲個人首選。編程
在團隊轉型過程當中,不少事情都要你們本身摸索。對於Node.js的TDD開發模式,我也作了些入門的學習。app
首先來了解下什麼是TDD。框架
一. 什麼是TDD?async
經過維基百科關於TDD的介紹,可知,TDD,全稱Test-driven Development,中文測試驅動開發,是來源於Agile敏捷開發的一個極限編程思想。學習
大體是講,Developer開發以前,先寫測試用例(test case),測試用例寫好後,再來實現須要實現的方法或功能,而後跑一遍測試用例,看可否經過。未來新加功能時,也是先加測試用例,而後新功能實現後,再跑一遍全部的測試用例,若是全部用例都成功(Pass),那麼則代碼質量能夠保證。測試
下圖是來自維基百科的TDD模式流程圖。flex
大概就是這樣一個流程。ui
在TDD的設想中,測試用例爲先,是第一要務。
除了TDD外,還有ATDD和BDD的概念。BDD的概念用的不少,簡單介紹一下。
1. TDD 與 BDD
BDD是Behaviour-driven Development,行爲驅動開發,相比TDD,BDD更關注經過測試,觀察到程序的行爲是否正確,所以它的接口是使用describe。而與BDD相比,TDD更偏重與測試代碼的功能是否實現正確,它的接口是suite。由於我也是初學,其中差異理解不深。但對我而言,好用,適合纔是更重要,所以我仍是會選擇TDD爲切入點,之後可能會根據實際調整。
2. Test Suite
由上可知,TDD的接口使用的是suite。那這裏必需要介紹下Test Suite的概念,在維基百科中,
Test Suite:a collection of test cases that are intented to be used to test a software program to show that it has same specified set of behaviours.
其實suite就是一組測試用例的集合,可用於對測試用例進行分類。suite裏面能夠嵌套suite,就像測一個功能的一組測試例子裏面再細分測不一樣小功能的機組測試例子。
3. Test Case測試用例的結構
咱們在寫測試用例時,一個被普遍接受的結構是:
a. Setup: 準備好環境和數據,跑這個測試用例以前的準備
b. Execution:執行測試(測試用例的實現的主要代碼)
c. Validation:驗證結果
d. Cleanup:現場恢復,通常與a相反。不影響跑後面的測試用例。
介紹完TDD的概念和接口,下面就能夠引入Mocha.js啦。
二. Mocha.js - Javascript測試框架,支持TDD,BDD等多種接口
Mocha.js是被普遍使用的Javascript測試框架,官網:http://mochajs.org/
官方對其的定義是:
Mocha is a feature-rich JavaScript test framework running on node.js and the browser, making asynchronous testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases.
使用Mocha.js,能夠寫測試用例,並跑用例來獲得結果,同時還支持多種格式的Report來顯示結果。支持TDD,BDD等接口,是TDD開發過程當中的好幫手。
因爲TDD和BDD,Mocha提供的接口不一樣,這裏個人例子主要是使用TDD。
首先要安裝Mocha.js,可經過NPM
1 npm install -g mocha
安裝好後,可以使用mocha命令來使用mocha提供的功能。
例如mocha -h可查看命令幫助,以下。
在這裏,我實現一個簡單常見的測試用例,來講明Mocha.js如何使用。
首先介紹一下幾個重要的接口,
suite:定義一組測試用例。
suiteSetup:此方法會在這個suite全部測試用例執行前執行一次,只一次,這是跟setup的區別。
setup:此方法會在每一個測試用例執行前都執行一遍。
test:具體執行的測試用例實現代碼。
teardown:此方法會在每一個測試用例執行後都執行一遍,與setup相反。
suiteTeardown:此方法會在這個suite全部測試用例執行後執行一次,與suiteSetup相反。
這些接口都是與TDD概念中的接口對應與相關實現,方便組織測試用例。BDD的接口在這裏不予贅述,可參考官方文檔。
測試用例代碼以下:
1 var assert = require('assert'); 2 var mocha = require('mocha'); 3 4 var suite = mocha.suite; 5 var setup = mocha.setup; 6 var suiteSetup = mocha.suiteSetup; 7 var test = mocha.test; 8 var teardown = mocha.teardown; 9 var suiteTeardown = mocha.suiteTeardown; 10 11 //test case 12 suite('Array', function(){ 13 14 suiteSetup(function(){ 15 //suiteSetup will run only 1 time in suite Array, before all suite 16 //... 17 console.log('suitSetup...'); 18 }); 19 20 setup(function(){ 21 //setup will run 1 time before every suite runs in suite Array 22 //... 23 console.log('setup...'); 24 }); 25 26 suite('indexOf()', function(){ 27 test('should return -1 when not present', function(){ 28 assert.equal(-1, [1, 2, 3].indexOf(4)); 29 }); 30 }); 31 32 suite('indexOf2()', function(){ 33 test('should return not -1 when present', function(){ 34 assert.equal(0, [1, 2, 3].indexOf(1)); 35 }); 36 }); 37 38 teardown(function(){ 39 //teardown will run 1 time after every suite runs in suite Array 40 //... 41 console.log('teardown...'); 42 }); 43 44 suiteTeardown(function(){ 45 //suiteTeardown will run 1 time in suite Array, after all suits run over. 46 //... 47 console.log('suiteTeardown...'); 48 }); 49 });
執行這個測試用例,經過以下命令:
1 mocha test.js
結果以下:
能夠看到2個測試例子都Pass,另外經過打印的信息,可看到不一樣接口的使用區別。這些都方便之後寫正確的測試用例。
總之,可見,有了Mocha.js的幫助,TDD的Node.js開發講變得很容易。
三. 關於TDD的一些感想
之前看過陳皓的一篇文章,講TDD其實沒有看上去那麼美。經過本身接觸以來,發現了一些難作到的地方或小問題,以下:
1. 測試用例難寫
要針對不一樣功能的Module,寫出能準確測試其功能的用例,不是件容易事,可能會花費不少時間和精力。而Developers每每更傾向於把精力主要用在功能的實現。
2. 要維護大量的測試用例
功能複雜的Module,測試用例的數量也多,當然每次修改代碼後,跑一遍全部的例子很cool,可是若是功能代碼常常須要變更,測試用例也要常常變更,須要花費精力維護。
無論怎樣,變化老是會帶來好事,擁抱變化。在摸石頭過河中,探索適合本身的開發模式才重要。但願真正的開發任務到來以後,能不斷總結遇到的問題,並根據本身的實際需求,找到適用本身的模式和路子:-)
四. 參考文檔
1. http://en.wikipedia.org/wiki/Test-driven_development
2. http://en.wikipedia.org/wiki/Test_suite
3. http://mochajs.org/
Kevin Song
2015年6月9日