似たようなモジュール名で存在している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)