欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

NodeJS測(cè)試框架mocha入門教程

 更新時(shí)間:2017年03月28日 11:57:26   作者:cnodejs  
本文給大家簡(jiǎn)單介紹了NodeJS里最常用的測(cè)試框架--mocha的安裝以及簡(jiǎn)單的使用方法,支持直接在browser上跑Javascript代碼測(cè)試,這里推薦給大家

NodeJS里最常用的測(cè)試框架估計(jì)就是mocha了。它支持多種node的assert libs, 同時(shí)支持異步和同步的測(cè)試,同時(shí)支持多種方式導(dǎo)出結(jié)果,也支持直接在browser上跑Javascript代碼測(cè)試。

本文示例大多源于官網(wǎng)示例,部分示例結(jié)合需要或自己的感想有所改動(dòng)。更多介紹請(qǐng)看 官方網(wǎng)址:Mocha on Github

Installation:

當(dāng)你成功安裝nodejs v0.10 和 npm后執(zhí)行下面這條命令。

# npm install -g mocha

p.s. Ubuntu的注意apt源里的nodejs版本會(huì)比較舊,某些module會(huì)不支持,請(qǐng)從nodejs官網(wǎng)進(jìn)行源碼安裝。

First step to Mocha:

以下為最簡(jiǎn)單的一個(gè)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是可以嵌套的,比如上述代碼嵌套的兩個(gè)describe就可以理解成測(cè)試人員希望測(cè)試Array模塊下的#indexOf() 子模塊。module_name 是可以隨便取的,關(guān)鍵是要讓人讀明白就好。
it (info, function) 具體的測(cè)試語(yǔ)句會(huì)放在it的回調(diào)函數(shù)里,一般來(lái)說(shuō)info字符串會(huì)寫(xiě)期望的正確輸出的簡(jiǎn)要一句話文字說(shuō)明。當(dāng)該it block內(nèi)的test failed的時(shí)候控制臺(tái)就會(huì)把詳細(xì)信息打印出來(lái)。一般是從最外層的describe的module_name開(kāi)始輸出(可以理解成沿著路徑或者遞歸鏈或者回調(diào)鏈),最后輸出info,表示該期望的info內(nèi)容沒(méi)有被滿足。一個(gè)it對(duì)應(yīng)一個(gè)實(shí)際的test case
assert.equal (exp1, exp2) 斷言判斷exp1結(jié)果是否等于exp2, 這里采取的等于判斷是== 而并非 === 。即 assert.equal(1, ‘1') 認(rèn)為是True。這只是nodejs里的assert.js的一種斷言形式,下文會(huì)提到同樣比較常用的should.js。
如果exp1和exp2均為字符串,字符串比較出錯(cuò)時(shí)則控制臺(tái)會(huì)用顏色把相異的部分標(biāo)出來(lái)。

Asynchronous

Frist step 中的代碼顯然是個(gè) Synchronous 的代碼,那么對(duì)于異步代碼應(yīng)該怎么做呢?很簡(jiǎn)單,在你最深處的回調(diào)函數(shù)中加done()表示結(jié)束。

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> 按照瀑布流編程習(xí)慣,取名done是表示你回調(diào)的最深處,也就是結(jié)束寫(xiě)嵌套回調(diào)函數(shù)。但對(duì)于回調(diào)鏈來(lái)說(shuō)done實(shí)際上意味著告訴mocha從此處開(kāi)始測(cè)試,一層層回調(diào)回去。

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

這里可能會(huì)有個(gè)疑問(wèn),假如我有兩個(gè)異步函數(shù)(兩條分叉的回調(diào)鏈),那我應(yīng)該在哪里加done()呢?實(shí)際上這個(gè)時(shí)候就不應(yīng)該在一個(gè)it里面存在兩個(gè)要測(cè)試的函數(shù),事實(shí)上一個(gè)it里面只能調(diào)用一次done,當(dāng)你調(diào)用多次done的話mocha會(huì)拋出錯(cuò)誤。所以應(yīng)該類似這樣:

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

即省去測(cè)試細(xì)節(jié)只保留函數(shù)體。一般適用情況比如負(fù)責(zé)測(cè)試框架的寫(xiě)好框架讓組員去實(shí)現(xiàn)細(xì)節(jié),或者測(cè)試細(xì)節(jié)尚未完全正確實(shí)現(xiàn)先注釋以免影響全局測(cè)試情況。這種時(shí)候mocha會(huì)默認(rèn)該測(cè)試pass。
作用有點(diǎn)像Python的pass。

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

Exclusive && Inclusive

其實(shí)很好理解,分別對(duì)應(yīng)only和skip函數(shù)。

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){
 })
 })
})

