前提是需要从源代码中导出一个lib库文件夹,一个include文件夹,还有一个src文件夹防盗配置库里。
一、建立一个基于console的测试程序:
1、 新建一个 console application 工程
2、在主函数前面添加引入:
#include <cppunit/CompilerOutputter.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TestRunner.h>
using namespace cpppunit;
主函数:main()
{ CPPUNIT_NS::Test *suite = CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest();
CPPUNIT_NS::TextUi::TestRunner runner;
runner.addTest( suite );
runner.setOutputter(new CPPUNIT_NS::CompilerOutputter( &runner.result(),std::cerr) );
bool wasSucessful = runner.run();
char bb;
scanf("bb",&bb);
return wasSucessful ? 0 : 1;
}
***如果在宏前面添加上 using namespace cppunit; 那么就不需要绿色的部分。******
3、测试类的建立(testcase的建立)
3.1、头文件.h文件
#ifndef testcase_H
#define testcase_H
#include <cppunit/extensions/HelperMacros.h>// 添加的引入库文件
class testcase : public CPPUNIT_NS::TestFixture
{
CPPUNIT_TEST_SUITE( testcase );//创建测试suit
CPPUNIT_TEST(testsum ); //添加测试用例testcase,可以添加多个testcase
CPPUNIT_TEST_SUITE_END(); // 结束创建suit
public:
testcase(void);
~testcase(void);
void setUp(); //初始化
void tearDown(); //结束,对初化的资源进行回收
void testsum(); //申明测试用例testcase
};
#endif
3.2、定义文件.cpp文件的建立
#include“被测试工程的头文件”
#include "../stg/kuy.cpp"
CPPUNIT_TEST_SUITE_REGISTRATION( testcase ); //注册testsuit
testcase::testcase(void)
{ }
testcase::~testcase(void)
{}
void testcase::setUp()
{ }
void testcase::tearDown()
{ }
void testcase::testsum()//定义测试用例,testcase
{
编写测试用例
** 在这里可以使用断言进行判断****
}
4、 工程参数配置
1 在属性下linker/input/Additional Dependecies下添加 cppunitd_dll.lib
2 在属linker/general/Additional Library Directories下添加从配置库生成的lib文件夹
3 在属性[C/C++]/general/Additional include Directories下添加生成的include文件夹。
4 在属性[C/C++]/code generation/runtime Library 设定Multi-threaded debug dll(/MDd)
5在属性[C/C++]/language/enable run-time type info 设定成yes
6 ‘post-build step’,选择All Configurations,在‘post-build command(s)’中增加一个命令‘$(TargetPath)’。
这样CppUnit在项目编译完后会进行自动的测试。
*** 对于第四条针对debug和release分别设置为‘Multithreaded DLL’和‘Debug Multithreaded DLL’****
****被测试工程头文件的引用,对于dll工程include的是.h文件,对于.exe工程include的是.cpp文件****
二、建立一个基于gui/MFC的测试工程
1、 建立基于MFC application(dialog based)的工程。
2、 打开VC新建基于MFC测试框的Project,在stdafx.h中添加
#include <cppunit/ui/mfc/TestRunner.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/extensions/HelperMacros.h>
#ifdef _DEBUG
#pragma comment( lib, "testrunnerd.lib" )
#pragma comment( lib, "CppUnitd.lib" )
#else
#pragma comment( lib, "testrunner.lib" )
#pragma comment( lib, "CppUnit.lib" )
#endif
using namespace CppUnit;
***如果在宏前面添加上 using namespace cppunit; 那么就不需要绿色的部分。******
3.修改对话框初始化函数
CUnitTestApp::InitInstance()
{
cppunit::MfcUi::TestRunner runner;
cppunit::runner.addTest( cppunit::TestFactoryRegistry::getRegistry("SamepleUnitTest").makeTest() ); //添加测试
runner.run(); //show UI
/*
CUnitTestDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK){......}*/ //在原程序中需要注释掉的地方。
4、将要测试的project加入到本project中,实现测试用例类
4.1 测试类头文件
class CSamepleTestCase : public cppunit::TestCase //定义测试类继承了TestCase
{
public:
CSamepleTestCase(void);
virtual ~CSamepleTestCase(void);CPPUNIT_TEST_SUITE(CSamepleTestCase); //开始创建一个testsuit
CPPUNIT_TEST( TestAdd ); //添加测试用例testcase
CPPUNIT_TEST_SUITE_END(); //结束创建testsuit
VOID TestAdd( ); //声明测试用例
};
4.2、 在CPP文件中
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( CSamepleTestCase,"SamepleUnitTest" );// 断言实现testsuit的注册引号里是注册进取的测试suit名
#include <另一个工程中的头文件>
void CSamepleTestCase::TestAdd( void ) //实现测试用例
{
//在这里写测试用例CPPUNIT_ASSERT_EQUAL( 1, 1); //断言判断
}
5、 工程参数配置
1 在属性下linker/input/Additional Dependecies下添加 cppunitd_dll.lib
2 在属linker/general/Additional Library Directories下添加从配置库生成的lib文件夹
3 在属性[C/C++]/general/Additional include Directories下添加生成的include文件夹。
4 在属性[C/C++]/code generation/runtime Library 设定Multi-threaded debug dll(/MDd)
5在属性[C/C++]/language/enable run-time type info 设定成yes
6 ‘post-build step’,选择All Configurations,在‘post-build command(s)’中增加一个命令‘$(TargetPath)’。这样CppUnit在项目编译完后会进行自动的测试。
*** 对于第四条针对debug和release分别设置为‘Multithreaded DLL’和‘Debug Multithreaded DLL’****
**********对于testrunner库文件得用自己编译出来的 ***********************
****被测试工程头文件的引用,对于dll工程include的是.h文件,对于.exe工程include的是.cpp文件****
三、对于被测试工程的设置
一个就是基于.exe工程的测试,另一个就是基于dll工程的测试,对于dll工程要求是建立的是export symbols类型的。
在拿来测试工程后,需要把它的工程属性中的link/general下的output设置成测试用例所在的工程文件夹下。对于俄.exe输出类型是.exe,对于dll类型的文件输出类型是.dll。
如果某个工程需要的另外文件也需要拷贝到测试工程文件夹下。
四、提供的断言:
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时失败
运行方式:
CppUnit::TextUi::TestRunner // 文本方式的TestRunner
CppUnit::QtUi::TestRunner // QT方式的TestRunner
CppUnit::MfcUi::TestRunner // MFC方式的TestRunne
需说明的是,CppUnit所用的动态运行期库均为多线程动态库,因此你的单元测试序也得使用相应得设置,否则会发生冲突
在开发中可以根据实际情况作出选择。进入src文件夹,打开CppUnitLibraries.dsw。分别编译这两个project,输出位置均为lib文件夹。
另外一个需要关注的project是TestRunner,它输出一个dll,提供了一个基于GUI 方式的测试环境,即前面提到的两种测试环境之一。也需要编译这个project,输出位置亦为lib文件夹。 为了方便开发,把这些编译出来的lib和dll(包括Debug版和Release版) copy 到自己建立的一个文件夹中(当然也可以不这么做),例如F:/cppunit1.9.0/lib/,同时也把CppUnit源代码中include文件夹copy到我们自己的include文件夹下。然后在VC的tools/options/directories/include files和library files中设置include路径和lib路径。最后别忘了在自己的project中link正确的lib。
在lib文件夹里共有十个文件。
但最简单的方法是在操作系统的环境变量Path中添TestRunner.dll的路径。
也就是上面的工程设置里的2和3。