平鍋@esmです.
CppUnit を使って見ました.ただし環境は,Solaris 2.6 +
egcs-1.1.2 です.
テストするクラスは,Vector2d という double x, y; を持つ数学ベク
トルです.
感想は,
(1) これくらいのテストレベルだと main に assert を並べる方法
とあまり変わらないなぁ.
(2) でも,TestRunner が集計を出してくれるのはありがたいなあ.
(3) C++ ではリフレクションが使えないので,ちょっと冗長だなぁ,
(4) 最新の C++ 機能を使っている(auto_ptr, exception, template)
ので,コンパイルに苦労したなぁ.
というところです.参考までに,テストのソースです.
----------------------------------------------------------------------------
#include "Vector2.h" // テストするクラスのヘッダ
#include <cppunit.h> // CppUnit を利用するためのもの(必ずこのヘッダを最後に)
//
// 今回は,Vector2d クラスをテストする
//
/**
* Vector2d のテスト
*/
class Vector2dTest : public TestCase { // TestCase を継承
// テストするデータ
Vector2d* v00;
Vector2d* v11;
Vector2d* v22;
public:
// コンストラクタはいつもこのまま
Vector2dTest(string name) : TestCase(name) { }
// テストの準備を行う.
// 必要なければこのメソッドは定義しなくてよい
void setUp() {
v00 = new Vector2d(0, 0);
v11 = new Vector2d(1, 1);
v22 = new Vector2d(2, 2);
}
// テストの後始末
// 必要なければこのメソッドは定義しなくてよい
void tearDown() {
delete v22;
delete v11;
delete v00;
}
public:
// 実際のテストメソッド.
// 名前は,test で始める.何をテストしたいかが
// 分る名前であれば何でも良い.
// これは,== や != をテスト
void testEqual() {
assert(*v00 != *v11);
assert(*v22 != *v11);
assert(*v11 == *v11);
assert(*v11 != *v00);
}
// これは,operator +- をテスト
void testAddSub() {
Vector2d delta = (*v11 + *v11) - *v22;
double diff = delta.length();
assertEquals(0.0, diff, 1.0e-6);
// 引数の並びは,(正解,実際,許容誤差)
}
// これは,内積をテスト
void testDot() {
assertEquals(4.0, v22->dot(*v11), 1.0e-6);
// 引数の並びは,(正解,実際,許容誤差)
}
// static なメソッドとして,最後にテストメソッドをすべて並べて
// 返す suite メソッドを追加する.
static Test* suite() {
TestSuite* suite = new TestSuite;
suite->addTest(new TestCaller<Vector2dTest>("testEqual", &testEqual));
suite->addTest(new TestCaller<Vector2dTest>("testAddSub", &testAddSub));
suite->addTest(new TestCaller<Vector2dTest>("testDot", &testDot));
return suite;
}
};
// メイン
int main(int argc, char** argv) {
TestRunner runner;
Test* suite = Vector2dTest::suite();
runner.addTest ("Vector2dTest", suite);
// ここに,複数の suite があれば並べて行く.
runner.run (argc, argv);
return 0;
}