2011年5月22日日曜日

VC++2010でGUI版TestRunnerを作る その3

続いて、GUI部とテスト結果を橋渡しする部分が必要となる。


本家「TestRunner」のプロジェクトを見ると、「Components/MfcTestRunner.h」がどうもその部分らしい。


このクラスと同じI/Fを持ったクラス「TestRunnerEECore」を作ってみた(関数部分をすべて空にした)。

そして、ビルドを実行。
すると、リンクエラーが発生。



warning LNK4248 が1件
error LNK2028: が7件
error LNK2019:  が7件

ワーニングは後回しにして、まずは「LNK2028」の意味を確認した。

http://msdn.microsoft.com/ja-jp/library/ms235590(VS.80).aspx

「ただし、/clr:pure の呼び出し規約は __clrcall です。次のサンプルは LNK2028 を生成します。」
との記述があったため、コンパイルオプションを変更してみた。

(1)構成のプロパティを変更
[プロジェクト] → [プロパティ] → [構成プロパティ] → [全般] → [共通言語ランタイム サポート]

■変更前 : 純粋 MSIL 共通言語ランタイム サポート (/clr:pure)
■変更後 : 共通言語ランタイム サポート (/clr)


(2)C/C++のプロパティを変更

[プロジェクト] → [プロパティ] → [C/C++] → [全般] → [共通言語ランタイム サポート]

■変更前 : 純粋 MSIL 共通言語ランタイム サポート (/clr:pure)
■変更後 : 共通言語ランタイム サポート (/clr)


上記2箇所の設定変更ですべてのエラーは解消。



早速実行した所、無事起動できた。






続いて、サンプルプログラムを作成。

(1) Counter.h
//=========================================================================== #pragma once
//=========================================================================== class Counter { //--------------------------------------------------------------------------- private: // プライベート変数 int Count; // カウント値(=int型の変数)を内包する
//--------------------------------------------------------------------------- public: // コンストラクタ Counter(); // カウント値の初期値は「0」である
// メソッド int Get() const; // 現在のカウント値を返す void Incr(); // カウント値を+1する void Clear(); // カウント値を初期値(=0)に設定する };

(2) Counter.cpp
//===========================================================================#include "Counter.h"
//===========================================================================Counter::Counter() { Clear( );}
//===========================================================================int Counter::Get() const { return Count;}
//===========================================================================void Counter::Incr(){ Count++;}
//===========================================================================void Counter::Clear(){ Count = 0;}
(3) CounterTest.h

//===========================================================================// MoneyTest.h//===========================================================================#pragma once
#include
//===========================================================================class CounterTest : public CPPUNIT_NS::TestFixture{ Counter CounterObj;
CPPUNIT_TEST_SUITE( CounterTest ); CPPUNIT_TEST( testGet ); CPPUNIT_TEST( testIncr ); CPPUNIT_TEST( testClear ); CPPUNIT_TEST_SUITE_END();
public: void setUp(); void tearDown();
void testGet( ); void testIncr( ); void testClear( );};
(4) CounterTest.cpp



//===========================================================================// CounterTest.cpp//===========================================================================
#include
#include "Counter.h"#include "CounterTest.h"
// Registers the fixture into the 'registry'CPPUNIT_TEST_SUITE_REGISTRATION( CounterTest );

//===========================================================================void CounterTest::setUp(){ CounterObj.Clear( );}

//===========================================================================void CounterTest::tearDown(){}
//===========================================================================void CounterTest::testGet( ){ CPPUNIT_ASSERT_EQUAL( CounterObj.Get( ), (int)0 );}
//===========================================================================void CounterTest::testIncr( ){ CounterObj.Incr( ); CPPUNIT_ASSERT_EQUAL( CounterObj.Get( ), (int)1 );}
//===========================================================================void CounterTest::testClear( ){ CounterObj.Incr( ); CounterObj.Clear( ); CPPUNIT_ASSERT_EQUAL( CounterObj.Get( ), (int)0 );}
これらをプロジェクトに追加してビルド。
無事ビルドに成功し、TestRunnerEEが起動された。



GUIとTestRunner部の連結は次回に持ち越し。




0 件のコメント:

コメントを投稿