Index: [Article Count Order] [Thread]

Date:  Fri, 30 Jun 2000 10:41:09 +0900
From:  Kenji Hiranabe <hiranabe@....jp>
Subject:  [XP-jp:00559] CppUnit
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <20000630103809D.hiranabe@....jp>
Posted:  Fri, 30 Jun 2000 10:38:09 +0900
X-Mail-Count: 00559


平鍋@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;
}