QuickCheck++に入門した

QuickCheck++は、Haskellで広く使われているテストフレームワークである
QuickCheckをC++に移植したライブラリです。


ドキュメントと最新版は以下にあります。

QuickCheck++ Documentation 0.0.2


Version 0.0.2ではsigned/unsigned周りでバグがあるので
generate.hhを以下からダウンロードして置き換えてください。


generate.hh



さて、では使い方を見ていきましょう。


1.インクルード

QuickCheck++はヘッダファイルのみのライブラリなのでインクルードするだけですぐ使えます。

#include <quickcheck/quickcheck.hh>


2.テストするプロパティの作成

以下は、reverseを2回した結果、元に戻るかのテストクラスです。
quickcheck::Propertyクラスを継承して、holdsForメンバ関数を定義します。

class prop_reverse : public quickcheck::Property<Vector> {
    bool holdsFor(const Vector& xs) {
        Vector ys = xs;
        std::reverse(ys.begin(), ys.end());
        std::reverse(ys.begin(), ys.end());
        return xs == ys;
    }
};


3.テストする

テストクラスのインスタンスを作成し、check()メンバ関数を呼びます

prop_reverse().check();


4.結果

テスト結果が標準出力に出力されます。

OK, passed 100 tests.


5. テストに失敗した場合

2回目のreverseをコメントアウトしてテストしてみます。

std::reverse(ys.begin(), ys.end());
//std::reverse(ys.begin(), ys.end());

テスト結果として、失敗したケースを出力してくれます。

Falsifiable after 2 tests for input:
  0: [1732365957, 410726649]


基本的にはこれだけです。


テストデータ書いてないぞ!と思うでしょうが、
QuickCheck++ではテストデータをランダムに自動生成してくれます。
デフォルトでは、100件のテストデータを作成します。


どんなテストデータが作成されたか見たい場合は、
check()関数の引数を設定します。

prop_reverse().check(3, 0, true, std::cout);

ここでは、


テストデータ:3件
有効な値の最大値:デフォルト値
詳細出力:ON
出力先:std::cout


に設定しています。
以下のように出力されます。

Test 0:
  0: []
Test 1:
  0: [1732365957, 410726649]
Test 2:
  0: [1116964137, 1395238485]
OK, passed 3 tests.

ランダムテストの内容を確認する必要はあまりないので、通常は詳細表示はしません。



次回以降、さらに調べていきます。