探知JS測試
來自: https://segmentfault.com/a/1190000004428902
有一定水平的js童鞋,應該會經常看到一些書上,在介紹項目的時候,會不由自主說道測試。 比如,單元測試,函數測試,或是TDD,BDD等測試模式。沒錯,這也是我們需要進行掌握的。 當然,如果你的項目僅僅是寫的幾個demo,而去寫測試的話,這樣會有點浪費時間,但是本人非常鼓勵這樣做,因為你在測試時,會發現自己的代碼覆蓋率,在經自己重構的時候一點一點的變好。 這感覺是非常不一樣的。而且在大項目中,使用測試,無疑是產品和你撕逼是,你用來堵住他嘴的最佳手段。
單元測試
這是測試類型的一種,所謂的單元即,由一些函數組成能完成某項功能的模塊。單元測試的目的就是保證你寫的模塊能夠完成一定任務并且不出現bug. 另外,單元測試,也是單一職責原則的一個具體體現,如果在你的代碼測試過程中,需要require多個模塊時,這說明你測試的主體模塊的耦合性比較高,這也是提醒你進行重構的flag。
單元測試的過程
-
想好測試用例
-
動手寫測試
-
查看測試結果,通過則Pass,否則應該進行repeat
測試模式
想說一下,測試模式和單元測試的區別。
測試模式->(包括)單元測試.
通常測試模式有BDD和TDD模式。
TDD
TDD全稱為Test-driven development即,測試驅動開發. 這個可以算是自主測試,用來幫助你寫出好代碼的一個非常好的辦法。 也是上文說到的,當自己看到自己的代碼覆蓋率越來越高的時候,心里應該是滿滿的自豪感。通常的測試步驟應該是:
-
先寫測試
-
再寫代碼
-
測試
-
重構
-
通過而在大部分公司里面,通常使用的是BDD測試。這里先對BDD進行講解,后面會將TDD進行探索。
BDD
同樣BDD的全稱為: Behavior-Driven development。 樸素的說法叫做行為驅動開發。 BDD的應用場景就是給一些QA工程師使用的,他用他的語言和你進行交流,即他會進行一些測試用例,然后如果通過則說明,他已經信賴你了。通常BDD測試提供了幾個方法:
-
describe() {alias: behavior()}
-
it()
-
before()
-
after()
-
beforeEach()
-
afterEach()通過上面幾個方法,說一下BDD測試應該了解哪些基本概念.
測試套件
在TDD里面是指的是test suit. 在BDD里面就對應describe(),用來對軟件某個方面的描述。
不懂吧~
針對于describe我們具體來說一下吧。 describe接受兩個參數, 一個是字符串,另外一個是函數。
describe('Action',function(){ //... })
那第一個字符串是開發者自己寫,那么該怎么寫呢?
很簡單,我們需要明白,我們是要給一個測試套件命名。 即,給一篇文章寫一個title一樣簡單。
比如,我的一個測試套件是想測試一個計數框架的一些功能。
那我們的describe就可以寫為Counter(或者"計數",一些你自己覺得合適的title),像這樣:
</div>
describe('Counter',function(){ it('it should increase',function(){ //... }) it('it should decrease',function(){ //... }) })
那么,我們起好標題之后,該干什么呢?
首先,該空兩格~
接著,就應該開始使用測試用例來寫文章的body了。
測試用例
it就是測試用例的weapon, 它和describe相似,接受兩個參數。 第一個是對測試的描述,第二個就是具體實現。
</div>
describe('Counter',function(){ it('it should increase',function(){ //... }) })
同樣,it里面的內容該怎么寫呢?
我想這不是我的任務,你可以去問下你的語文老師(或者英語老師).
其實,你是用describe和it就已經可以寫出一篇好文章了。唯一欠缺的就是需要在里面填上一些內容。這時候就需要使用到斷言庫來幫你造句了。
市面上流行的斷言庫有3個,分別是assert,expect,should. 如果學過nodeJS的童鞋應該知道NodeJS自帶assert斷言庫。但是對于本人而言,覺得expect比起assert那種傻逼的寫法,看起來還是蠻舒服了。(當然,should也有人使用,關鍵看你的 性 趣了).
先show show 這3個的風格吧。
比如判斷相等的寫法:
</div>
//assert assert.equal(cal.result,1); //expect expect(cal.result).to.equal(1); //should cal.result.shoulde.equal(1)
接下來就看自己的喜好挑一種吧。
ok~
還記得BDD提供幾個API嗎? 沒錯,還有before,after,beforeEach,afterEach他們分別是干什么用的呢?
我這里就應用,官方mocha的demo.
</div>
describe('hooks', function() {before(function() { // runs before all tests in this block });
after(function() { // runs after all tests in this block });
beforeEach(function() { // runs before each test in this block });
afterEach(function() { // runs after each test in this block });
// test cases });</pre>
按照 摸cha 的說法,上面說的這些函數都是hook. 將測試的狀態點暴露給你,讓你可以進行相關的操作。 同樣,官方 摸cha 也舉例說明了他們的用途。 比如在數據庫打開的時候,就可以使用beforeEach來進行更新。
beforeEach(function(done) { db.clear(function(err) { if (err) return done(err); db.save([tobi, loki, jane], done); }); });要記住,beforeEach會在當前的Block下的所有case之前執行,不管你嵌套多少層。上面的理論鋪墊完了,我們要正式進入,測試的節奏.
mocha框架
首先,我們運行的一切測試,都需要有一個環境支持,那么mocha就是你的環境。 它應該算是前端測試super 流行的一個框架吧(當然,還有jasmine,zuul等). 因為內容豐富,顯示界面友好,所以,用戶也是很多的。下載mocha環境:
sude npm install -g mocha這里執行全局下載。因為,測試環境在全局都是有效的,所以這里就直接放在global下了.
配置assertion
這里我們就使用chai就over了,他包括了3種語言風格,你自己引用就可以了。
</div>
sudo npm install -g chaiOK。接下來,先寫一個hello world 示例吧。我們按上述步驟一步一步來.
//自己測試的代碼 var Cal = (function(){ var num = { base:0 }; var add = function(){ num.base++; return num.base; } var desc = function(){ --num.base; return num.base; } return { add,desc,num } })(); //ok,現在引用斷言庫chai var expect = require('chai').expect; //寫出測試 describe('Counter',function(){ it('it should increase',function(){ expect(Cal.num.base).to.below(Cal.add()); }) it('it should decrease',function(){ expect(Cal.num.base).to.above(Cal.desc()); }) })ok,現在可以打開控制臺,切換到你測試文件所在的目錄,比如,我的是在 demo/demo.js在控制臺輸入命令
mocha demo.js如果你的屏幕出現如下:(僅限MAC用戶)
![]()
說明你的virgin測試已經完成了。
今天就到這吧,整體的介紹了BDD的測試,斷言庫,測試框架,后續會深入介紹斷言庫和測試框架。
ending~
</div> </div>
本文由用戶 RubLau 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!