Edited at

power-assert 使ってますか?


power-assert とは?

和田卓人さんが開発した javascript のアサーションのライブラリ1です。

普通のアサーションと比べて、簡単な書き方でより多くの情報を提示してくれます

しかも、既存のテストコードに node.js 標準の assert を使っている場合は、 require の部分を差し替えるだけで移行することができます。

以下、Node.js標準のアサーションライブラリと表示を比較してみます。


power-assert のないとき 😔


サンプルコード


src/hello.js

module.exports = (person) => {

return `Hello, ${person}!`;
}


test/helloTest.js

const assert = require('assert');

const hello = require('../src/hello.js');

describe('hello test suit', () => {
it('greet Taro', () => {
assert(hello === 'Hello, Taro!');
});
});



実行結果

AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:

評価が false だった、ということしかわかりません。


power-assert があるとき 🤣


サンプルコード


src/hello.js

// 同じ



test/helloTest.js

const assert = require('power-assert');

// あとは同じ


実行結果

  assert(hello === 'Hello, Taro!')

| |
| false
#function#

assert が評価されたときの前後の式の評価値まで知ることができます。


何が嬉しいか?

簡単な書き方で豊富な情報を得られること

ほかのテストライブラリで同じ情報を得ようとすると、assertEqual(), hasAnyKeys(), ...など、検査項目をいちいち指定してやる必要がありました。「オブジェクトを比較する場合は assertDeepEqual() 」といったように、検査項目に対応する書き方を覚える(もしくはマニュアルを調べる)必要がありました。

一方、 power-assert は assert() 1つで十分な情報を得ることができます。

例えば、検査対象の文字列が特定の正規表現にマッチするかを調べたい場合、以下のように書けます。


test/helloTest.js

  it('greet Taro', () => {

assert(hello('John Smith').match(/^Hello, John-Smith/));
});


実行結果

  assert(hello('John Smith').match(/^Hello, John-Smith/))

| |
| null
"Hello, John Smith!"

使っているメソッドは assert() だけですが、テストに失敗した原因を知るための十分な情報を得ることができます。


なんでこんなことができるのか?

テストコードの構文解析をしているためです。

アーキテクチャの詳細な説明は参考資料にあげているスライド2を見てください。


終わりに

Javascript の便利で強力なアサーションライブラリーである power-assert について紹介しました。


参考