blog.bouzuya.net

2017-07-15 bouzuya/beater 5.0.0 をつくった

bouzuya/beater 5.0.0 をつくった。あわせて beater 関連の npm パッケージを更新した。

5.0.0 はいくつかの破壊的な変更を含んでいる。

  • beater-cli を不要にした
  • fixture() を削除した
  • run() runWithOptions() test() を追加・変更した
  • 結果の表示を変更した (beater-cli-reporter -> beater-tap-reporter)
  • ブラウザのサポートを削除した (考慮していないが、おそらく以前よりうまく動く)

簡単に言うと「より簡単にした」。例を示す。

// index.ts
import * as assert from 'power-assert';
import { run, test } from 'beater';

run([
  test('simple test', () => {
    assert(1 + 1 === 2);
  }),
  test('async test', () => {
    return new Promise((resolve) => {
      assert(1 + 1 !== 200);
      assert((1 + 1) * 10 !== 200);
      resolve();
    });
  })
]).catch(() => process.exit(1));

test()Test を返す。以前は test() を呼んだ瞬間にキューへ入れられ実行されていたが、今回は動かない。あくまでもテストを表すオブジェクトを返すだけだ。以前と同様だが、非同期処理には Promise を使う。テストを失敗と見なす条件は、何かが throw される、または返された Promise が reject の場合だ。assert() は↑のように power-assert を使ってもいいし、標準の assert でも、ほかのものでもいい。おそらく Error を投げるようになっているはずなので使えるだろう。

run()Test を実行する。以前は beater-cli 経由でファイル単位に require() して実行していたが、今回は違う。単純な関数の呼び出しだ。これによる大きな変更点は、あるテストが環境を破壊した場合に他のテストも影響を受けるということだ。「そんなことをする奴が悪い」で切り捨てることにした。

あとは Node.js に食わせればいい。既定では TAP の形式で出力される。

$ $(npm bin)/tsc --module commonjs --target es2017 index.ts
$ node index.js
TAP version 13
1..2
ok 1 - simple test
ok 2 - async test

出力の形式が気に入らないなら TAP から変換する reporter をかませるか、独自の reporter を runWithOptions() に渡せばいい。

$ yarn add tap-nyan
$ node index.js | $(npm bin)/tap-nyan
 2   -__,------,
 0   -__|  /\_/\
 0   -_~|_( ^ .^)
     -_ ""  ""
  Pass!

test() run() runWithOptions() の 3 つの関数しか export していないので、説明は以上だ。「これでテストフレームワーク?」という感じではあるが、たったのこれだけだ。実装も大したことはない。ぜひ bouzuya/beater を読んで「これを使うくらいなら自分でつくる」そう思ってほしい。

今後の展開としては、独自の reporter の例として AVA のような beater-mini-reporter をつくってみたい。ほかには fixture() やグループ化・ ObservableIterableIterator<T> に対応するための helper をつくってみても良さそう。使いながら足りない部分を補うつもりだ。


2017-07-08 に beta 公開した bouzuya/bbna 1.4.0 を正式公開した。 https://play.google.com/store/apps/details?id=net.bouzuya.blog