個人博客:JavaScript單元測試框架node
測試是保證代碼質量的重要環節,web項目的單元測試雖然不能徹底完成功能測試,可是卻能保證底層單一模塊的工做質量,而且在代碼重構的時候保證對外接口不會發生變化。web
Mocha 是一個靈活的測試框架,但它只是一個結構,你須要引入其餘插件來實現一些測試功能,好比斷言庫、覆蓋統計等。npm
npm 安裝:npm install mocha --save-dev
json
簡要示例:數組
// 引入需測試的模塊或類 const add = require("./add"); const assert = require("assert"); // describe:定義一組測試 describe("加法函數測試", function() { before(function() { // runs before all tests in this block }); // it: 定義一個測試用例 it("1 加 1 應該等於 2", function() { // assert: nodejs內置斷言模塊 assert.equal(add(1, 1), 2); }); after(function() { // runs after all test in this block }); }); 複製代碼
爲測試腳本建立目錄test-mocha
,測試腳本命名應遵循[模塊名].test.js
的風格,而後在package.json
中配置測試命令:bash
"scripts": { "test-mocha": "mocha test-mocha/" } 複製代碼
執行npm run test-mocha
便可,將輸出測試結果以下圖:markdown
Mocha 支持should.js
, chai
, expect.js
, better-assert
, unexpected
等斷言庫。以上一個示例,能夠對比一下各個斷言庫的差異:框架
assert.ok(add(1, 1));
assert.equal(add(1, 1), 2);
複製代碼
(add(1, 1)).should.be.a.Number();
(add(1, 1)).should.equal(2);
複製代碼
expect(add(1, 1)).to.be.a("number"); expect(add(1, 1)).to.equal(2); 複製代碼
綜上,should.js
和expect.js
相較於assert
語義性更強,且支持類型檢測,而should.js
在語法上更加簡明,同時支持鏈式語法.and
。dom
Mocha 支持4種 hook,包括before / after / beforeEach / afterEach
。異步
Mocha 默認每一個測試用例執行2000ms,超出時長則報錯,因此在測試代碼中若是有異步操做,則須要經過done
函數來明確測試用例結束。done
接受Error
參數。
Mocha 在node環境下運行時,不支持 BOM 和 DOM 接口,須要引入jsdom
和jsdom-global
庫。
Jasmine 是一個功能全面的測試框架,內置斷言expect
;可是有全局聲明,且須要配置,相對來講使用更復雜、不夠靈活。
npm 安裝:npm install jasmine --save-dev
const add = require("../src/add"); describe("加法函數測試", function () { it("1加1等於2", function() { expect(add(1, 1)).toEqual(2); }); it("輸出數字", function() { expect(add(1, 1)).toEqual(jasmine.any(Number)); }); }); 複製代碼
Jasmine 的語法與 Mocha 很是類似,不過斷言採用內置的expect()
。
新建配置文件jasmine.json
:
{ // 測試腳本相對路徑 "spec_dir": "test-jasmine", // 測試腳本 "spec_files": [ "*.test.js" "!*.notest.js" ], // 測試前須要引入的腳本 "helpers": [], // 是否在遇到第一個報錯後中止測試 "stopSpecOnExpectationFailure": false, // 是否以半隨機順序執行測試 "random": false } 複製代碼
建立測試腳本目錄test-jasmine
,腳本文件命名爲[模塊名].test.js
,在package.json
中配置測試命令:
"scripts": { "test-jasmine": "jasmine --config=jasmine.json" } 複製代碼
而後執行npm run test-jasmine
便可,將輸出測試結果以下圖:
與 Mocha 類似。
Jest 是一個功能全面的「零配置」測試框架,既集成了各類工具,且無需配置便可使用。
npm 安裝:npm install --save-dev jest
Jest 語法與以上兩個框架不太相同:
const add = require("../src/add"); describe("加法函數測試", () => { test("1加1等於2", () => { expect(add(1, 1)).toBe(2); }); }); 複製代碼
Jest 中以test
定義一個測試用例,且自帶斷言expect
,斷言庫功能強大,但語法相較於should.js
來講更復雜。
斷言語法:
toBe
, not.toBe
toBeNull
, toBeUndefined
, toBeDefine
, toBeTruthy
, toBeFalsy
toBeGreaterThan
, toBeGreaterThanOrEqual
, toBeLessThan
, toEqual
, toBeCloseTo
(用於浮點數)toMatch
toContain
toEqual(expect.any(constructor))
建立測試腳本目錄test-jest
,腳本文件命名爲[模塊名].test.js
,在package.json
中配置測試命令:
"scripts": { "test-jest": "jest test-jest/" } 複製代碼
而後執行npm run test-jest
便可,將輸出測試結果以下圖:
Jest 一樣有四個hook,beforeAll/beforeEach/afterAll/afterEach
。
Jest 內置對 DOM 和 BOM 接口的支持。
Jest 內置覆蓋統計,爲了更方便地進行相關配置,咱們能夠建立一個配置文件jest.config.js
:
module.exports = { // 開啓覆蓋統計功能 collectCoverage: true, // 指定須要覆蓋的文件 collectCoverageFrom: [ "src/*.js" ], // 指定輸出覆蓋統計結果的目錄 coverageDirectory: "test-jest/coverage/", // 指定測試腳本 testMatch: [ "**/test-jest/*.test.js" ] }; 複製代碼
而後將package.json
中的命名修改一下:"test-jest": "jest"
,再運行後可得以下結果: