單元測試是最小化的測試方式,也是TDD的作法。html
TDD概念以下圖:node
經過測試反饋推動開發,ruby是推崇這種編程方式的。express
nodejs有以下經常使用單元測試模塊npm
1.mocha編程
Mocha是一個基於node.js和瀏覽器的集合各類特性的Javascript測試框架,而且可讓異步測試也變的簡單和有趣。Mocha的測試是連續的,在正確的測試條件中遇到未捕獲的異常時,會給出靈活且準確的報告。json
安裝: 瀏覽器
npm install -g mocha
const assert = require("assert"); describe('Array', function() { describe('#indexOf()', () => { it('should return -1 when the value is not present', () =>{ assert.equal(-1, [1,2,3].indexOf(5)); assert.equal(-1, [1,2,3].indexOf(0)); }); }); });
describe裏面第一個參數爲輸出展現該測試段的目標,第二個參數爲回調,裏面寫須要測試的case。ruby
進行測試:app
mocha filename
能夠用於測試utils裏面封裝的經常使用函數,我的認爲適合一些非http請求類代碼測試。框架
2.should
require("should"); var name = "tonny"; describe("Name", function() { it("The name should be tonny", function() { name.should.eql("tonny"); }); }); var Person = function(name) { this.name = name; }; var zhaojian = new Person(name); describe("InstanceOf", function() { it("Zhaojian should be an instance of Person", function() { zhaojian.should.be.an.instanceof(Person); }); it("Zhaojian should be an instance of Object", function() { zhaojian.should.be.an.instanceof(Object); }); }); describe("Property", function() { it("Zhaojian should have property name", function() { zhaojian.should.have.property("name"); }); });
should的用法讓測試代碼可讀性更強。
3.supertest
用於http請求測試。
const request = require('supertest'); const express = require('express'); const app = express(); app.get('/user', function(req, res){ res.send(200, { name: 'tobi' }); }); request(app) .get('/user') .expect('Content-Type', /json/) .expect('Content-Length', '20') .expect(200) .end(function(err, res){ if (err) throw err; });
以前咱們遇到的中間件檢查問題,就能夠經過這個模塊來進行不一樣case的測試,保證接口邏輯上無誤差。
4.istanbul 代碼覆蓋率檢查工具
用法 :
istanbul cover filename
命令行模式會顯示覆蓋率狀況。
以後會生成coverage文件夾,裏面有html方式生成的覆蓋率報表。
其實單元測試在一些業務相對穩定,可是邏輯狀況比較複雜的項目中能夠對於一些重要的代碼進行全覆蓋測試,代碼的穩健不光是靠編程技術和思惟,也須要必定的輔助測試,在多人團隊協做開發中愈發重要。
單元測試和編程語言類型無關,它是一種良好的編程習慣。