似たようなモジュール名で存在している2つのアサーションライブラリ expect と expect.js を試してみる。

expect は「7,568 downloads in the last month」で、 expect.js は「100,149 downloads in the last month」 なので、 expect.js のほうが人気が高い。

expect は、 Node.js に標準搭載されている assert モジュールの薄いラッパーになっているとのこと。

expect is a thin wrapper around node's assert module that lets you write better assertions.

mjackson/expect · GitHub

expect.js は should.js をベースにしたBDDスタイルのアサーションライブラリ。

Minimalistic BDD assertion toolkit based on should.js

Automattic/expect.js · GitHub

BDDとはなんぞや?

ビヘイビア駆動開発 (振舞駆動開発; behavior driven development; BDD)とは、プログラム開発手法の一種で、テスト駆動開発から派生した物である。

ビヘイビア駆動開発 - Wikipedia
 BDDはTDDの一流派ともいえますが、TDDに対し以下の実現のための原則や工夫が加えられています。

・テストを「振る舞い」(機能的な外部仕様)の記述に特化させる
・ユーザーの要求やアーキテクチャの設計仕様といった、より上位のインプットとTDDのテストにつながりを持たせる

 一例として、前述のアウトサイドインTDDもBDDの一種に該当します。なおBDDはTDDから生まれた手法ではあるものの、TDDで欠落しがちになったアジャイルのテストファーストの目的・原則に立ち返るという、原点回帰の方向性も備えています。

 ちなみに今日のBDDは、いろいろな意味や定義で使われる用語になってしまっています。分類としては、テストレベルやテストベースのレベルを基準に、コードレベルとユーザーレベルの2つに分類されることがあります。

いまさら聞けないTDD/BDD超入門(1):テスト駆動開発/振る舞い駆動開発を始めるための基礎知識 (3/3) - @IT

なんとなくわかったようなわからないような。。。

npm コマンドで expect と expect.js モジュールをインストールする。


$ npm install expect
expect@1.6.0 node_modules/expect

$ npm install expect.js
expect.js@0.3.1 node_modules/expect.js

expect と expect.js を使うサンプルコード。


$ cat expect2.js

var expect = require('expect');
var expejs = require('expect.js');

var a = 'hello';
var b = 'hello';
var c = 'goodbye';

// 成功するテスト
try{ expect(a).toBe(b);  } catch(e){console.log(e.message);}
try{ expejs(a).to.be(b); } catch(e){console.log(e.message);}

// 失敗するテスト
try{ expect(a).toBe(c);  } catch(e){console.log(e.message);}
try{ expejs(a).to.be(c); } catch(e){console.log(e.message);}

// 成功するテスト
try{ expect(a).toBeA('string');   } catch(e){console.log(e.message);}
try{ expejs(a).to.be.a('string'); } catch(e){console.log(e.message);}

サンプルを実行した結果。テストに失敗したところで例外が発生している。


$ node expect2.js
"hello" === "goodbye"
expected 'hello' to equal 'goodbye'

さいきんよく使われているらしいアサーションライブラリで Chai.js というのがあるけど、 Chai.js は expect.js と似たようなインターフェースを持っている。多少なりとも互換性があるのはありがたい。

tags: node.js javascript

Posted by NI-Lab. (@nilab)