最近要使用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安装的根目录下面。ui
这两个文件路径以下:cppunit-1.12.1\CPPUnitProjectWizardspa
3.复制CPPUnitProjectWizard 整个解决方案目录到Microsoft Visual Studio 8\VC\VCWizards\CPPUnitProjectWizard\CPPUnitProjectWizard下code
4.在vs IDE的菜单栏中按照 工具--->选项---->项目和解决方案------->VC目录中,分别设置CPPUNIT的INCLUDE文件和LIBunicode
文件。get
环境基本上就配好了。string
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); }