上面的代碼只會(huì)有一個(gè)test complete, 只有only的會(huì)被執(zhí)行,另一個(gè)會(huì)被忽略掉。每個(gè)函數(shù)里只能有一個(gè)only。如果是it.skip ,那么該case就會(huì)被忽略。

only和skip共用沒(méi)有什么實(shí)際意義,因?yàn)閛nly的作用會(huì)把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,依然會(huì)顯示test complete。

Before && After

單元測(cè)試?yán)锝?jīng)常會(huì)用到before和after。mocha同時(shí)還提供了beforeEach()和afterEach()。
這里為方便閱讀用livescript表示,!->可理解成function(){}。細(xì)節(jié)無(wú)需細(xì)讀,只需通過(guò)框架了解這幾個(gè)函數(shù)如何使用便可。

require! assert
require! fs
can = it


describe '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!

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

beforeEach會(huì)對(duì)當(dāng)前describe下的所有子case生效。
before和after的代碼沒(méi)有特殊順序要求。
同一個(gè)describe下可以有多個(gè)before,執(zhí)行順序與代碼順序相同。
同一個(gè)describe下的執(zhí)行順序?yàn)閎efore, beforeEach, afterEach, after
當(dāng)一個(gè)it有多個(gè)before的時(shí)候,執(zhí)行順序從最外圍的describe的before開(kāi)始,其余同理。

Test Driven Develop (TDD)

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

mocha -u tdd test.js

前文所講的describe, it, before, after等都屬于BDD的范疇,對(duì)于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

相關(guān)文章

  • Node.js中的進(jìn)程間通信

    Node.js中的進(jìn)程間通信

    這篇文章主要介紹了Node.js中的進(jìn)程間通信,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-09-09
  • 使用Node.js實(shí)現(xiàn)Clean?Architecture方法示例詳解

    使用Node.js實(shí)現(xiàn)Clean?Architecture方法示例詳解

    這篇文章主要為大家介紹了使用Node.js實(shí)現(xiàn)Clean?Architecture方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Node.js實(shí)現(xiàn)數(shù)據(jù)推送

    Node.js實(shí)現(xiàn)數(shù)據(jù)推送

    這篇文章主要為大家詳細(xì)介紹了Node.js實(shí)現(xiàn)數(shù)據(jù)推送的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-04-04
  • node版本下報(bào)錯(cuò)build: `vue-cli-service build`問(wèn)題及解決

    node版本下報(bào)錯(cuò)build: `vue-cli-service build`問(wèn)題及解決

    這篇文章主要介紹了node版本下報(bào)錯(cuò)build: `vue-cli-service build`問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 基于Node.js模板引擎教程-jade速學(xué)與實(shí)戰(zhàn)1

    基于Node.js模板引擎教程-jade速學(xué)與實(shí)戰(zhàn)1

    下面小編就為大家?guī)?lái)一篇基于Node.js模板引擎教程-jade速學(xué)與實(shí)戰(zhàn)1。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • node.js中 cluster 模塊和 worker_threads 模塊示例詳解

    node.js中 cluster 模塊和 worker_threads 模塊示例

    這篇文章主要介紹了node.js中 cluster 模塊和 worker_threads 模塊,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • Node.js Domain 模塊實(shí)例詳解

    Node.js Domain 模塊實(shí)例詳解

    這篇文章主要介紹了Node.js Domain 模塊實(shí)例代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Koa 使用小技巧(小結(jié))

    Koa 使用小技巧(小結(jié))

    這篇文章主要介紹了Koa 使用小技巧(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Node.js中 __dirname 的使用介紹

    Node.js中 __dirname 的使用介紹

    這篇文章主要給大家介紹了關(guān)于Node.js中 __dirname使用的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-06-06
  • Node.js模塊化的使用詳細(xì)介紹

    Node.js模塊化的使用詳細(xì)介紹

    nodejs中的模塊化是指將每個(gè)js文件會(huì)被認(rèn)為單獨(dú)一個(gè)的模塊。模塊之間是互相不可見(jiàn)的。如果一個(gè)模塊需要使用另一個(gè)模塊,那么需要通過(guò)指定語(yǔ)法來(lái)引入要使用的模塊,而且只能使用引入模塊所暴露的內(nèi)容
    2022-08-08

最新評(píng)論