Mocha是一個功能豐富的,運行在node.js上的JavaScript的測試框架。node
(1)在沒有引入測試框架前的測試代碼npm
//math.js module.exports = { add : (...args) =>{ return args.reduce((prev,curr)=>{ return prev + curr +1; }) }, mul:(...args) =>{ return args.reduce((prev,curr) =>{ return prev * curr }) } }
//test.js const {add ,mul} = require('./math'); if(add(2,3)===5){ console.log('add(2,3)===5'); }else{ console.log('add(2,3)!==5'); }
(2)引用node assert模塊的測試 上面的測試用例不具備語義化的特色,而經過斷言庫咱們能夠達到語義化測試用例的目的。 注:assert斷言在測試用例經過時控制檯沒有輸出信息,只有錯誤時纔會輸出json
const assert = require('assert'); const {add ,mul} = require('./math'); assert.equal(add(2,3),6);
除了node的assert的模塊,也有一些第三方斷言庫可使用,例如Chai。框架
Mocha自己是沒有斷言庫的,若是在測試用例中引入非node自帶的語言庫須要本身安裝。async
// 全局安裝 Install with npm globally npm install --global mocha // 本地安裝 as a development dependency for your project npm install --save-dev mocha
const {should,expect,assert} = require('chai'); const {add,nul} = require('./math'); describe('#math',()=>{ describe('add',()=>{ it('should return 5 when 2 + 3',() =>{ expect(add(2,3),5); }); it('should return -1 when 2 + -3',() =>{ expect(add(2,-3),-1); }) }) describe('mul',()=>{ it('should return 6 when 2 * 3',() =>{ expect(add(2,3),6); }); }); })
運行Mocha,能夠經過在package.json中經過配置運行工具
{ //其它配置... "scripts": { "test": "mocha mocha.js" } }
而後執行「npm test」命令便可,須要注意的是mocha會檢查統一路徑下的全部文件,因此在在配置時能夠指定到特定的某個文件,以避免報錯。執行完以後會把結果(不管對錯和執行測試用例的數量還有執行總時長)顯示出來,以下圖所示: 性能
mocha其它功能實例測試
//只執行其中某條用例 it.only('should return 5 when 2 + 3',() =>{ expect(add(2,3),5); }); //跳過某條不執行 it.skip('should return 5 when 2 + 3',() =>{ expect(add(2,3),5); });
以上咱們系的例子代碼量都比較少,僅做爲示例,但若是代碼量龐大,咱們怎樣保證測試的覆蓋率呢,這就須要一些工具來幫咱們檢測,istanbul就是其中一個。ui
//安裝istanbul npm install -g istanbul
{ //其它配置... "scripts": { "test": "mocha mocha.js", "cover":"istanbul cover _mocha mocha.js" } }
運行stanbul來檢測代碼的覆蓋率,能夠經過在package.json中經過來配置。而後經過「npm run cover」這條命令來調用,結果如圖所示: this
使用了單元覆蓋率會使咱們的代碼在正確性上獲得必定保證,但在平常測試中,但好有一個問題要考慮,那就是性能。有一些輔助工具能夠幫咱們達到目的,benchmark就是其一。
npm i --save benchmark
//fn.js module.exports = { num1:n =>parseInt(n), num2:n => Number(n) }
//benchmark.js const {num1,num2} = require('./fn'); const Benchmark = require('benchmark'); const suite = new Benchmark.Suite; suite.add('parseInt',() =>{ num1('123456'); }).add('Number',() =>{ num2('123456') }).on('cycle',event =>{ console.log(String(event.target)) }).on('complete',function(){ console.log('Faster is '+ this.filter('fastest').map('name')); }).run({ async:true });
而後在命令行執行「node benchmark」,稍等幾秒便可看到結果,如圖所示: