xUnitもQuickCheckも使えるテストツールKaputt
現場が社内から、常駐先になったことで、なんか前職とあまり変わらない感覚になってしまい、どうにも色々とやる気がでませんでした。通勤時間が倍になったから、というのもあります。
まぁやる気が無いこと自体はいつものことではあるので、それはどうかとも思いますが、とりあえずやる気を捻りだしてみます。
OUnitで十分じゃ?
今まで、(あまり書いていませんが)OCamlでテストを書くときは、OUnitを利用していました。OUnitはシンプルかつ、test suiteとしてまとめやすい、JUnitとかとほとんど同じような使い勝手なので、あまり悩まずに利用できる、ということ感じでした。
もちろん現在でも更新は続けられていますし、余程複雑なものにでもならない限りは、これで必要十分じゃないかとも思います。
ただ、シンプルな分、他にやりたいことがあれば、自分で実装する必要があります。また、基本的にはReporterとかは用意されていないため、何かレポートが必要な場合などは、自分でなんやかや作る必要があります。(多分)
また、QuickCheck的な機構は当然ながら無いので、それらのテストを行いたい場合は、そのツールを別途導入する必要があります
Kaputtとは
Kaputtは、公式ページによると以下のようなテストを行うことができます。
- assertionベースのテスト(xUnit)
- specificationベースのテスト(QuickCheck)
- enumrationベースのテスト(SmallCheck)
- shellベースのテスト
SmallCheckってなんぞや?と思ってググってみましたが、Haskellで作成されたテスティングフレームワークのようです。ある値の全領域についてのテストを、自動的にテストケースを生成して実行する、というもののようです(合ってんのかな?)
これらがall in oneになっていることが、Kaputtの一番の特徴ではないかと思います。また、上記以外にも、
などが標準で用意されており、かなり強力です。
ただし、個人的には、OUnitにあった、コンビネータベースでtest suiteを作成できる機能が無いのがちょっと残念です。また、OUnitと流儀が違い、
- OUnit : 小さいテストを組み合わせて、suiteを実行する
- Kaputt : それぞれのテストケースを実行する(suiteとかの概念は基本無い)
という感じです。Kaputtでは、それぞれのテストケース自体に名前を付けることができるので、それでカバーできるとは思います。
使ってみる
とりあえず簡単にインストールして使ってみます・・・と言っても、opamからインストールできてしまうので、この辺の手間が省けてすばらしいです。
$ opam install kaputt
open Kaputt.Abbreviations let t = make_simple_test ~title:"first test" (fun () -> Assert.equal_string "hoge" "hoge"; Assert.not_equal_string "hoge" "foobar"; ) let () = Test.run_test t
とりあえずはこんな感じになります。Assertモジュールに各種assertionが定義されていますが、assertion builderというものもあり、それを利用すると、独自定義したような型に対するassertionも比較的簡単に作成することができます。
まぁもっと有用な実例は、Kaputtのリファレンスに詳しく載っていますので、そちらを見てもらった方が早いと思います。
OUnitでも十分ですが
Kaputtを使う理由としては、all in oneであることと、標準で様々な形式のreporterが提供されている、ということになるでしょうか。シンプルさでいえば、OUnitは非常にシンプルながら、こなれたインターフェースを利用できますので、色々な機能を自分で実装したいような方はOUnitでも十分だと思います。
ただ、色々なツールがあるのならば、それらを比較することも大切じゃまいか、ということで記事にしました。Kaputtの日本語記事はさっとググっても見付からなかったので、これが誰かの一助になればと思います。