在vs2005如何使用cppunit
1. 编译cppunit
目前在vs2005下直接编译cppunit工程是编译不过去的。还要对cppunit工程做一下适当的改动才能成功编译。
虽然网上有些文章介绍使用CPPUnitProjectWizard。但是我查阅了相关资料:发现其实不用安装这个CPPUnitProjectWizard。也可以在vs2005下成功编译和链接Cppunit。
首先,在对CppUnitLibraries解决方案做编译之前,需要在硬盘的cppuint目录下新建一个与src文件夹同级的lib文件夹。在 1.12.0 版本下这个问题已经解决。但是在1.12之前的版本还需要手动去建lib文件夹 。
其次:在编译TestRunner这个工程之前,需要先对MsDevCallerListCtrl.cpp文件做一下更改。将
#import "libid:80cc 9f 66-e7d8-4ddd-85b6-d9e6cd0e93e2" version("7.0") lcid("0") raw_interfaces_only named_guids
改为
#import "libid:80cc 9f 66-e7d8-4ddd-85b6-d9e6cd0e93e2" version("8.0") lcid("0") raw_interfaces_only named_guids
这样将会从"%common_files%/MicrosoftShared/MSEnv/dte 80a .olb"导入 dte 80a .olb.
最后,将DSPlugIn这个工程从解决方案里删掉,因为它只支持vc6.0。做过这些处理后vs2005就应该可以成功编译cppunit。
2. vs2005下的环境配置
开发环境中,在vs2005的工具菜单下选项->项目和解决方案- > vc++目录设置好Include 和Lib引用路径。例如:在包含文件选项下加入C:/cppunit/lib 。在库文件选项下加C:/cppunit/include 。另外最好在计算机的系统环境变量下将lib路径添加到path变量下,这样就不用把dll拷来拷去。
3. 一个基于GUI的界面测试程序的例子
首先建一个基于扩展mfc的动态库工程DemoDll。
再新建一个CDemo类(被测试类)
头文件
#pragma once
class AFX_EXT_CLASS CDemo
{
public:
CDemo(void);
virtual ~CDemo(void);
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 、testrunnerd.lib (DEBUG)或cppunit_dll.lib 、testrunner.lib (Release) 并需要将被测试类的头文件路径添加到项目属性里c/c++->附加包含目录里。例如:../ DemoDll。同时在项目依赖项中把Demodll设为依赖项。另外,要注意保证这两个工程的输出目录相同。
在App类中 添加下列头文件
#include "cppunit/extensions/TestFactoryRegistry.h"
#include "cppunit/ui/mfc/TestRunner.h"
#include "TDemoMfc_CDemo.h" // 测试用例类头文件
并在IninInstance()函数中把显示对话框的代码注销掉并在原地曾加下列代码用以显示测试界面。
CppUnit::MfcUi::TestRunner runner;
CppUnit::TestFactoryRegistry ®istry = CppUnit::TestFactoryRegistry::getRegistry(CTDemoMfc_CDemo::RegCaseName());
runner.addTest(registry.makeTest());
runner.run();
return true;
之后构建一个测试用例类。
头文件:
#pragma once
#include "cppunit/TestCase.h"
#include "CppUnit/extensions/HelperMacros.h"
#include <string.h>
#include "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);
};
Cpp文件
#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);
}
最后编译并运行这个工程就会看到CppUnit的GUI测试界面。
关于Cppunit详细的介绍,可以访问http://morningspace.51.net/resource/cppunit/cppunit_anno.html。这上面对cppunit的描述即全面又详细。