CppUnitを使ってみる

以前はC++で開発することが良くあったのだが、昔と違って今はC++版UnitTestもあって良い時代になったもんだね。というわけで使ってみる。

まずインストール。
debian 4.0では下記でインストールできた。

apt-get install libcppunit-dev libcppunit-doc

Test First!

最初にテストコードを書いてあとから実装コードを書きましょう。

hoge-test.hpp

#ifndef hoge_test_h
#define hoge_test_h

#include <cppunit/TestCase.h>

class hoge_test : public CppUnit::TestCase {
public:
  explicit hoge_test() : CppUnit::TestCase("hoge_test") {}

  void test_hoge();

  static CppUnit::Test * suite();
};

#endif

hoge-test.cpp

void hoge_test::test_hoge() {

  CPPUNIT_ASSERT_EQUAL(/*期待値*/,/*結果*/); // などなど検証コードを書く
}

Test * hoge_test::suite() {
  TestSuite * suite = new TestSuite("hoge-test");

  suite->addTest(new TestCaller<objectmemory_test>
                 ("test_hoge",
                  &hoge_test::test_hoge));

  return suite;
}

suite()メソッドは最近のメタ機能付きの処理系と違って自分でメソッドを指定しないといけない。ちょっと不便だけどまぁ仕方無い。templateなどをつかってどうにかならんもんか。
と思ってちょっと調べてみたらAutoRegisterSuiteというのもあるらしい。
今度試してみるか。
参考: CppUnit - The Unit Testing Library

alltest.cpp

#include <cppunit/ui/text/TestRunner.h>
#include "hoge-test.hpp"

int main(int argc, char* argv[]) {
  CppUnit::TextUi::TestRunner runner;

  runner.addTest(hoge_test::suite());

  return runner.run();
}

主なクラス

TestCase
こいつを継承してテストコードを書く
TestSuite
テストの集合
Test
テストの抽象
TestCaller
テストを呼ぶ
TestRunner
テストを実行し結果表示する

大体の継承関係は下記の通り

Test ◆--- TestSuite
     ◆--- TestCase ◆--- TestCaller

参考までにMakefile.am

詳しくはこちら

TESTS = alltest

INCLUDES = -I$(top_srcdir) -I$(includedir)

noinst_PROGRAMS = alltest

alltest_SOURCES = \
        alltest.cpp\
        hoge-test.cpp\
        hoge-test.hpp

alltest_LDFLAGS = -L$(libdir)
alltest_LDADD = 試験対象のライブラリ.a -lcppunit

所感

C/C++などで書かれた実行プログラムはVM上の言語と違って、落ちるときはメモリ違反などであんまり手がかり無く落ちてくれる事が多いので、こういった手法を取り入れてモジュールレベルで強固に作る必要性が他の言語の場合よりも高いんじゃないかな。というか大分助けられました。