Nodejs 的測試方法

發表于:2016-07-07來源:推酷作者: Hello Qeesung點擊數: 標簽:Nodejs
寫 Nodejs 也有幾個月了,但是一直都沒有關注過 Nodejs 的自動化測試。之前在學習 Java Swing 的時候,也研究過幾個不同的 GUI 自動化測試框架,比如: Abbot ,可以實現自動化點擊界

本文是對眾多博客的學習和總結,可能存在理解錯誤。請帶著懷疑的眼光,同時如果有錯誤希望能指出。

Nodejs 測試(1)

寫 Nodejs 也有幾個月了,但是一直都沒有關注過 Nodejs 的自動化測試。之前在學習 Java Swing 的時候,也研究過幾個不同的 GUI 自動化測試框架,比如:

  • Abbot ,可以實現自動化點擊界面上的按鈕等操作,主要是通過代碼來實現;
  • AutoIT ,可以將對一個軟件的操作錄制下來,然后存為腳本,一次錄制,多次運行。

這兩天在看某些開源項目的時候,比如 Angular-dashboard-framework 和Angular-meterial-dashboard ,發現都使用了一些自動化測試的框架來進行軟件的測試,比如: Mocha , Jasmine 等等。

Nodejs 中的自動化測試框架很多,我們不能一一涉獵,我們會選取比較常見的幾個來使用。

在開始我們的主題之前,我們會介紹測試中的幾個簡單的概念,然后再看一個簡單的例子

TDD 與 BDD

TDD , 測試驅動開發 (Test-Driven Development) , BDD , 行為驅動開發(Behavior-Driven Development) .

所謂的 測試驅動開發 ,就是在開發之前,先編寫一些測試,然后跑一遍測試(此時的結果肯定是全都不通過的),然后開發進行開發,再跑一遍測試,如果測試都通過了,那么表示測試通過。

那么 行為驅動開發 ,就是采用自然語言來描述測試的行為過程。 BDD 可以消除TDD 測試過程中不能發現的問題。

TDD 和 BDD 是一個復雜的話題,大家可以參考下面的文章:

斷言(Assert)

斷言在 Nodejs 軟件測試過程中很是重要。 Nodejs 就默認提供了內置的斷言庫assert ,后面我們將要介紹的斷言庫都是基于 Nodejs 內置的斷言庫,比如大名鼎鼎的 shouold.js , chai , expect.js 等等。

斷言庫提供了很多語義化的方法來對值進行各種判斷。相對于內置的斷言庫而言,should.js 等斷言庫提供了更為自然,更為豐富的判斷方法。

測試框架(Test Framework)

目前博主接觸的自動化測試框架主要是 Mocha 和 Jasmine 這兩個。測試框架并不負責斷言的判斷,斷言編寫,它們只是才有一種更為合理整潔的方式來管理我們的斷言。這就為我們使用自動化測試框架帶來了很大的靈活性,比如在使用 Mocha 自動化測試框架的時候,博主決定采用 nodejs 內置的 assert 斷言庫來編寫斷言。不久之后,博主新學習了 should.js ,于是決定將之前用 assert 斷言庫寫的測試全部用should.js 替換,這也是可以的。因為 should.js , chai 等斷言庫都是基于nodejs 內置的 assert 斷言庫的。

例子

首先創建一個工程

# create a new nodejs project
$ cd ~/desktop && mkdir nodejs-test
$ cd $_ && npm init

# enter some infomation here

# install some dependecies
$ npm install -g mocha
$ npm install --save-dev should

這時我們目錄下就有一個 package.json 文件,然后新建一個 lib 目錄,并在lib 目錄中創建一個 math.js 文件,作為我們自己實現的模塊。

# create lib and math module
$ mkdir lib && cd lib
$ emacs math.js

math.js 模塊內容如下,并最后導入 add 函數, add 函數就是我們最后要測試的函數

/**
 *  add numbers
 */
function add(number1 , number2){  
    if(arguments && arguments.length  === 0)
        return null;
    var numbers = Array.from(arguments);
    var result = 0;
    numbers.forEach(function(number) {
        result += number;
    });
    return result;
};


module.exports = {  
    add:add
};

回到與 package.json 同級的根目錄,新建一個 test 目錄,然后新建 add-test.js 文件

$ cd .. && mkdir test && cd test
$ emacs add-test.js

add-test.js 文件的內容如下,主要是測試 add 函數,下面的測試內容分別是:

  • 不傳入參數
  • 傳入一個參數
  • 傳入兩個參數
  • 傳入多個參數
var should = require("should");  
var add = require("../lib/math.js").add;  
var assert = require("assert");

describe("add test", function () {  
    describe("with no input args",function () {
        it("result should equal to null",function () {
            (add() === null).should.be.true;
        });
    });

    describe("add one number",function  () {
        it("result should equal to the number",function () {
            add(1).should.equal(1);
        });

    });

    describe("add two number",function name() {
        it("result should equal to the number1+ number2",function () {
            add(1,2).should.equal(3);
        });
    });


    describe("add numbers",function name() {
        it("result should equal to number1+ number2 + ...",function () {
            add(1,2,3,4).should.equal(10);
        });
    });
});

回到工程跟目錄,執行一下, mocha ,我們就可以看到下面的結果:

~/Desktop/nodejs-test $ mocha


  add test
    with no input args
      √ result should equal to null
    add one number
      √ result should equal to the number
    add two number
      √ result should equal to the number1+ number2
    add numbers
      √ result should equal to number1+ number2 + ...


  4 passing (8ms)

我們將 add 函數中的 + 操作符換成 - ,然后再運行一遍測試,除了第一個測試,剩下的測試都拋出異常了

 add test
    with no input args
      √ result should equal to null
    add one number
      1) result should equal to the number
    add two number
      2) result should equal to the number1+ number2
    add numbers
      3) result should equal to number1+ number2 + ...


  1 passing (10ms)
  3 failing

  1) add test add one number result should equal to the number:

      AssertionError: expected -1 to be 1
      + expected - actual

      --1
      +1

      at Assertion.fail (C:\Users\qeesung\Desktop\nodejs-test\node_modules\should\cjs\should.js:326:17)
      at Assertion.Object.defineProperty.value (C:\Users\qeesung\Desktop\nodejs-test\node_modules\should\cjs\should.js:398:19)
      at Context.<anonymous> (C:\Users\qeesung\Desktop\nodejs-test\test\add-test.js:14:27)
      ... more error here
 

原文轉自:http://www.tuicool.com/articles/QVvY7jm

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97