什么是單元-測試?
- 單元就是相對獨立的功能模塊泼橘,例如一個函數(shù)或者一個類涝动。一個完整的模塊化的程序,都應(yīng)該是有許多個單元構(gòu)成炬灭,單元能完成自己的任務(wù)醋粟,然后與其他單元進行交互 ,從而完成整個程序的功能重归。
- 而測試米愿,就是測試?yán)病?/li>
所以單元測試通俗點講就是對程序每個獨立的單元分別測試,保證構(gòu)成程序的每個模塊的正確性鼻吮,從而保證整個程序的正確運行育苟。
為什么要寫單元測試?
單元測試在前端還是不太普及的狈网,因為剛開始前端也是偏向‘UI’那一塊的宙搬,但隨著node的發(fā)展,越來越多非‘UI’的前端代碼拓哺,一個團隊也越來越多人參加開發(fā)勇垛,如果系統(tǒng)一復(fù)雜,又或者你的模塊提交到npm上面的話士鸥,一出錯基本就GG了闲孤。
又或者你這樣想,測試是逃不掉的烤礁,要么在dev上測試讼积,要么在prod上測試,怎么都得測試脚仔,而且每次提交都要測試勤众,為什么不寫自動測試呢。我也相信大多數(shù)程序員也有寫完跑跑看的習(xí)慣鲤脏,而單元測試的log都直接打印到console里面们颜,也省去了很多編譯吕朵,打包的時間,又能滿足各位的心理需求(猥瑣臉)窥突,一舉兩得啊努溃。
干了這杯 "Mocha"
mocha是一個js測試框架,除此外阻问,類似的測試框架還有Jasmine梧税、Karma、Tape等称近,至于為什么要介紹Mocha第队?因為我只懂這一個。
上代碼前還要普及一下兩個概念
-
BDD(Behavior Driven Development)
BDD意為行為驅(qū)動開發(fā)煌茬,是一種敏捷軟件開發(fā)技術(shù)斥铺,具體內(nèi)容大家可以參考wikipedia的解釋。 -
Assertion 斷言
斷言坛善,就是判斷代碼的執(zhí)行結(jié)果與預(yù)期是否一致晾蜘,不一致就拋出錯誤,說得簡單點就是判斷程序的真假眠屎。
舉個例子
// add.js
function add(a, b) {
return a + b
}
module.exports = add
通常測試腳本要與測試源碼同名剔交,比如add.js的測試腳本就是add.test.js
// add.test.js
const add = require('./add.js')
const expect = require('chai').expect
describe('加法函數(shù)測試', function() {
it('1 + 1 等于 2', function() {
expect(add(1, 1)).to.be.equal(2)
})
it('返回值是Number', function() {
expect(add(1, 1)).to.be.a('number')
})
})
上面代碼塊就是測試腳本也拜,可獨立運行撒桨,測試腳本中應(yīng)該包括一個或多個describe
塊胚股,每個describe
塊應(yīng)包括多個it
塊霜浴。
describe
是測試套件,這個方法需要傳兩個參數(shù)棘脐,第一個為測試套件的名稱('加法函數(shù)測試')
恋沃,第二個是執(zhí)行函數(shù)裆熙。
it
塊是測試用例橄镜,表示一個單獨的測試偎快,是測試的最小單位,第一個參數(shù)是測試用例的名稱('1 + 1 等于 2')洽胶,第二個是執(zhí)行函數(shù)晒夹。
然后在terminal下執(zhí)行mocha add.test.js
$ mocha add.test.js
加法函數(shù)測試
√ 1 + 1 等于 2
√ 返回值是Number
2 passing (12ms)
如果我們改變一下add.js
// add.js
function add(a, b) {
return a * b
}
module.exports = add
然后再執(zhí)行一下mocha add.test.js
$ mocha add.test.js
加法函數(shù)測試
√ 1 + 1 等于 2
1) 返回值是Number
1 passing (8ms)
1 failing
1) 加法函數(shù)測試 返回值是Number:
AssertionError: expected 2 to equal 3
+ expected - actual
-2
+3
at Context.it(add.test.js:6:27)
這里也可以很明顯看出哪個測試用例報錯、還有報錯的位置姊氓,這樣在開發(fā)的時候開發(fā)人員就能很容易定位錯誤丐怯。
小結(jié)
從上面一個簡單的例子可以看出,利用mocha實現(xiàn)自動化測試是很簡單的翔横。雖然前期開發(fā)需要花一點時間去寫單元測試读跷,但是后面提供的便利性足以將其彌補。