探知JS測試

RubLau 8年前發布 | 8K 次閱讀 測試技術 JavaScript開發 JavaScript

來自: https://segmentfault.com/a/1190000004428902

有一定水平的js童鞋,應該會經常看到一些書上,在介紹項目的時候,會不由自主說道測試。 比如,單元測試,函數測試,或是TDD,BDD等測試模式。沒錯,這也是我們需要進行掌握的。 當然,如果你的項目僅僅是寫的幾個demo,而去寫測試的話,這樣會有點浪費時間,但是本人非常鼓勵這樣做,因為你在測試時,會發現自己的代碼覆蓋率,在經自己重構的時候一點一點的變好。 這感覺是非常不一樣的。而且在大項目中,使用測試,無疑是產品和你撕逼是,你用來堵住他嘴的最佳手段。

單元測試

這是測試類型的一種,所謂的單元即,由一些函數組成能完成某項功能的模塊。單元測試的目的就是保證你寫的模塊能夠完成一定任務并且不出現bug. 另外,單元測試,也是單一職責原則的一個具體體現,如果在你的代碼測試過程中,需要require多個模塊時,這說明你測試的主體模塊的耦合性比較高,這也是提醒你進行重構的flag。

單元測試的過程

  1. 想好測試用例

  2. 動手寫測試

  3. 查看測試結果,通過則Pass,否則應該進行repeat

測試模式

想說一下,測試模式和單元測試的區別。

測試模式->(包括)單元測試.

通常測試模式有BDD和TDD模式。

TDD

TDD全稱為Test-driven development即,測試驅動開發. 這個可以算是自主測試,用來幫助你寫出好代碼的一個非常好的辦法。 也是上文說到的,當自己看到自己的代碼覆蓋率越來越高的時候,心里應該是滿滿的自豪感。通常的測試步驟應該是:

  1. 先寫測試

  2. 再寫代碼

  3. 測試

  4. 重構

  5. 通過而在大部分公司里面,通常使用的是BDD測試。這里先對BDD進行講解,后面會將TDD進行探索。

BDD

同樣BDD的全稱為: Behavior-Driven development。 樸素的說法叫做行為驅動開發。 BDD的應用場景就是給一些QA工程師使用的,他用他的語言和你進行交流,即他會進行一些測試用例,然后如果通過則說明,他已經信賴你了。通常BDD測試提供了幾個方法:

  1. describe() {alias: behavior()}

  2. it()

  3. before()

  4. after()

  5. beforeEach()

  6. 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 chai

OK。接下來,先寫一個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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!