最近要使用CPPUNIT做单元测试,在网上找了一些资料后就按照流程走了一遍,现在将过程展示一下:
1.下载CPPUNIT的材料并编译相关工程,获得如下的lib文件和dll文件。进入 CppUnit 1.12.1\src目录下,打开 CppUnitLibraries.dsw,编译其中的几个工程:
cppunit:生成 cppunitd.lib
cppunit_dll:生成 cppunitd_dll.lib, cppunitd_dll.dll
TestRunner:生成 testrunnerud.dll, testrunnerud.lib
TestPlugInRunner:生成 TestPlugInRunnerd.exe
DllPlugInTester: 生成 DllPlugInTesterd.exe
这些生成的文件全部放在LIB文件夹中。下载下来后是dsw的工程,需要用vs2005将其转换成sln工程后再编译。
2.将CPPUnitProjectWizard.vsdir 、CPPUnitProjectWizard.vsz这两个文件到vs安装的根目录下面。
这两个文件路径如下:cppunit-1.12.1\CPPUnitProjectWizard
3.复制CPPUnitProjectWizard 整个解决方案目录到Microsoft Visual Studio 8\VC\VCWizards\CPPUnitProjectWizard\CPPUnitProjectWizard下
4.在vs IDE的菜单栏中按照 工具--->选项---->项目和解决方案------->VC目录中,分别设置CPPUNIT的INCLUDE文件和LIB
文件。
环境基本上就配好了。
5.下面是个简单的测试用例:
先建一个基于扩展mfc的动态库工程DemoDll,再新建一个CDemo类(被测试类)
头文件如下:
#pragma once
class AFX_EXT_CLASS CDemo
{
public:
CDemo(void);
~CDemo(void);
public:
int Add(int i);
int Subtration(int i);
public:
int m_iOper;
};
CPP文件如下:
#include "StdAfx.h"
#include "Demo.h"
CDemo::CDemo(void)
{
m_iOper = 0;
}
CDemo::~CDemo(void)
{
}
int CDemo::Add(int i)
{
return m_iOper += i;
}
int CDemo::Subtration(int i)
{
return m_iOper -= i;
}
在同个一解决方案下新建一个测试工程用于测试这个Demo类
新建一个基于Dialog的工程DemoMfcUnitTest。在项目属性里 链接器->输入->附加依赖
项下输入cppunitd_dll.lib 、testrunnerud.lib(注意是unicode版本)
在App类中 添加下列头文件,如果有重复请删除。
#include "stdafx.h"
#include "DemoMfcUnitTest.h"
#include "DemoMfcUnitTestDlg.h"
#include "TDemoMfc_CDemo.h"
#include "cppunit/extensions/TestFactoryRegistry.h"
#include "cppunit/ui/mfc/TestRunner.h"
/*CDemoMfcUnitTestDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此处放置处理何时用“确定”来关闭
// 对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用“取消”来关闭
// 对话框的代码
}
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;*/
#if TRUE
CppUnit::MfcUi::TestRunner runner;
CppUnit::TestFactoryRegistry ®istry =
CppUnit::TestFactoryRegistry::getRegistry(CTDemoMfc_CDemo::RegCaseName());
runner.addTest(registry.makeTest());
runner.run();
#endif
return TRUE;
#pragma once
#include "cppunit/TestCase.h"
#include "CppUnit/extensions/HelperMacros.h"
#include <string.h>
#include "../CDemo/Demo.h" // 被测试类
class CTDemoMfc_CDemo: public CppUnit::TestCase
{
// 宏定义
CPPUNIT_TEST_SUITE(CTDemoMfc_CDemo); // 开始声明一个新的测试程序集
CPPUNIT_TEST(TestAdd); // 添加TestAdd测试函数到测试程序集
CPPUNIT_TEST(TestSubtration); // 添加TestSubtration测试函数到测试程序集
CPPUNIT_TEST_SUITE_END(); // 声明结束
public:
CTDemoMfc_CDemo(void);
void TestAdd();
void TestSubtration();
static std::string RegCaseName() { return "CTDemoMfc_CDemo";}
public:
~CTDemoMfc_CDemo(void);
};
#include "StdAfx.h"
#include "TDemoMfc_CDemo.h"
#include "cppunit/extensions/TestFactoryRegistry.h"
#include "cppunit/TestAssert.h"
// 对指定程序集进行注册
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(CTDemoMfc_CDemo,CTDemoMfc_CDemo::RegCaseName());
CTDemoMfc_CDemo::CTDemoMfc_CDemo(void)
{
}
CTDemoMfc_CDemo::~CTDemoMfc_CDemo(void)
{
}
void CTDemoMfc_CDemo::TestAdd()
{
CDemo cDemo;
int iResult = cDemo.Add(10);
// 宏判断两个值是否相等
CPPUNIT_ASSERT_EQUAL(iResult,10);
}
void CTDemoMfc_CDemo::TestSubtration()
{
CDemo cDemo;
int iResult = cDemo.Subtration(10);
// 宏判断两个值是否相等
CPPUNIT_ASSERT_EQUAL(iResult,-10);
}
![](http://my.oschina.net/uploads/space/2011/0223/211833_62ML_100374.jpg)