1、 下载并编译cppunit,这里以1.21.1为例,下载之后如图1所示为:
图1
2、 进入cppunit-1.12.1\src编译VC\VS工程文件,可能刚开始时候没有VS的工程文件sln,此时直接打开VC的工程文件,打开后进行转换,之后就会出现VS的工程文件,如下图2所示:
图2
3、 编译之后即会在目录cppunit-1.12.1\lib下产生cppunit所需的动态库,如下图3所示:
图3
编译完cppunit之后就可以使用它进行单元测试了,
二、 一个简单的cppunit例子,
1、 先创建一个“test_UT”工程,如下图4所示:
图4
在该工程包含一个CCaculater类,在该类中共有下列四个成员函数:
double Add(double dNum1, double dNum2);
double Sub(double dNum1, double dNum2);
double Mult(double dNum1, double dNum2);
double Div(double dNum1, double dNum2);
下面我们就使用cppunit对CCaculater类进行测试:
2、 新建一个测试工程“cppunit_Test_UT”对上面的“test_UT”进行测试,一般情况下不要将测试工程和被测试的工程放在一个工程里,因为这样的测试对被测试的工程具有侵害性。过程如下图5所示:
图5
该工程可以根据自己需要进行选择,这里选择Win32的Win32 Console Application工程,如下图6所示:
图6
同时,该工程也不选择与编译头文件,故不要勾选此项,如下图7所示:
图7
3、 创建之后的工程结构为如下图8所示:
图8
4、 如果要在工程“cppunit_Test_UT”中使用cppunit对被测工程“test_UT”进行测试,则需要在测试工程工程“cppunit_Test_UT”中配置cppunit的头文件和库文件的路径。过程如下:
(1)在测试工程“cppunit_Test_UT”的项目名中右键单击,在弹出的菜单中选择 属性”Properties”,如下图9所示
图9
(2)在测试工程“cppunit_Test_UT”中配置头文件路径,在弹出的窗体中,选择”Configuration Properties”=>”C/C++”=>”General”,单击右边的窗口的”Additional Include Directories”,如下图10中的红色2所标之处,在弹出的窗口中(下图9中3所示)点击,即可选择cppunit的include目录,需要注意:目录需要选择到cppunit-1.12.1\include,例如cppunit-1.12.1放在了C盘那文件目录就是E: \cppunit-1.12.1\include
图10
(3)在测试工程“cppunit_Test_UT”中配置动态库的路径,方法与(2)相似,把cppunit-1.12.1下面的lib文件夹加入即可,例如cppunit-1.12.1放在了C盘那文件目录就是E: \cppunit-1.12.1\lib,如下图11所示:
图11
(4)在测试工程“cppunit_Test_UT”中添加所需要使用的动态库名称cppunitd.lib testrunnerud.lib,方法如图12所示
图12
配置完成,点击确定即可。
1、 将被测试的类添加到测试工程中,依次添加被测是类的头文件和源文件,方法如下图13所示:
图13
如果添加头文件,则选择”Header Files”,如果添加源文件则选择“Source Files”,在弹出的窗口中,把被测试类的文件选择进来,如图14选择头文件(其他文件的添加的方式也是如此),如图14,在弹出的窗口中到被测试的“test_UT”工程下面把Calculater.h选择进来。
图14
选择完成之后,如图15所示,被测试工程“test_UT”中的被测试类Calculater的”Calculater.cp”和”Calculater.h”文件已经添加到了测试工程”cppunit_Test_UT”中,
图15
6、 在测试工程“cppunit_Test_UT”中,为被测试类Calculater添加测试类CTest_Calculater,需要注意的是:所有的测试类都必须继承自CppUnit::TestFixture,因此需要为该测试类添加此基类,如下图16所示:
图16
如果弹出基类不存在的提示,则选择是即可,如下图17所示:
图17
7、 修改测试类的头文件“Test_Calculater.h”;
(1)中新包含两个头文件:
#include <cppunit/extensions/HelperMacros.h>//CPPUNIT使用
#include "../test_UT/Caculater.h"//测试类CCaculater使用
(2)类的声明中添加cppunit的测试宏CPPUNIT_TEST_SUITE、CPPUNIT_TEST、CPPUNIT_TEST_SUITE_END,每添加一个测试函数都需要用宏CPPUNIT_TEST声明一下。
(3)在该类中添加类CCaculater的四个测试函数,
添加完成之后的头文件如下图所示:
#pragma once
#include <cppunit/extensions/HelperMacros.h>
#include "../test_UT/Caculater.h"
class CTest_Calculater :
public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE(CTest_Calculater);
CPPUNIT_TEST(Test_Add);
CPPUNIT_TEST(Test_Sub);
CPPUNIT_TEST(Test_Mult);
CPPUNIT_TEST(Test_Div);
CPPUNIT_TEST_SUITE_END();
public:
void setUp(){ }
void tearDown(){}
void Test_Add(void);
void Test_Sub(void);
void Test_Mult(void);
void Test_Div(void);
public:
CTest_Calculater(void);
~CTest_Calculater(void);
private:
bool IsEqual(double dNum1, double dNum2);
};
8、 在测试类的cpp文件的开头包含如下的宏定义:
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(CTest_Calculater,"Test_Calculater");
添加完测试函数和上述宏之后的测试类源文件为:
#include "Test_Calculater.h"
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(CTest_Calculater,"Test_Calculater");
CTest_Calculater::CTest_Calculater(void)
{
}
CTest_Calculater::~CTest_Calculater(void)
{
}
void CTest_Calculater::Test_Add(void)
{
CCaculater cc;
CPPUNIT_ASSERT_EQUAL(true,IsEqual(3,cc.Add(1,2)));
}
void CTest_Calculater::Test_Sub(void)
{
CCaculater cc;
CPPUNIT_ASSERT_EQUAL(true,IsEqual(3,cc.Sub(5,2)));
}
void CTest_Calculater::Test_Mult(void)
{
CCaculater cc;
CPPUNIT_ASSERT_EQUAL(true,IsEqual(10.0,cc.Mult(5,2)));
}
void CTest_Calculater::Test_Div(void)
{
CCaculater cc;
CPPUNIT_ASSERT_EQUAL(true,IsEqual(3,cc.Div(6,2)));
}
bool CTest_Calculater::IsEqual(double dNum1, double dNum2)
{
bool bRes = false;
bRes = ((dNum1 - dNum2) < 0.000001)&& ((dNum1 - dNum2) > -0.000001);
return bRes;
}
9、 工程中包含main函数的文件中,添加如下头文件
#include "stdafx.h"
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TestRunner.h>
#include <conio.h>
并仿照下面的代码注册并运行测试用例:
// cppunit_Test_UT.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TestRunner.h>
#include <conio.h>
int _tmain(int argc, _TCHAR* argv[])
{
CppUnit::TextUi::TestRunner runner;
//test Calculater
CppUnit::TestFactoryRegistry &Rg_Test_Calculater= CppUnit::TestFactoryRegistry::getRegistry("Test_Calculater");//这里“Test_Calculater”就是在“Test_Calculater.cpp”文件中开头的宏里面所定义的识别符号
runner.addTest(Rg_Test_Calculater.makeTest());
runner.run();
system("pause");
return 0;
}
10、 运行测试工程,可看到如下测试结果