我们目前正在将在 C++Builder 5 下开发的源代码迁移到较新的 Embarcadero 的 XE5。展望未来,我们希望在 C++Builder5 下编写我们的单元测试,理想情况下,它在迁移后功能齐全,几乎不需要维护。
不过,我的问题很简单。是否可以在 C++Builder 5 上使用与 Embarcadero 相同的 DUnit 框架?如果是这样,您能给我们一些提示吗?
谢谢你。
我们目前正在将在 C++Builder 5 下开发的源代码迁移到较新的 Embarcadero 的 XE5。展望未来,我们希望在 C++Builder5 下编写我们的单元测试,理想情况下,它在迁移后功能齐全,几乎不需要维护。
不过,我的问题很简单。是否可以在 C++Builder 5 上使用与 Embarcadero 相同的 DUnit 框架?如果是这样,您能给我们一些提示吗?
谢谢你。
DUnit 确实可以在 CppBuilder5 上使用。为此:
使用以下命令行构建 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
完成后,制作测试项目变得很容易:
#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;
}
我的TestCase.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
我的TestCase.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)