HaxeのUnitTestライブラリ(2018年版)

2018年におけるHaxeのUnitTestライブラリについて書く。この記事を書いている時点ではutestを使っている。

この記事で挙げているものはすべて試したが、多少機能は少ないが枯れていて面倒が少ないのはutest、高機能なものがよければbuddyという感じかなという印象。tink_unittestは使いやすいAPIなんだけど、枯れてないので将来に期待という印象。

utest

Assertion Style(JUnit風)。API設計も素直なので、学習コストが低い。ユーザー数も多く、十分に枯れている。

ただ、テスト内容を日本語で書けない点が欠点と言えば欠点。Haxeは識別子に日本語を使えないので、クラス名・メソッド名ベースでテストレポートを出力するutestでは日本語出力はできない。

buddy

BDD Style。シンタックスが若干変態的だが、テスト内容を日本語で書ける。非同期テストでtimeoutが設定出来たり、コンパイルエラーが発生することがテストできたり、高機能。

Browserテストサポートが若干弱く、レポートがconsole.log()に出力される。

2018-10-26 追記
1000件ぐらいある非同期テストを書いて、Nekoターゲットでテストを実行したら、GC fatal error: Too many threads で落ちる現象を確認した。Thread Poolを使ってもダメ。問題の切り分けのために、Thread数千個立てるだけの単純なプログラムを動かてしてみても落ちることはないし、他のUnit Testライブラリ(tink_unittest)で同様のテストを書いても落ちることはなし、Buddy固有の問題のようだ。しんどい。

JavaScriptターゲットであれば動くのだが、マルチターゲットを想定した場合は使わない方がよさそう。ある程度調べてみたが、原因はよく分からなかった。Buddyが内部で使っているpromhxの方(もしくはpromhxの使い方)に何か問題がありそうな感じはしている。

2018-10-31追記
Issueを投げてやり取りしてるうちに原因が分かったので、非同期テストがこける問題は修正された。これで無事におすすめできるようになった。 Fix a bug that crash neko when it runs many async test cases. by terurou · Pull Request #75 · ciscoheat/buddy · GitHub

tink_unittest

Assertion Style。Haxeをがっつりやってると必ず目にするTinkerbell系のライブラリ。@:describeでテスト内容を日本語を設定したり、assertionがマクロになっていたり、非同期テストでtimeoutが設定できたり、こちらも高機能。

ただ、どうもv0.5.5の時点では、JS出力でBrowserテストに対応してないっぽい(Browserify通せば行けそうだが)。

MassiveUnit(munit)

数年前はこれがデファクトスタンダードという状況だった。おそらく今でも一番ユーザー数が多いと思われるが、いかんせん設計が古い面が否めない。個人的には、既に役目を終えつつあるものと認識している。

2019-03-24追記
Haxe公式でもutestと並んで紹介されていたり、OpenFL(Flash APIマルチプラットフォーム実装)で標準であったり、ユーザー数が多いことには間違いはない。

haxe.unit

Haxe標準ライブラリに含まれるUnitTest。機能不足過ぎ、Haxe 4.0で廃止が決まっているため、使う理由はない。

Breaking changes in Haxe 4.0.0 · HaxeFoundation/haxe Wiki · GitHub

補足

日本語の扱いについて記述しているが、実際に試してみたところ、NekoVMでは日本語がコンソールに正しく出力されなかった。Node.jsでは大丈夫だった。