【VC++开源代码栏目提醒】:网学会员VC++开源代码为您提供CppUnit测试框架入门 - 开发文档参考,解决您在CppUnit测试框架入门 - 开发文档学习中工作中的难题,参考学习。
CppUnit测试框架入门 作者Cpluser 下载源
代码 测试驱动开发TDD是以测试作为开发过程的中心它坚持在编写实际
代码之前先写好基于产品
代码的测试
代码。
开发过程的目标就是首先使测试能够通过然后再优化设计结构。
测试驱动开发式是极限编程的重要组成部分。
XUnit一个基于测试驱动开发的测试框架它为我们在开发过程中使用测试驱动开发提供了一个方便的工具使我们得以快速的进行单元测试。
XUnit的成员有很多如JUnitPythonUnit等。
今天给大家介绍的CppUnit即是XUnit家族中的一员它是一个专门面向C的测试框架。
本文不对CppUnit源码做详细的介绍而只是对CppUnit的应用作一些介绍。
在本文中您将看到 1、CppUnit源
代码的各个组成部分。
2、怎样设置你的开发环境以能够使用CppUnit。
3、怎样为你的产品
代码添加测试
代码实际上应该反过来为测试
代码添加产品
代码。
在TDD中先有测试
代码后有产品
代码并通过CppUnit来进行测试。
本文叙述背景为CppUnit1.9.0 Visual C 6.0 Windows2000。
文中叙述有误之处敬请批评指正。
一、CppUnit源码组成 CppUnit测试框架的源
代码可以到 http://sourceforge.net/projects/cppunit/ 上下载。
下载解压后你将看到如下文件夹 图一 主要的文件夹有 doc: CppUnit的说明文档。
另外
代码的根目录还有三个说明文档分别是INSTALLINSTALL-unixINSTALL-WIN32.txt。
examples: CpppUnit提供的例子也是对CppUnit自身的测试通过它可以学习如何使用CppUnit测试框架进行开发。
include: CppUnit头文件。
src: CppUnit源
代码目录。
二、初识CppUnit测试环境 解压源
代码包后您一定急着想看看CppUnit到底是个什么样Ok下面我们就来揭开CppUnit的神秘面纱 1、进入example文件夹用
VC打开examples.dsw。
我们先来看看CppUnit自带的测试例子。
这些例子都是针对CppUnit自身的单元测试集一方面这是CppUnit作者开发CppUnit框架过程中写的测试用例另一方面我们可以通过这些例子来学习如何在我们自己的工程中添加测试用例。
2、将CppUnitTestApp工程设为Active ProjectWin32 Debug编译后运行则可以看到CppUnit的基于GUI方式进行单元测试TestRunner的界面。
点击“Run”将会看到如图二所示界面 图二 这是一个针对CppUnit的单元测试结果它表明刚才我们做了11个测试全部通过。
点击“Browse”我们还可以选择想要进行的单元测试如图三 图三 CppUnit将所有的单元测试按照树的结构来表示。
在CppUnit中最小的测试单元称为TestMethod测试方法而多个相关的测试方法又可以组成一个TestCase测试用例。
多个测试用例又组成TestSuite测试包。
测试包互相嵌套在一起就形成了上面我们看到的树结构。
我们可以选择其中任意的树节点来进行单元测试。
3、将CppUnitTestMain工程设置为Active ProjectWin32 Debug编译并运行我们来看看另一个单元测试的环境如图四 图四 这是一个基于文本方式的单元测试环境。
CppUnit提供了几种测试环境一种基于文本一种基于GUI即图三。
4、将HostApp工程设置为Active ProjectWin32 Debug编译运行。
如图五 图五 这亦是一个对CppUnit自身进行的测试只不过它向我们演示的是各种失败的测试。
在基于GUI的测试环境中若测试不成功进度条显示红色反之则为绿色。
从测试结果我们可以看到失败的单元测试名称引起测试不能通过的原因以及测试失败的语句所在的文件及所在行数。
三、CppUnit开发环境设置 认识了CppUnit的测试环境想必你已经是在磨拳擦掌准备在你的开发过程中感受一下测试驱动开发的感觉了。
不过在使用CppUnit前还需要设置一下你的开发环境。
1、CppUnit的lib和dll CppUnit为我们提供了两套框架库一个为静态的lib一个为动态的dll。
cppunit project静态lib cppunit_dll project动态dll和lib 在开发中我们可以根据实际情况作出选择。
进入src文件夹打开CppUnitLibraries.dsw。
分别编译这两个project输出位置均为lib文件夹。
另外一个需要关注的project是TestRunner它输出一个dll提供了一个基于GUI 方式的测试环境即前面我们提到的两种测试环境之一。
我们也需要编译这个project输出位置亦为lib文件夹。
为了方便开发我们把这些编译出来的lib和dll包括Debug版和Release版 copy 到我们自己建立的一个文件夹中当然你也可以不这么做例如F:cppunit1.9.0lib同时我们也把CppUnit源
代码中include文件夹copy到我们自己的include文件夹下。
然后在
VC的tools/options/directories/include files和library files中设置include路径和lib路径。
最后别忘了在你的project中link正确的lib。
2、在你的
VC project中打开RTTI开关。
具体位置Project Settings/C/C Language。
3、为TestRunner.dll设置环境变量 TestRunner.dll为我们提供了基于GUI的测试环境。
为了让我们的测试程序能正确的调用它TestRunner.dll必须位于你的测试程序的路径下。
但最简单的方法是在操作系统的环境变量Path中添TestRunner.dll的路径这样是最省事的。
四、你的第一个TDD example 一切准备就绪现在我们可以来看看怎样添加测试
代码了。
前面我们提到过CppUnit最小的测试单位是TestCase多个相关TestCase组成一个TestSuite。
要添加测试
代码最简单的方法就是利用CppUnit为我们提供的几个宏来进行当然还有其他的手工加入方法但均是殊途同归大家可以查阅CppUnit头文件中的演示
代码。
这几个宏是 CPPUNIT_TEST_SUITE 开始创建一个TestSuite CPPUNIT_TEST 添加TestCase CPPUNIT_TEST_SUITE_END 结束创建TestSuite CPPUNIT_TEST_SUITE_NAMED_REGISTRATION 添加一个TestSuite到一个指定的TestFactoryRegistry工厂 感兴趣的朋友可以在HelperMacros.h看看这几个宏的声明本文在此不做详述。
1、一个实现两个整数相加的类 假定我们要实现一个类类名暂且取做CPlus它的功能主要是实现两个数相加多简单的一个类啊这也要测试吗不要紧我们只是了解怎样加入测试
代码来测试它就行了所以越简单越好。
假定这个类要实现的相加的方法是: int Addint nNum1 int nNum2 Ok那我们先来写测试这个方法的
代码吧。
TDD 可是先写测试
代码后写产品
代码CPlus的哦先写的测试
代码往往是不能运行或编译的我们的目标是在写好测试
代码后写产品
代码使之编译通过然后再进行重构。
这就是Kent Beck说的“red/green/refactor” 还记得基于GUI的测试环境的状态条吗。
所以上面的类名和方法应该还只是在你的心里还只是你的idea而已。
2、在
VC中为测试
代码建立一个 Project 通常测试
代码和被测试对象是处于不同的Project中的。
这样就不会让你的产品
代码被测试
代码所“污染 ”。
在本例中我们将建立一个基于GUI 方式的测试环境。
在
VC中我们建立一个基于对话框的Project。
别忘了link正确的lib本例中我们使用静态的CppUnit lib。
由于我们希望这个Project运行后显示的是图2这样的界面所以我们需要在App的 Instance中屏蔽掉原有的对话框代之以CppUnit的GUI。
CppUnit::MfcUi::TestRunner runner runner.addTestPlusTest::suite //添加测试 runner.run //show UI / CCPlusTestDlg dlg m_pMainWnd dlg int nResponse dlg.DoModal if nResponse IDOK // TODO: Place code here to handle when the dialog is // dismissed with OK else if nResponse IDCANCEL // TODO: Place code here to handle when the dialog is // dismissed with Cancel / 前面我们提到过TestRunner输出图2这样的对话框这也是前面我们为什么要为TestRunner.dll的路径设置环境变量的原因。
注意PlusTest::suite返回一个指向CppUnit::Test的指针.这个指针就是整个测试的起点。
CppUnit::TestFactoryRegistry::getRegistry根据TestSuite的名字返回TestFactoryRegistry工厂然后调用工厂里的makeTest对TestSuite进行组装这是个递归调用将建立起一个树状的测试结构。
namespace PlusTest CppUnit::Test suite CppUnit::TestFactoryRegistry ??istry CppUnit::TestFactoryRegistry::getRegistryplusSuiteName return registry.makeTest 另外别忘加头文件 include CPlusTestSuite.h include include 3、在Project中加入一个类取名CPlusTestCase CPlusTestCase从CppUnit::TestCase继承
代码如下 class CPlusTestCase : public CppUnit::TestCase CPPUNIT_TEST_SUITECPlusTestCase CPPUNIT_TESTtestAdd CPPUNIT_TEST_SUITE_END public: CPlusTestCase virtual CPlusTestCase void testAdd //测试方法 看到这几个宏了吗它们可是在这大显身手了一把。
CPPUNIT_TEST_SUITECPlusTestCase CPPUNIT_TEST testAdd CPPUNIT_TEST_SUITE_END 通过这几个宏我们就把CPlusTestCase和testAdd注册到了测试列表当中。
另外我们需要在Cpp文件中加入另外一个宏 CPPUNIT_TEST_SUITE_NAMED_REGISTRATIONCPlusTestCasePlusTest::plusSuiteName 它将CPlusTestCase这个TestSuite注册到一个指定的TestFactory工厂中这个TestSuite用 PlusTest::plusSuiteName函数返回的名字来标识前面介绍的suite函数中就是通过这个名字来获取这个工厂的。
plusSuiteName是PlusTest这个namespace下的一个函数它返回我们为这个TestSuite建立的名字本例我们取名为“plus”。
其实我们也可以不用这么做直接在宏里写入“plus“即可。
但是这样可以防止硬编码带来的麻烦。
在测试类中我们添加了一个测试方法 void testAdd 它测试的对象是前面提到的CPlus类的方法 int Addint nNum1 int nNum2 我们来看看它的实现 void CPlusTestCase::testAdd CPlus plus int nResult plus.Add10 20 //执行Add操作 CPPUNIT_ASSERT_EQUAL30 nResult //检查结果是否等于30 CPPUNIT_ASSERT_EQUAL是一个判断结果的宏。
CppUnit中类似的其它宏请查阅TestAssert.h本文在此不做详述 。
另外我们还可以覆写基类的 setUp、tearDown两个函数。
这两个函数实际上是一个模板方法在测试运行之前会调用setUp以进行一些初始化的工作测试结束之后又会调用tearDown来做一些“善后工作” 比如资源的回收等等。
当然你也可以不覆写这两个函数因为它们在基类里定义成了空方法而不是纯虚函数。
另外Cpp中要加入头文件 include plusSuite.h 4、根据测试
代码编写产品
代码 编写完上面的测试
代码后进行编译。
编译肯定通不过编译器会告诉我们CPlus类没有声明因为我们还没有实现CPlus类呢现在的工作就是马上实现CPlus类让编译通过。
现在你应该嗅到一点“测试驱动“的味道了吧 在
VC中建立一个MFC Extension Dll的Project在这个Project 中加入类CPlus它的声明如下 class AFX_EXT_CLASS CPlus public: CPlus virtual CPlus public: int Addint nNum1 int nNum2 仅有一个方法就是我们的测试
代码要测试的那个方法。
来看看它的实现 int CPlus::Addint nNum1 int nNum2 return nNum1nNum2 非常简单不是吗现在让前面那个包含测试
代码的Project dependent这个Projectinclude 相关头文件 Rebuild All你会发现编译已通过。
你体会到了测试
代码驱动产品
代码了吗当然我们的这个例子还很简单 没有重构这一步骤。
运行我们的测试程序你就会看到如图六的界面 图六 单击”Browse” 如图七 图七 这下你应该对前面我们说的TestSuite的名字理解更深了吧。
plus是一个测试包TestSuite它的下面包含一个测试用例这个测试用例下面又包含一个测试方法。
至此我们对CppUnit测试框架的应用作了一个详细的介绍希望能对你在进行TDD过程中有所帮助。
参考资料 CppUnit源码及说明文档
上一篇:
C#.net__贪吃蛇源码
下一篇:
计算机网络信息安全及防护策略研究