QuickCheck 勉強してみよう 最初の一歩の前段階

プログラムを書く際には、ユニットテストも書くでしょう。まぁどっちを先に書くか、という話は置いといて。テストの自動化は品質面でもコスト面でもプラスになるため、できるだけ網羅的にやりたい。しかし網羅は無理なので適当なところで切り上げます。

そこで、前から名前だけは知ってて気になっていた QuickCheck を調べてみようという気になりました。なんと ja.Wikipedia に項目がない、en でもなんかさっぱり短い説明です。Further Reading と External Links が有用そう。まぁ読んでませんが。

QuickCheck - Wikipedia, the free encyclopedia

ざっとまとめるとこんなかんじ。

  • テストケースを「生成」する。
  • テスト対象の関数が持つ「論理的性質」を確認する。
  • Haskell が本家。GHCHUGS で動く。
  • その他、いろんな言語への移植版有り。

めっちゃ噛み砕くと、

  1. 入力をたくさん勝手に生成して、
  2. 何か処理したあとに、
  3. 不変性などのチェックを行う。
  4. そしてチェックが失敗したら、
  5. 入力をなるべく簡略化して失敗する入力を教えてくれる。

このビデオはモチベーションと基本的なところから入っていてよさげ。PDF 落ちてないのかな。

Functional Programming: A Secret Weapon for Software Testing.
hughes_testing

John Hughes gives an invited talk at ICFP 2007 in Freiburg, Germany, showing from his company's experience how QuickCheck has found many obscure bugs in commercial software.

自分として知りたいこと

自分としては簡略化のところにロジック的な興味をかんじつつも、そこは押さえて実用性の面から調査したいと思います。

で、調査の目的を(すぐ忘れちゃうので)先に書いておく。

テストが可能な範囲
具体的には、いわゆる xUnit 系のユニットテストに対して、どのあたりを QC に任せることができて、どう住み分けるのか。
「論理的性質」のテストってなんなのか
ぱらっと見てて例としてあがるのは、互いに逆の操作があって(逆関数というべき?)、その合成はアイデンティティ( x -> x )である、というもの。この「逆関数パターン」みたいに、他に QC の適用方法のパターン化みたいなのがあるとすごくうれしい。
逆関数パターンの実践
自分が関わっているコードベースで、実際使ってみて有用さを実感できるのか。それともほぼ自明な感覚しか持てないのか。これは対象となる個別の関数の複雑さや実装コードによるので、結論があるものではないけど。
対象
Erlang のプログラム、かつ gen_* のビヘイビアでないような単純なパターンに限る。複雑な FSM への適用にも興味はあるが、手を広げすぎると頭がついていかないので切っとく。

Erlang で使える QuickCheck の実装

ぱらっと探した範囲では、次のような有償、タダ、自由などいくつかの実装がありました。

まずはなんといっても QuickCheck の生みの親、John Hughes さんが作った会社 Quviq の製品。研究とビジネスを両立させているのって偉いな。
QuviQ homepage

名前は QuichCheck そのままみたい。Erlang のモジュール名としては eqc なので、"Erlang QuickCheck" くらいが呼び名かな。

製品と合わせ、Quviq ではトレーニング、コンサルティングも行っている。
Erlang Factory なんかでもプレゼンテーション、トレーニングなどをやっているみたい。例えばこれ。
Erlang Factory 2009 London - John Hughes - QuickCheck en Yahoo! Video

ところで、Quviq はなんと読むのだろうか、キュービック?


次に、同じく、 Quviq の無償版の QuickCheck mini。
2010 年 6 月にリリースしたとのこと []。

a free version of Quviq's product with a selection of features comparable to other free versions such as Haskell QuickCheck. QuickCheck Mini makes Quviq's technology for simplifying failing test cases available to a wide audience, and it can be freely used for testing personal, open source, or commercial software.

http://www.quviq.com/news100621.html

Full バージョンとの違いはここ
Quviq QuickCheck Feature Compari

FSM, PULSE, サポートあたりが違いますね。


Quviq の QC のオープンソースライセンスのクローンを github に 2 つ見つけた。他にもあるのかな。

最初に見つけたのは Triq、「トリック」と呼ぶみたい。ライセンスは Apache License v2 で公開されています。

Triq (pronounced "Trick Check") is a free alternative to QuviQ
eqc. Triq's API is modelled closely after
eqc, so I recommend their tutorials and slides for an introduction
to QuickCheck.

krestenkrab/triq - GitHub


もうひとつは PropEr というプロジェクト。ライセンスは GPLv3 (or lator) で、自由なソフトウェア。

PropEr (PROPerty-based testing tool for ERlang) is a QuickCheck-inspired
open-source property-based testing tool for Erlang

manopapad/proper - GitHub

ドキュメントがきちんと書いてあって素晴らしい。ソースも Triq よりすんなり読めそう。

続きは未定。