0

現在、C++Builder 5 で開発されたソースを新しい Embarcadero の XE5 に移行しています。先のことを考えて、C++Builder5 で単体テストを作成したいと考えています。これは、理想的には、移行後に完全に機能し、メンテナンスがほとんどまたはまったくない状態です。

しかし、私の質問は簡単です。Embarcadero が C++Builder 5 で使用しているのと同じ DUnit フレームワークを使用することは可能ですか? もしそうなら、何かヒントを教えていただけませんか?

ありがとうございました。

4

1 に答える 1

4

DUnit は確かに CppBuilder5 で使用できます。そうするために:

  • ここから DUnit のソース コードを取得します: http://sourceforge.net/projects/dunit/files/latest/download
  • 次のコマンド ラインを使用して DUNITRTL.lib をビルドするか、.bat ファイルを作成して /dunit/src フォルダーから実行することができます。

    SET NDC6=C:\PROGRA~2\Borland\CBUILD~1
    %NDC6%\bin\dcc32.exe Dunit.dpr /O..\objs /DBCB /M /H /W /JPHN -$d-l-n+p+r-s-t-w-y- %2 %3 %4
    %NDC6%\bin\tlib.exe DUNITRTL.lib /P32 -+dunit.obj -+DunitAbout.obj -+DUnitMainForm.obj -+GUITestRunner.obj -+TestExtensions.obj -+TestFramework.obj -+TestModules.obj -+TextTestRunner.obj
    

完了すると、テスト プロジェクトの作成が簡単になります。

  • VCL フォーム アプリケーションを作成します。
  • Unit1.cpp をそのフォームに沿ってプロジェクトから削除します。
  • ビルドした DUNIRTL.lib ファイルをプロジェクトに追加します ([プロジェクト] > [プロジェクトに追加])。
  • ライブラリとインクルード パスの両方に /dunit/src パスを追加します。(プロジェクト > オプション > フォルダー/条件)。
  • Project1.cppファイルに移動し、次のようになっていることを確認します。
    #include <vcl.h>
    #pragma hdrstop

    #include <GUITestRunner.hpp>

    USERES("Project1.res");
    USELIB("DUNITRTL.lib");
    //---------------------------------------------------------------------------
    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
      try
      {
         Application->Initialize();
         Guitestrunner::RunRegisteredTests();
      }
      catch (Exception &exception)
      {
         Application->ShowException(&exception);
      }
      return 0;
    }
  • TestSuite として使用されるプロジェクトに新しいユニットを追加します。

MyTestCase.h

    //---------------------------------------------------------------------------
    #ifndef __TMYTESTCASE_H__
    #define __TMYTESTCASE_H__
    //---------------------------------------------------------------------------
    #include <TestFramework.hpp>
    class TMyTestCase : public TTestCase
    {
      public:
        __fastcall virtual TMyTestCase(AnsiString name) : TTestCase(name) {}
        virtual void __fastcall SetUp();
        virtual void __fastcall TearDown();

      __published:
        void __fastcall MySuccessfulTest();
        void __fastcall MyFailedTest();
    };
    #endif

MyTestCase.cpp

    #include <vcl.h>
    #pragma hdrstop
    //---------------------------------------------------------------------------
    #include "TMyTestCase.h"
    //---------------------------------------------------------------------------

    void __fastcall TMyTestCase::SetUp()
    {}        
    void __fastcall TMyTestCase::TearDown()
    {}

    void __fastcall TMyTestCase::MySuccessfulTest()
    {
      int a = 1;
      a = a + 1;
      CheckEquals(2,a,"test adding");
    }

    void __fastcall TMyTestCase::MyFailedTest()
    {
      int a = 1;
      a = a + 2;
      CheckEquals(2,a,"test adding");
    }

    static void registerTests()
    {
      _di_ITestSuite iSuite;      
      TTestSuite* testSuite = new TTestSuite("Testing TMyTestCase.h");

      if (testSuite->GetInterface(__uuidof(ITestSuite), &iSuite))
      {
        testSuite->AddTests(__classid(TMyTestCase));
        Testframework::RegisterTest(iSuite);
      }
      else
      {
        delete testSuite;
      }
    }

    #pragma startup registerTests 33
    #pragma package(smart_init)
  • プロジェクトはコンパイルして実行できます。テストは問題なく実行する必要があります。
于 2014-04-08T14:48:59.977 に答える