QuickCheck++は、Haskellで広く使われているテストフレームワークである
QuickCheckをC++に移植したライブラリです。
ドキュメントと最新版は以下にあります。
QuickCheck++ Documentation 0.0.2
Version 0.0.2ではsigned/unsigned周りでバグがあるので
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.
ランダムテストの内容を確認する必要はあまりないので、通常は詳細表示はしません。
次回以降、さらに調べていきます。