1. 程式人生 > >測試用例:mocha,should,istanbul

測試用例:mocha,should,istanbul

目標:
建立一個 lesson6 專案,在其中編寫程式碼。main.js: 其中有個 fibonacci 函式。
此函式的定義為    int fibonacci(int n)
- 當 n === 0 時,返回 0;n === 1時,返回 1;
- n > 1 時,返回 fibonacci(n) === fibonacci(n-1) + fibonacci(n-2),如 fibonacci(10) === 55;
- n 不可大於10,否則拋錯,因為 Node.js 的計算效能沒那麼強。
- n 也不可小於 0,否則拋錯,因為沒意義。
- n 不為數字時,拋錯。

test/main.test.js: 對 main 函式進行測試,並使行覆蓋率和分支覆蓋率都達到 100%。

首先執行 npm init 建立 package.json
其次,建立main.js檔案,編寫 fibonacci 函式。


    var fibonacci = function (n) {
      if (n === 0) {
        return 0;
      }
      if (n === 1) {
        return 1;
      }
      return fibonacci(n-1) + fibonacci(n-2);
    };

    if (require.main === module) {
      // 如果是直接執行 main.js,則進入此處
// 如果 main.js 被其他檔案 require,則此處不會執行。 var n = Number(process.argv[2]); console.log('fibonacci(' + n + ') is', fibonacci(n)); }
執行 `$ node main.js 10` ![](http://i.imgur.com/zTevhDq.png) 接下來開始測試驅動開發,現在簡單的實現已經完成,那我們就對它進行一下簡單測試吧。 我們首先得把 main.js 裡面的 fibonacci 暴露出來。加一句 `exports.fibonacci = fibonacci`
然後在 test/main.test.js 中引用我們的 main.js,並開始一個簡單的測試。

    // file: test/main.test.js
    var main = require('../main');
    var should = require('should');

    describe('test/main.test.js', function () {
      it('should equal 55 when n === 10', function () {
    main.fibonacci(10).should.equal(55);
      });
    });
安裝全域性的 mocha: `$ npm install mocha -g`
`-g` 與 非`-g` 的區別,就是安裝位置的區別,g 是 global 的意思。如果不加的話,則安裝 mocha 在你的專案目錄下面;如果加了,則這個 mocha 是安裝在全域性的,如果 mocha 有可執行命令的話,那麼這個命令也會自動加入到你係統 $PATH 中的某個地方。 然後執行 `$ mocha` ![](http://i.imgur.com/5wLaqy1.png) 其中 `describe` 中的字串,用來描述你要測的主體是什麼;`it` 當中,描述具體的 case 內容。 引入的should模組,是一個斷言庫,而 mocha是測試框架。
比如測試一個數是不是大於3,則是 `(5).should.above(3)`;測試一個字串是否有著特定字首:`’foobar’.should.startWith(‘foo’)`; 這個時候再看一遍fibonacci 函式的幾個要求:
* 當 n === 0 時,返回 0;n === 1時,返回 1;
* n > 1 時,返回 `fibonacci(n) === fibonacci(n-1) + fibonacci(n-2)`,如 `fibonacci(10) === 55`;
* n 不可大於10,否則拋錯,因為 Node.js 的計算效能沒那麼強。
* n 也不可小於 0,否則拋錯,因為沒意義。
* n 不為數字時,拋錯。

根據上述要求,更新 main.test.js 如下:


    var main = require('../main');
    var should = require('should');

    describe('test/main.test.js', function () {
      it('should equal 0 when n === 0', function () {
    main.fibonacci(0).should.equal(0);
      });

      it('should equal 1 when n === 1', function () {
    main.fibonacci(1).should.equal(1);
      });

      it('should equal 55 when n === 10', function () {
    main.fibonacci(10).should.equal(55);
      });

      it('should throw when n > 10', function () {
    (function () {
      main.fibonacci(11);
    }).should.throw('n should <= 10');
      });

      it('should throw when n < 0', function () {
    (function () {
      main.fibonacci(-1);
    }).should.throw('n should >= 0');
      });

      it('should throw when n isnt Number', function () {
    (function () {
      main.fibonacci('呵呵');
    }).should.throw('n should be a Number');
      });
    });

這個時候再跑一下 $ mocha ,發現有三個 case 沒過

這個時候再更新 main.js 中的 fibonacci 函式,如下所示:


    var fibonacci = function (n) {
      if (typeof n !== 'number') {
    throw new Error('n should be a Number');
      }
      if (n < 0) {
    throw new Error('n should >= 0')
      }
      if (n > 10) {
    throw new Error('n should <= 10');
      }
      if (n === 0) {
    return 0;
      }
      if (n === 1) {
    return 1;
      }

      return fibonacci(n-1) + fibonacci(n-2);
    };

再執行一次 $ mocha ,則全部通過,這就是一種測試驅動開發。