閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

CxxTest を使ってみた

検索していたら見つけた C++ 用の UnitTest ツール。ちょっと面白そうなので使ってみました。使うためには perl (か Python) が必要ですが、それと C++ コンパイラがあればすぐ使えるのでとてもお手軽です。

導入は、ダウンロードページ (http://sourceforge.net/project/showfiles.php?group_id=52834 辺り) からソース一式をダウンロードするだけ。Guide とついているのはマニュアルです。また、 CxxTest 自体はライブラリや DLL になっているわけではないので、ビルドする必要はありません。

また、前述の通り perl が必要になるため、インストールしてやります。 Windows 環境ならば、 ActiveState が配布している ActivePerl が簡単だと思います。 msi 形式のインストーラをダウンロードして、実行すれば完了です。

必要な環境がそろったら、後は使うだけです。

ユーザガイドにあるサンプルとほとんど同じですが……。まず、 MyTestSuite.h を作成し、以下の記述を追加します。

// MyTestSuite.h
// cxxtest フォルダはダウンロードしてきた時に
// 適切なフォルダにコピーするか、
// パスを通しておいてください。
#include <cxxtest/TestSuite.h>
class MyTestSuite : public CxxTest::TestSuite
{
public:
   void testAddition()
   {
       TS_ASSERT( 1 + 1 > 1); // 普通のアサートと同じ感覚でOK
   }

   void testEquals()
   {
       TS_ASSERT_EQUALS( 1 + 1, 1 ); // わざと間違えてみる
       // ↑こいつは第一引数と第二引数の値が同値かどうかをチェックする関数(というかマクロ)
   }
};

その後、コマンドプロンプトで以下のコマンドを実行します。

perl -w cxxtestgen.pl --error-printer -o test.cpp MyTestSuite.h

cxxtestgen.pl は、 cxxtest のアーカイブの中にあります。 pl ファイルの中にも説明がありますが、 --error-printer-o はこの perl スクリプトのオプションになります。

実行したフォルダを見ると、 test.cpp(コマンドで指定したファイル名) が出力されていると思います。この中に、 MyTestSuite.h を使ったコードが自動的に生成されていますので、後はこのコードをコンパイルしてやればすぐにテストを行えます。コンパイル方法はコンパイラによるので省略します。

で、上記コードをコンパイルし実行した結果が以下。

Running 2 tests.
In MyTestSuite::testEquals:
c:\*\MyTestSuite.h:12: Error: Expected (1 + 1 == 1), found (2 != 1)
Failed 1 of 2 tests
Success rate: 50%

先ほどの MyTestSuite.h にわざと間違えた記述をしたため、その部分で失敗したというメッセージが表示されています。 失敗したコードとその行数が表示されるため、どこが間違えているのかが一目でわかります。また、 testAddition 関数の方は間違いが無いため、そちらは成功したものとみなされ Success rate は 50% になっています。

ということで、とても簡単にできてしまいました。ちょっとしたテストには手軽に使えていいんじゃないでしょうか。