随着业务的扩展,特别是安全客户端的全面上线,CppUnit测试变得越来越重要。
一、获取cppunit源代码
使用svn进行checkout,地址
1.首先运行VS2008(或者VS2005),导入该项目,路径如图:
2.转换
3.删除无用的dspplugin工程。
4.编译解决方案
编译整个解决方案,如果编译出错,则是因为编译器版本错误。
因为vc6为 7.0版本,vs2005为8.0,vs2008为 9.0,因此修改MsDevCallerListCtrl.cpp代码中67行为:
编译完成以后, 在cppunit根目录/lib/目录下,会生成若干lib,和dll文件, 都以cppunit开头. cppunitd表示debug版, cppunit表示release版。CppUnit为我们提供了两套框架库,一个为静态的lib,一个为动态的dll。其中项目cppunit为静态库,cppunit_dll为动态库,生成的库文件为:
cppunit.lib:静态库release版;
cppunitd.lib:静态库debug版;
cppunit_dll.lib:动态库release版;
cppunitd_dll.lib:动态库debug版;
基于静态库与动态库的主要区别为:1.涉及到内存的使用。2.静态库编译时使用,动态库运行时使用。
至此,我们就有了执行CPPUINT所需要的文件(.lib文件),剩下的事情,就是将这些文件运用到被测试的工程中去。
二、环境配置
环境配置如下操作:
1.在VS2008中点击 工具——选项——弹出的框中点击“项目和解决方案”边的+号——VC++目录——右侧“显示以下内容的目录”中选择“可执行文件”,添加 本机cppunit根目录lib
2.在“包含文件”中,添加 本机cppunit根目录include
3.同样,在库文件中,添加 本机cppunit根目录lib
三、新建测试项目
在VS2008中新建一个工程作为测试项目,在测试工程中也有一些需要配置的地方:右击测试项目,点击“属性”
在弹出的窗口中,依次点击“链接器”——输入——在最上方“配置”中,选择Debug,在右侧“附加依赖项”中加入: cppunit根目录libcppunitd.lib
然后,选择Release,在右侧“附加依赖项”中加入: cppunit根目录libcppunit.lib
至此,项目环境配置完成。
四、编码
CPPuint提供了与junit类似的单元测试框架,需要的代码如下:
1.头文件:DiskDataTestCase.h
#if !defined(DISKDATA_TESTCASE_H_INCLUDED)
#define DISKDATA_TESTCASE_H_INCLUDED
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <cppunit/TestCase.h> //为了从基类TestCase派生新的测试类
#include <cppunit/extensions/HelperMacros.h> //方便快速定义测试类的宏
#include “DiskData.h” //被测试类的头文件,根据实际情况更改
class DiskDataTestCase : public CppUnit::TestCase
{
CPPUNIT_TEST_SUITE(DiskDataTestCase);//定义Test Suite的起点
CPPUNIT_TEST(loadTest);//定义Test Case,只有被CPPUNIT_TEST宏定义的函数,才会被当做测试用例运行
CPPUNIT_TEST(storeTest);
CPPUNIT_TEST_SUITE_END();//定义Test Suite的终点
public:
void setUp(); //在每个测试用例运行之前都会运行一次,主要进行数据库连接、初始化类等工作
void tearDown(); //每个测试用例运行之后运行一次,进行对象析构等工作
protected:
void loadTest(); //CPPUNIT_TEST()宏定义中类的实现
void storeTest(); //CPPUNIT_TEST()宏定义中类的实现
private:
DiskData *fixture; //被测试类指针
};
接下来,只要实现CPPUNIT_TEST()宏定义中的类就好。在本例中,就是loadTest() 和 storeTest()这两个方法。
2.cpp文件:
#include “DiskDataTestCase.h”
CPPUNIT_TEST_SUITE_REGISTRATION(DiskDataTestCase); //添加注册过的test
void DiskDataTestCase::setUp()
{
fixture = new DiskData();
}
void DiskDataTestCase::tearDown()
{
delete fixture;
fixture = NULL;
}
void DiskDataTestCase::loadTest()
{
// our load test logic
}
void DiskDataTestCase::storeTest()
{
// our store test logic
}
3.mian函数
#include <cppunit/ui/mfc/TestRunner.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
BOOL CMy_TestsApp::InitInstance()
{
….
// 声明Test Runner,用以注册的测试填入其中,并运行
CppUnit::MfcUi::TestRunner runner; //MFC界面方式
runner.addTest( CppUnit::TestFactoryRegistry::getRegistry().makeTest() );
runner.run();
return TRUE;
}
这样,一套完整的cppunit配置就完成了,点击运行,就可以看到运行界面。
文中具体代码见:用CPPUnit做单元测试
五、assert
CPPUNIT_ASSERT是一个宏,判断后面的参数是否正确,CPPUNIT还有很多宏,如
CPPUNIT_ASSERT(condition) // 确信condition为真
CPPUNIT_ASSERT_MESSAGE(message, condition) // 当condition为假时失败, 并打印message
CPPUNIT_FAIL(message) // 当前测试失败, 并打印message
CPPUNIT_ASSERT_EQUAL(expected, actual) // 确信两者相等
CPPUNIT_ASSERT_EQUAL_MESSAGE(message, expected, actual) // 失败的同时打印message
CPPUNIT_ASSERT_DOUBLES_EQUAL(expected, actual, delta) // 当expected和actual之间差大于delta时失败