読者です 読者をやめる 読者になる 読者になる

Boostライブラリによるテスト (2)

テスト駆動開発

昨日はメモ書き程度だったので、追加でわかった事項を記述。


まず、Boostのテスト用の比較マクロには三種類あり、LevelがWARN、CHECK、REQUIREとなっています。
それぞれのレベルで、WARN:警告、CHECK:エラー、REQUIRE:致命的エラーのためのテストとなっている。

動作としては以下の表を参照。

レベルエラーカウンターテスト処理
WARN何もしない継続
CHECK増加する継続
REQUIRE増加する継続しない


次にテスト用マクロの詳細について。
[Level]の部分については上のレベルのうちの一つが入るものとする。

・BOOST_[Level](pred)
 単純なブール値のテスト。predのブール値が真であればテスト成功。

・BOOST_[Level]_BITWISE_EQUAL(left, right)
 leftとrightのビットごとの比較。leftとrightの型は同じでなくてもよいが、サイズが違った場合は警告が出る。

・BOOST_[Level]_CLOSE(left, right, tol)
 leftとrightの値がtol(%)の幅に収まっているかの比較。boost/test/floating_point_comparison.hppのインクルードが必要。

・BOOST_[Level]_CLOSE_FRACTION(left, right, tol)
 leftとrightの値がtol(%)の幅に収まっているかの比較。(CLOSEとの違いはわからず)boost/test/floating_point_comparison.hppのインクルードが必要。

・BOOST_[Level]_EQUAL(left, right)
 leftとrightを"=="で比較して真ならテスト成功。

・BOOST_[Level]_EQUAL_COLLECTIONS(left_begin, left_end, right_begin, right_end)
 配列の比較を行う。left_beginからleft_endまでとright_beginからright_endまでの値が一致していたら、テスト成功。

例.

#include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_CASE( test )
{
    int col1 [] = { 1, 2, 3, 4, 5, 6, 7 };
    int col2 [] = { 0, 1, 2, 3, 4, 5, 6 };

    BOOST_CHECK_EQUAL_COLLECTIONS( col1, col1+6, col2+1, col2+7 );
}


結果:成功


・BOOST_WARN_EXCEPTION(expr, excep, pred)
 exprで投げられる例外とpredに対応するexcepを投げることを確認する。

・BOOST__GE(left, right)
 left>=rightが真ならばテスト成功。

・BOOST__GT(left, right)
 left > rightが真ならばテスト成功。

・BOOST__LE(left, right)
 left<=rightが真ならばテスト成功。

・BOOST__LT(left, right)
 left < rightが真ならばテスト成功。

・BOOST__MESSAGE(pred, mess)
 predの処理が真ならテスト成功。偽ならmessを表示。messはstd::ostream& operator<<(std::ostream&)に対応している。

・BOOST__NE(left, right)
 left!=rightならテスト成功。

・BOOST__NO_THROW(expr)
 exprを実行して、一切の例外を投げなければテスト成功。

・BOOST__PREDICATE(pred, args_list)
 predで指定される関数にargs_listで指定される引数(丸かっこ()で一つ一つの引数を区切って渡す)を渡して実行したとき、predの値が真ならテスト成功。

・BOOST__SMALL(val, tol)
 tolで指定される値より、valの絶対値が小さければテスト成功。

・BOOST__THROW(expr, excep)
 exprを実行したとき、それがexcepで指定される例外(またはその子のクラス)を投げれば、テスト成功。

・BOOST_ERROR(mess)
 エラーカウンタを増加し、messで指定されたメッセージを表示する。

・BOOST_FAIL(mess)
 エラーカウンタを増加し、メッセージを表示してテストを終了する。

・BOOST_IS_DEFINED(symbol)
 symbolで指定されたプリプロセッサシンボルが定義されるかどうか、実行時に調べる。
 確認を実行、記録するために、BOOST_[level]と結合して使います。

例.

#include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_CASE( test )
{
    BOOST_CHECK(BOOST_IS_DEFINED(SYMBOL1));
    BOOST_CHECK(BOOST_IS_DEFINED(SYMBOL2(arg)));
}




が、今のところ公式ドキュメントに書かれているテスト用マクロのリファレンス。
朝っぱらに一気にやったのは間違いだったかも…。

追記:
プログラム例を載せていますが、#include <boost/test/included/unit_test.hpp>の前の行に#define BOOST_TEST_MODULE exampleを入れないとコンパイルエラーが発生するようです。
さすがにリファレンスをかいつまんだだけでは分からないこともあるようですが、とりあえずこれで動きはするようです。
(警告も出るようですが、全ての警告が止まるようなコンパイルオプションが分からないので今のところ放置。実害はないようです)



追記(2010/12/17):
Visual Studioの場合にはプロジェクトの[プロパティページ]から[C/C++]→[コード生成]→[C++の例外を有効にする]のプロパティを「(/EHa)」に変更すると警告が出なくなるようです。

広告を非表示にする