CppUnit使ってみる

テスト駆動型開発をきちんとやろうと思い,色々調べた結果CppUnitを試してみることにした.以下,初めてCppUnitを試したときのメモ.
MacでHomebrewを設定してあれば,

brew install cppunit

でインストール可能.使い方は,とりあえずコンパイルが通るコードを書く
add.h

int add(int x, int y);

add.cpp

int add(int x, int y){
    return 0;
}

これを評価するテストコードとして,次のようなものを用意する.
AddTest.cpp

#include <cppunit/extensions/HelperMacros.h>
#include "add.h"
class AddTest: public CPPUNIT_NS::TestFixture{
	CPPUNIT_TEST_SUITE( AddTest );
	CPPUNIT_TEST( test_add );
	CPPUNIT_TEST_SUITE_END();
	public:
	void setUp();
	void tearDown();
	protected:
	void test_add();
};
void AddTest::setUp(){
}
void AddTest::tearDown(){
}
void AddTest::test_add(){
	CPPUNIT_ASSERT_EQUAL(0, add(0,0) );
}
CPPUNIT_TEST_SUITE_REGISTRATION(AddTest);

こういう感じのやつを色んなクラスや関数に対して作れば良いみたい.
そしてmain関数のあるコードとして以下の様なものを用意する.
test.cpp

#include <cppunit/BriefTestProgressListener.h>
#include <cppunit/CompilerOutputter.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/TestResult.h>
#include <cppunit/TestResultCollector.h>
#include <cppunit/TestRunner.h>
int main(int argc, char **argv){
	CPPUNIT_NS::TestResult controller;
	CPPUNIT_NS::TestResultCollector result;
	controller.addListener(&result);
	CPPUNIT_NS::BriefTestProgressListener progress;
	controller.addListener(&progress);
	CPPUNIT_NS::TestRunner runner;
	runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() );
	runner.run( controller );
	CPPUNIT_NS::CompilerOutputter outputter( &result, CPPUNIT_NS::stdCOut() );
	outputter.write();
	return result.wasSuccessful() ? 0 : 1;
}

これでコンパイルができる.コンパイルはpkg-configを使って

g++ -a addtest test.cpp AddTest.cpp add.cpp `pkg-config --cflags --libs cppunit`

でコンパイルが通る.実行すると,

$ ./addtest
AddTest::test_add : OK
OK (1)

と表示される.次に,テストを追加する.

#include <cppunit/extensions/HelperMacros.h>
#include "add.h"
class AddTest: public CPPUNIT_NS::TestFixture{
	CPPUNIT_TEST_SUITE( AddTest );
	CPPUNIT_TEST( test_add );
	CPPUNIT_TEST( test_add2 );
	CPPUNIT_TEST_SUITE_END();
	public:
	void setUp();
	void tearDown();
	protected:
	void test_add();
	void test_add2();
};
void AddTest::setUp(){
}
void AddTest::tearDown(){
}
void AddTest::test_add(){
	CPPUNIT_ASSERT_EQUAL(0, add(0,0) );
}
void AddTest::test_add2(){
	CPPUNIT_ASSERT_EQUAL(3, add(1,2) );
}
CPPUNIT_TEST_SUITE_REGISTRATION( AddTest );

のように,test_add2を追加した.同様にコンパイルして実行すると,

$ ./addtest
AddTest::test_add : OK
AddTest::test_add2 : assertion
AddTest.cpp:30: Assertion
Test name: AddTest::test_add2
equality assertion failed
- Expected: 3
- Actual  : 0
Failures !!!
Run: 2   Failure total: 1   Failures: 1   Errors: 0

となった.足し算の結果がおかしいことがわかる.そこで,add.cppを修正して

int add(int x, int y){
	return x+y;
}

と修正してテストを実行したところ,

$ ./addtest
AddTest::test_add : OK
AddTest::test_add2 : OK
OK (2)

となりテストが成功した.

コメントする