国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > JS > 正文

NodeJS測試框架mocha入門教程

2024-05-06 16:36:43
字體:
來源:轉載
供稿:網友

NodeJS里最常用的測試框架估計就是mocha了。它支持多種node的assert libs, 同時支持異步和同步的測試,同時支持多種方式導出結果,也支持直接在browser上跑Javascript代碼測試。

本文示例大多源于官網示例,部分示例結合需要或自己的感想有所改動。更多介紹請看 官方網址:Mocha on Github

Installation:

當你成功安裝nodejs v0.10 和 npm后執行下面這條命令。

# npm install -g mocha

p.s. Ubuntu的注意apt源里的nodejs版本會比較舊,某些module會不支持,請從nodejs官網進行源碼安裝。

First step to Mocha:

以下為最簡單的一個mocha示例:

var assert = require("assert");describe('Array', function(){ describe('#indexOf()', function(){  it('should return -1 when the value is not present', function(){     assert.equal(-1, [1,2,3].indexOf(5));   assert.equal(-1, [1,2,3].indexOf(0)); }) })});

describe (moduleName, testDetails) 由上述代碼可看出,describe是可以嵌套的,比如上述代碼嵌套的兩個describe就可以理解成測試人員希望測試Array模塊下的#indexOf() 子模塊。module_name 是可以隨便取的,關鍵是要讓人讀明白就好。
it (info, function) 具體的測試語句會放在it的回調函數里,一般來說info字符串會寫期望的正確輸出的簡要一句話文字說明。當該it block內的test failed的時候控制臺就會把詳細信息打印出來。一般是從最外層的describe的module_name開始輸出(可以理解成沿著路徑或者遞歸鏈或者回調鏈),最后輸出info,表示該期望的info內容沒有被滿足。一個it對應一個實際的test case
assert.equal (exp1, exp2) 斷言判斷exp1結果是否等于exp2, 這里采取的等于判斷是== 而并非 === 。即 assert.equal(1, ‘1') 認為是True。這只是nodejs里的assert.js的一種斷言形式,下文會提到同樣比較常用的should.js。
如果exp1和exp2均為字符串,字符串比較出錯時則控制臺會用顏色把相異的部分標出來。

Asynchronous

Frist step 中的代碼顯然是個 Synchronous 的代碼,那么對于異步代碼應該怎么做呢?很簡單,在你最深處的回調函數中加done()表示結束。

fs = require('fs');describe('File', function(){ describe('#readFile()', function(){   it('should read test.ls without error', function(done){   fs.readFile('test.ls', function(err){  if (err) throw err;  done();  }); }) })})

done ()<br> 按照瀑布流編程習慣,取名done是表示你回調的最深處,也就是結束寫嵌套回調函數。但對于回調鏈來說done實際上意味著告訴mocha從此處開始測試,一層層回調回去。

上例代碼是test pass的,我們嘗試把test.ls改成不存在的test.as。便會返回具體的錯誤位置。

這里可能會有個疑問,假如我有兩個異步函數(兩條分叉的回調鏈),那我應該在哪里加done()呢?實際上這個時候就不應該在一個it里面存在兩個要測試的函數,事實上一個it里面只能調用一次done,當你調用多次done的話mocha會拋出錯誤。所以應該類似這樣:

fs = require('fs');describe('File', function(){ describe('#readFile()', function(){   it('should read test.ls without error', function(done){   fs.readFile('test.ls', function(err){  if (err) throw err;  done();  }); })   it('should read test.js without error', function(done){   fs.readFile('test.js', function(err){  if (err) throw err;  done();  }); }) })})

Pending

即省去測試細節只保留函數體。一般適用情況比如負責測試框架的寫好框架讓組員去實現細節,或者測試細節尚未完全正確實現先注釋以免影響全局測試情況。這種時候mocha會默認該測試pass。
作用有點像Python的pass。

describe('Array', function(){ describe('#indexOf()', function(){  it('should return -1 when the value is not present', function(){ }) })});

Exclusive && Inclusive

其實很好理解,分別對應only和skip函數。

fs = require('fs');describe('File', function(){ describe('#readFile()', function(){   it.skip('should read test.ls without error', function(done){   fs.readFile('test.ls', function(err){  if (err) throw err;  done();  }); })   it('should read test.js without error', function(done){ }) })})

上面的代碼只會有一個test complete, 只有only的會被執行,另一個會被忽略掉。每個函數里只能有一個only。如果是it.skip ,那么該case就會被忽略。

only和skip共用沒有什么實際意義,因為only的作用會把skip屏蔽掉。

fs = require('fs');describe('File', function(){ describe('#readFile()', function(){   it.skip('should read test.ls without error', function(done){   fs.readFile('test.as', function(err){  if (err) throw err;  done();  }); })   it('should read test.js without error', function(done){ }) })})

上面的代碼盡管test.as不存在,但是由于skip,依然會顯示test complete。

Before && After

單元測試里經常會用到before和after。mocha同時還提供了beforeEach()和afterEach()。
這里為方便閱讀用livescript表示,!->可理解成function(){}。細節無需細讀,只需通過框架了解這幾個函數如何使用便可。

require! assertrequire! fscan = itdescribe 'Array', !-> beforeEach !-> console.log 'beforeEach Array' before !-> console.log 'before Array'  before !-> console.log 'before Array second time' after !-> console.log 'after Array' describe '#indexOf()', !-> can 'should return -1 when the value is not present', !->  assert.equal -1, [1,2,3].indexOf 0 can 'should return 1 when the value is not present', !-> describe 'File', !-> beforeEach !->  console.log 'beforeEach file test!' afterEach !->  console.log 'afterEach File test!' describe '#readFile()', !->  can 'should read test.ls without error', !(done)->  fs.readFile 'test.ls', !(err)->   if err   throw err   done!  can 'should read test.js without error', !(done)->  fs.readFile 'test.js', !(err)->   if err   throw err   done!

由結果可知(after的使用與before同理),

beforeEach會對當前describe下的所有子case生效。
before和after的代碼沒有特殊順序要求。
同一個describe下可以有多個before,執行順序與代碼順序相同。
同一個describe下的執行順序為before, beforeEach, afterEach, after
當一個it有多個before的時候,執行順序從最外圍的describe的before開始,其余同理。

Test Driven Develop (TDD)

mocha默認的模式是Behavior Driven Develop (BDD),要想執行TDD的test的時候需要加上參數,如

mocha -u tdd test.js

前文所講的describe, it, before, after等都屬于BDD的范疇,對于TDD,我們用suite, test, setup, teardown。樣例代碼如下:

suite 'Array', !-> setup !-> console.log 'setup' teardown !-> console.log 'teardown' suite '#indexOf()', !-> test 'should return -1 when not present', !->  assert.equal -1, [1,2,3].indexOf 4


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿拉善盟| 永年县| 方山县| 永城市| 蕲春县| 阿克| 黄龙县| 高碑店市| 长乐市| 乌兰县| 永宁县| 和龙市| 明星| 肇源县| 收藏| 荃湾区| 綦江县| 衡水市| 会同县| 惠州市| 保定市| 安阳市| 麻城市| 麻江县| 杭锦后旗| 湖州市| 清水河县| 威信县| 天门市| 枞阳县| 西和县| 晋宁县| 安康市| 隆德县| 武定县| 吉林市| 荥阳市| 淳化县| 滨州市| 兰溪市| 揭西县|