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

Natural Software

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

CppUnit-x ではじめる、簡単ユニットテスト−その4 makefile の作成

プログラム C++ テスト

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

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

この本の写経シリーズ(笑)
第4回はバッチファイルを makefile にしてみる。
List9-X〜9-X を写経(本を会社に置いてきたので章番号が不明^^;)


実際のコードをテストする際には

  • テスト対象.h
  • テスト対象.cpp
  • テストコード.h

が必要になってくると思われる。


ってことは「テスト対象」が増えるたびにバッチファイルを書き換える必要がある。


それだとカッコイクナイので makefile に書き出してそいつを nmake に食わせることにする(Windows + VC なので nmake)。


ためしに本にある Quiz.h、Quiz.cpp、QuizTest.h を作成してテストしてみる。

テストコード

Quiz.h
#ifndef QUIZ_H_INCLUDE
#define QUIZ_H_INCLUDE

#include <string>

class Quiz
{
private:

    std::string     question_;
    int             answer_;

public:

    Quiz( const std::string& aQuestion, const std::string& correctAnswer, const std::string& badAnswer );

    const std::string& getQuestion() const;
    bool chackAnswer( int anAnswer ) const;
};

#endif // #ifndef QUIZ_H_INCLUDE
// EOF
Quiz.cpp
#include "Quiz.h"
#include <cstdlib>
#include <ctime>

Quiz::Quiz( const std::string& aQuestion, const std::string& correctAnswer, const std::string& badAnswer )
{
    srand( ::time( 0 ) );

    question_ = aQuestion + "\n";

    // 問題シャッフル
    if ( (rand() % 2) ) {
        question_ += "1: " + correctAnswer + "\n2: " + badAnswer;
        answer_  = 1;
    }
    else {
        question_ += "1: " + badAnswer + "\n2: " + correctAnswer;
        answer_  = 2;
    }
}

const std::string& Quiz::getQuestion() const
{
    return question_;
}

bool Quiz::chackAnswer( int anAnswer ) const
{
    return answer_ == anAnswer;
}
// EOF
QuizTest.h
#include "Quiz.h"

class QuizTest : public TestCase
{
public:

    // いつもきまった書き方のコンストラクタ
    QuizTest( const char* name ) : TestCase( name ) {}

    // 実行したいテストメソッド
    void testQuestion()
    {
        Quiz quiz( "ドラえもんは何型ロボット?", "ねこ", "たぬき" );

        assert( std::string::npos != quiz.getQuestion().find( "ドラえもんは何型ロボット?" ) );
        assert( std::string::npos != quiz.getQuestion().find( "ねこ" ) );
        assert( std::string::npos != quiz.getQuestion().find( "たぬき" ) );
    }

    void testAnswer()
    {
        Quiz quiz( "ドラえもんは何型ロボット?", "ねこ", "たぬき" );

        if ( std::string::npos != quiz.getQuestion().find( "1: ねこ" ) ) {
            assert( quiz.chackAnswer( 1 ) );
        }
        else {
            assert( quiz.chackAnswer( 2 ) );
        }
    }
};
// EOF
makefile
OBJS = Quiz.obj
LIBS = cppunit.lib 
INC  = D:\_work\etc\cppunit-x-20020331

test : $(OBJS)
	ruby TestRunnerFactory.rb
	cl -GX -I$(INC) Tester.cpp $(LIBS) $(OBJS)
	Tester.exe

実行

これを makefile のあるフォルダでコマンドプロンプトから

nmake

とすると前回と同じように実行される。


処理を makefile に移すことでいろいろ応用が利くのではないだろうか。