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の一番の特徴ではないかと思います。また、上記以外にも、

  • 関数のモックを作成することができる
  • 標準で、XML/CSV/textの出力が用意されている。
    • XMLは、JUnit互換のXMLを出力することができるため、Jenkinsとかと連携できてハッピーになれるらしいです

などが標準で用意されており、かなり強力です。

ただし、個人的には、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の日本語記事はさっとググっても見付からなかったので、これが誰かの一助になればと思います。