Posted at

Node.jsでmochaを使ってBDDスタイルのユニットテスト

More than 3 years have passed since last update.


mocha

mocha(モカ)と読む。Javascriptの単体テストフレームワーク。


mochaの特徴


  • node.jsやブラウザから実行可能できる。

  • 非同期のテストもできる。

  • TDDやBDDスタイルでテストを記述できる。

  • テスト結果も多くの形式で出力できる。

  • mocha自体はアサーション機能を持たない。

    → 値の検証には標準のassertやchai、shouldを使用する。


mochaをインストール

mochaをグローバルインストールする。

$ npm install -g mocha


chai

chaiはBDD / TDDスタイルで記述できるアサーションライブラリ。

BDDスタイルは、expect / shouldが用意されており、TDDスタイルはassertで表現する。


shouldとexpectの違い

sholudはObject自身を拡張して、sholudメソッドを追加して実装されている。

英語の文法に近い記述ができる。

メモ:どうもIEとはは相性がよろしくないみたい。


shouldの例

// 「fooがbarと等しくなければいけない」ことをテスト。

foo.should.equal('bar');

expectは関数で、引数に評価する値を渡す。


expectの例

expect(foo).to.equal('bar'); 



chaiをインストール

$ npm install chai

chai自体はTDDとBDDに対応していが、まずは、BDDスタイルのshouldでテストを作ってみた。


実装とテスト


プロジェクトの作成

sample-mocha

├── src
│ └── calculation.coffee
└── test
└── calculation-bdd-should.coffee


テスト対象の作成


calculation.coffee

class Calculator

constructor: () ->
console.log 'Calcクラスのインスタンスを生成する。'

add: (a, b) ->
ans = a + b
return ans

multiply: (a, b) ->
ans = a* b
return ans

module.exports = Calculator



テストコードを書いてみる

mochaではBDD向けのスタイルとして以下が提供されている。

関数
概要

describe
ネスト管理可能な階層。テスト対象を宣言する。

before
describeの前に実行される。前提条件を記述する。

after
describeの後に実行される。後処理を記述する。

beforeEach
各describeの前に実行される。前提条件を記述する。

afterEach
各describeの後に実行される。後処理を記述する。

it
検証内容を記述する。


calculation-bdd-should.coffee

should = require('chai').should();

Calculator = require '../src/calculator'

# テスト対象を宣言
describe 'Calculator', () ->

calc = null

# 各describeの前
before () ->
console.log 'before method'
calc = new Calculator()

# 各describeの後
after () ->
console.log 'after method'
calc = null

# 各itの前
beforeEach () ->
console.log 'beforeEach method'

afterEach () ->
console.log 'afterEach method'

# 実行するテストコード
it '1 + 2 = 3', () ->
calc.add(1, 2).should.equal(3)
it '1 * 2 = 2', () ->
calc.multiply(1, 2).should.equal(2)



テストの実行

$ mocha --compilers coffee:coffee-script/register test/

Calculator
before method
Calcクラスのインスタンスを生成する。
beforeEach method
✓ 1 + 2 = 3
afterEach method
beforeEach method
✓ 1 * 2 = 2
afterEach method
after method

2 passing (7ms)