blog.bouzuya.net

2016-03-11 b-o-a を mocha から AVA にのりかえた

bouzuya/b-o-a 関連 project の test を mocha から AVA に変更した。試して気づいた長所・短所などを書く。

AVA は testing framework 。repository は sindresorhus/ava 。競合は mochajs/mochasubstack/tape など。

きっかけは mocha の this で context を共有する機能が .bind(this) を強制する arrow function (() => ...) と合っていないと感じたことだ。それを tweet したところ次のような返信があった。

「AVA ? 」→「試してみよう」という流れ。

AVA の利点は Why AVA? によると……

  • Minimal and fast
  • Simple test syntax
  • Runs tests concurrently
  • Enforces writing atomic tests
  • No implicit globals
  • Isolated environment for each test file
  • Write your tests in ES2015
  • Promise support
  • Generator function support
  • Async function support
  • Observable support
  • Enhanced assertion messages
  • Optional TAP output
  • Clean stack traces

構文は tape に似ている。mocha のような global の describe / it etc. はなく test(() => ...)test.before(() => ...) とする。これが Simple test syntax で No implicit globals ということだろう。

file ごとに process が分離され、並列で実行される。これが Minimal and fast の fast だろう。Runs tests concurrently ・ Isolated environment for each test file もこれだろう。

ES2015 および power-assert (!?) からの変換に標準で対応している。これが決め手で試すことにしたと言っていい。power-assert は環境構築の補助が厚いけれど、それでも面倒なことに変わりはない。TypeScript が入ると型定義も増えてより面倒だ。それを一括で助けてくれるなら、うれしい。

ES2015 に関連して Promise / async / await / generator function / ES7 Observable に対応している。もちろん this で context を共有するようなことはしない。test(t => t.ok(...)) という arrow function が基本形だ。

出力は上記の power-assert による詳細な出力のほか、TAP に対応しているので既存の TAP 向け reporter を使える。既定では、並列実行の兼ね合いもあって出力順が怪しいからなのか、失敗以外の出力を折りたたむようになっている。

では実際に AVA を試してどうか。

ここまで AVA の利点 (自称) を紹介した。実際に試した感想を書く。

power-assert の対応は良い。すごく楽に導入できる。独自の assert を持っているのは気になるが、嫌なら使わなくても良い。大体が t.okt.same で事足りるのでそこまで気にならない。

describe / context の入れ子がない。0.13.0 時点でこういった環境の入れ子はない。これは一長一短だが意外と良い感じだ。beforeEach で場合分けできなくて、もどかしいときもある。一方で複雑な事前準備を含むより file を分けてもうひとつ書くくらいのほうが簡潔だとも思う。ここはもうすこし検討が必要そうだ。

timeout がない。mocha は default 2s の timeout を設けている。AVA はそれがないので延々と待つ。test code に誤りがあった場合 ^C をよく使う。個人的には上限を指定できて良いと思う。Circle CI が延々と結果を返さないのはつらい。

たまに暴走する。上記 timeout やその強制終了、 bouzuya/b-o-a の構造の関連だと思うが、ぼくの環境ではたまに暴走する。CPU を 100% で回し続ける。process の制御が確実ではないのかもしれない。

0.13.0 では .d.ts に問題がある。これはまた Pull Request を送るつもりだ。noImplicitAny を有効にすると .d.ts のせいで compile できない。

@t_wada 曰く browser で使えない。「まあ、そうでしょう」という感じ。power-assert やら babel で transpile している時点で厳しそう。

いろいろ問題はあるものの、おしゃれ感覚でしばらく使ってみようと思う。