読者です 読者をやめる 読者になる 読者になる

Natural Software

KinectなどのDepthセンサーを中心に活動しています

CppUnit-x ではじめる、簡単ユニットテスト−その1 テストをしてみる

プログラム C++ テスト

eXtreme Programmingテスト技法―xUnitではじめる実践XPプログラミング (OOP foundations)

eXtreme Programmingテスト技法―xUnitではじめる実践XPプログラミング (OOP foundations)

写経シリーズ 第1回

まずは 194 ページ List9-1〜9-3


いくつか本のままだと動かない部分があったので修正(@@@ の項目)
CppUnit-x のサンプルとか紹介ページとかだとよくわからなかったけど、これをやってみてよくわかった:)
#動作環境は VC++6.0

#define CPPUNIT_COMPATIBLE  // @@@ これがないと assertDoublesEqual が定義されない
#include <cppunit/TestCase.h>
#include <math.h>
#include <vector>
#pragma comment( lib, "cppunit.lib" )

USING_NAMESPACE_CPPUNIT

class MyTest : public TestCase
{
public:

    // いつも決まった形のコンストラクタ
    MyTest( const char* name ) : TestCase( name ) {}

    // 準備用のコード
    void setUp()
    {
    }

    // 後片付けようのコード
    void tearDown()
    {
    }

    // テストを書く
    void runTest()
    {
        // -1 のアークコサインはだいたい円周率になる
        assertDoublesEqual( 3.14, acos( -1 ), 0.01 );   // @@@ 本は assertDoublesEquals になってた

        // 範囲外アクセスは例外が投げられるはず
        // 正しい例外が投げられるかチェックする
        std::vector< char > x( 5, 'a' );
        try {
            char y = x.at( 21 );    // 例外発生(正常終了)
//          char y = x[21];         // 例外でない(FAIL)
//          throw std::exception(); // 想定外のエラー
            TEST_FAIL( "例外が投げられませんでした\n" );
        }
        catch ( std::out_of_range ) {
            // 正常な例外
        }
        catch ( ... ) {
            TEST_ERROR( "予定外のエラーが投げられました\n" );
        }
    }
};

#include <cppunit/TestRunner.h>

int main( int argc, char* argv[] )
{
    TestRunner  runner;
    runner.addTest( "MyTest", new MyTest( "MyTest" ) ); // @@@ 本ではコンストラクタ引数がない、クラス名注意
    return runner.run( argc, argv );
}
// EOF