本空间文章除特别说明均属原创,转载请注明出处,谢谢!

CPPUNIT基本原理

上一篇 / 下一篇  2008-10-10 17:13:39

一、CPPUNIT概念51Testing软件测试网/h.R$`j U-W6D$B

CPPUNIT是一个测试驱动开发的测试框架。所谓测试驱动开发(TDD)是一种可以在开发过程中控制忧虑感的开发方法,它坚持以测试作为开发过程的中心,在开发前根据对将要开发的程序的要求,先写好所有测试代码,并且在开发过程中不断地通过运行测试代码来获得所开发的代码与所要求的结果之间的差距。51Testing软件测试网I ovm [3f8v0M

CPPUNITXUNIT的一部分,它是由JUNIT演变过来的,专门针对C/C++单元测试工具。51Testing软件测试网s@0D,EX7k6[k(e

 51Testing软件测试网]8Tm5`,i

测试驱动开发的原则:

&_ o&C+@S*z~\4o0

Ø       先写测试代码,然后编写符合测试的代码。至少做到完成部分代码后,完成对应的测试代码;

]-uN{0e*HC ^0

Ø       测试代码不需要覆盖所有的细节,但应该对所有主要的功能和可能出错的地方有相应的测试用例;51Testing软件测试网N3V3|)S"wYy z m

Ø       发现bug,首先编写对应的测试用例,然后进行调试;

.ba"}@ DW0

Ø       不断总结出现bug的原因,对其他代码编写相应测试用例;51Testing软件测试网}gC H2T'M

Ø       每次编写完成代码,运行所有以前的测试用例,验证对以前代码影响,把这种影响尽早消除;51Testing软件测试网!e k"w+s\@!S-f9T

Ø       不断维护测试代码,保证代码变动后通过所有测试;51Testing软件测试网'B j%e Ir

Ø       在编码前:他可以强迫你对需求进行详细的分析。51Testing软件测试网yY?#L@h&I9Sr;hj

Ø       在编码时:他可以使你对over coding保持警觉。51Testing软件测试网5ahn]}-PB"H

Ø       在重构时:可以确保新的设计能够兼容旧版本的功能。51Testing软件测试网 |2Z wIg$Kct*y

Ø       在团队开发时:可以确保自己的单元是无误的。51Testing软件测试网)]4M;s8E7w L1A L]

 51Testing软件测试网o;J%x u T

二、CPPUNIT原理

      CPPUNIT的概念:测试框架,我们可以获知一点CPPUNIT原理的信息。下面我们就这个概念来进一步说明CPPUNIT的原理。CPPUNIT的测试对象可以是一个函数,一个对象或是若干个对象集,在CPPUNIT中将测试对象定义为FIXTURE,确定了FIXUTRE之后CPPUNIT要做的步骤主要是:

+x8] }WW:_2k+c0

1了解需求,从使用者的角度写出测试代码,组织好测试框架。包括对FIXTURE及相关的初始化,准备好测试用例,明确每个测试用例的预期输出结果(也就是期望值)。

I&B8r{(A0

2往测试代码中加入被测对象,运行测试代码后检查输出结果。

NA$L'|:Ub$O{!K0

      3如果随着FIXTURE的变动需要增加或者是删除测试用例,可以直接在测试代码中增加或删除,而其它测试用例可以继续延用,作为回归的测试用例。

:y!C8R5iU#FJ0

      4每一次测试CPPUNIT都是通过对比FIXTURE的返回值和期望值而得出该用例的执行是否成功,如果二者不同,则返回FALSE51Testing软件测试网"Y |!S6J3sp,tN

      CPPUNITTest Case(测试用例)是最小的单位,当一个FIXTURE有多个Test Case时,可以将这多个Test Case组成一个Test Suite,这个Test Suite是用来测试同一被测单元的一组Test Case。若需要同时测试多个对象,将所有测试用例一起执行的时候,可以将若干个Test Suite组成一个Test Factor。如果在测试的过程中FIXTURE发生了改变,可以直接修改相关的Test Case,这就是CPPUNIT对测试用例的管理。51Testing软件测试网'UXv"phR pW

 51Testing软件测试网-dvQE3B(Iyk$k_

三、CPPUNIT的安装使用

Cppunit支持多平台,其实程序自身带的文档就已经非常详尽了,建议在使用前能把根目录下的INSTALL,INSTALL-WIN32.TXT,INSTALL-UNIX几个文件先过一遍,更高级的引用可以到doc目录下查找。

/Gw!q"\sP^0

 

gJ/Xe NY[0

1)总体构成51Testing软件测试网kx"OqZ

CppUnit是开源的测试工具,可以在它的安装包里直接看到它的源代码。51Testing软件测试网"iF!kU/c7\7KlN
作为一个完整的CppUnit framework,虽然源码所在的实际路径可能不尽相关,但从逻辑上讲它们被划为如下几个部分:
j K]o xDo5PYv0• core
CppUnit的核心部分

8^FC]-a&|F%x1hK0• output
:掌管结果输出

.uko0W:ZW&X0• helper
:一些辅助类

V-l6oq"@k5_0• extension
:作为单元测试的延伸,对CppUnit core部分的扩展(比如:常规测试,重复测试)

2c}l)E:~ U.a]0• listener
:监视测试进程和测试结果
51Testing软件测试网 vKj|w,^5l'X,`
• textui
:一个运行单元测试的文本环境

Qw$a;dB:ft2ki?&A0• portability
:提供针对不同平台的移植设置
51Testing软件测试网2cSV)VN2G;k*SH
上述所有的内容均被置于CppUnit名字空间之内。
51Testing软件测试网$MaT#a)]4gs4m

 

FD0hP~rs3\0

2)WINDOWS的安装以及配置

:Ptg&F},k0

At the current time, the only supported WIN32 platform is51Testing软件测试网d2O t{E0`1I(]+M

Microsoft Visual C++. You must have VC++ 6.0 at least.

.ls&s)F:{3f!N x0

Windows编译环境要求我们至少是vc++ 6.051Testing软件测试网kz6~Rt;Tk'f

Quick Steps to compile & run a sample using the GUI TestRunner:

ns o$Q&p F2R{rO0

- Open examples/examples.dsw in VC++ (contains all the samples).

T?Sl'Q2aA8b0

 VC7 will ask you if you want to convert, anwser 'yes to all'.

6A9e8SD5C C0K0

- Make HostApp the Active project51Testing软件测试网])J-qZ}9F6u/KY

- Compile51Testing软件测试网-^0{ NW#VO/j1?gz8o

- For Visual Studio 6 only:

T~M;T"YS0

  - in VC++, Tools/Customize.../Add-ins and macro files/Browse...

*UdPI"H'TxGn0

  - select the file lib/TestRunnerDSPlugIn.dll and press ok to register

}_ F+s'cb0

    the add-ins (double-click on failure = open file in VC++).

g;BB u's0

- Run the project

(oo!s7q`0

 

6J)pKp nY)m/P o0

先编译好cppunit带的库,然后把库的路径加入到项目路径中,然后才能在例子中调用这些库。51Testing软件测试网9\]@:f|+XT$r

附录2有一些cppunit自己带的文件,以及编译一些库的介绍,我们如果仔细看看它的configure文件的话,会发现它支持多平台也是在这里实现的,他会检测你运行的环境,然后相应的选择合适的工具。51Testing软件测试网q5F j3gw

 51Testing软件测试网7TRl?RtC

3) UNIX平台

Q*J6z;si.X[:@7~0

      UNIX平台下先从http://www.sourceforge.net获得安装包,解压后在CPPUNIT的目录依次操作:51Testing软件测试网 y;Ug PG

./configure     //生成Makefile文件51Testing软件测试网"w-nK[m4_,u/J

./make

J*DC(t0K-h0

./make install  //将生成的库文件复制到/user/local/lib目录下,如果没有目录的安装权限,可以指定到自己的目录下。51Testing软件测试网&J t%W1j5_YhiJ/o"i

将安装包include/cppunit 目录复制到/usr/include目录下,里面是cppunit的头文件。

d+C;t G]?0

 51Testing软件测试网yw4i's {'r/z

网上有很多资料都说make install之后要在共享动态库配置文件中将lib文件的目录加进去,但如果编译出来的是静态库文件,则可省略了。

0{(y$s7T%^$@0

 

o+D)q%s.GElb-ZD6q}0

四、实例一

 以下以一个helloworld的实例讲解CPPUNIT的使用,以下例子仅作参考,注释部分表达得不很严谨,仅作参考。51Testing软件测试网 w+K6a:q-}F

 

%V4W-K)bi!_0

#include "cppunit/Portability.h"

6G b'CU*h R u0

#include "cppunit/TestAssert.h"

6Pg7]Na8|6i\1k0

#include "cppunit/extensions/TestFactoryRegistry.h"51Testing软件测试网mSMj8ou

#include "cppunit/extensions/HelperMacros.h"

b0`/ws!Bu \(q(q%\0

#include "cppunit/TestResult.h"

y*dAX n%B7s ~[[0

#include "cppunit/TestRunner.h"

VfVSE+E.gZY5d3q0

#include "cppunit/TestResultCollector.h"51Testing软件测试网8GJ_7c/h!qJ _i

#include "cppunit/BriefTestProgressListener.h"51Testing软件测试网/]&I r?yZHI f*`W

 51Testing软件测试网vO CM v/D5I

 51Testing软件测试网s:dELU8sW1},m

class Test:public CPPUNIT_NS::TestCase   //定义测试用例51Testing软件测试网|w(ZYc~u

{51Testing软件测试网 [!Omp ?3kx \9rj

       CPPUNIT_TEST_SUITE(Test);         //创建一个suite,并将Test添加到suite51Testing软件测试网!d,Z^!PwL{T3\2v-z

       CPPUNIT_TEST(testHelloWorld);      //声明一个测试用例testHelloWorld,如果需要                                                                     增加测试用例也需要在这里声明。

AW b'Kz)Xb0

       CPPUNIT_TEST_SUITE_END();       //结束suite声明51Testing软件测试网 vV3nx&crx7\O

 51Testing软件测试网&xdT$?%Uk9X(p

       public:51Testing软件测试网R-Vp:F4w

       void setUp(void)    //CPPUNIT提供的初始化方法,将需要初始化的变量等在这里定                                               义赋值。类似于构造函数,在执行testcase之前自动调动。                                          本实例没有需要初始化的变量。

1@I6}5L!^ Ps0

       {

&`'ig `0xa-g0

       }

-}z#{q(?%We0

 51Testing软件测试网,E z3W StI

       void tearDown(void)     //CPPUNIT提供的结束testcase执行完之后自动运行的方                                                    法,如,需要清除的指针等。testcase执行完后自动调                                                         用,类似于虚构函数。本例不需要作清除工作,也可以                                                    不定义51Testing软件测试网6W_ L/d"S

       {51Testing软件测试网,G'` o*}n3J0D+U

       }

/E~Wr LS-U0

 

@*N2k2ln \s.@ Qv0

       protected:

[o'ql:M7e)yi_!d0

       void testHelloWorld(void){                 //测试用例testHelloWorld,如果需要增加测试用例,可以继                                                续添加51Testing软件测试网$Z#g'IJX PM

       printf("Hello,World!\n");

it L&`7U0

       }

.n1B2y.diT N0

};51Testing软件测试网7j:C*BV;R5_5TA

 

7`^ GB|5Mr^0

CPPUNIT_TEST_SUITE_REGISTRATION(Test);    //通过宏注册Testtest suite51Testing软件测试网4o4yp8|)R'B;CQ Yn

 51Testing软件测试网4`8B\V;v_;N

int main()

4p+S J*Z$Yqt"e0

{

V(R_'| k6kw0

CPPUNIT_NS::TestResult controller;          //保存测试结果

BM9P2^.X.r#C8q0

CPPUNIT_NS::TestResultCollector result;   //收集测试用例的执行结果,它能够区分测试用例                                                              执行结果是false或是出现了错误。51Testing软件测试网h \x%IM%{b

controller.addListener(&result);

+_hPE0onb cu4^%I0

 51Testing软件测试网9JF4`)?~U

CPPUNIT_NS::BriefTestProgressListener progress;

s2ZpzJMT0

controller.addListener(&progress);51Testing软件测试网ADy*e$w5?/yQ

 51Testing软件测试网a)[O_#pTXo

CPPUNIT_NS::TestRunner runner;     //TestRunner用于执行测试用例,它将待执行的测试                                   对象管理起来,然后供用户调用

{b M$oZr(b#NN0

runner.addTest(CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest());

Kfnv'q} ^2w{0

runner.run(controller);51Testing软件测试网TZR[h

 

@:nl.i3rT W)Gk0

return result.wasSuccessful()?0:-1;            //反回用例的执行结果,如果成功返回0失败返回-151Testing软件测试网1@G&EOEnE#W

}51Testing软件测试网 Ht.W/h"M'd6LC

 

S#}Ut b)z0

说明:

+{g v;cz5h0

1CPPUNIT_TEST_SUITE_REGISTRATION()CPPUNIT本身带有的宏,可以要下载cppunit-docs-1.10.2包,在这里可以查阅到函数,宏及包含的头文件。51Testing软件测试网K Nd{:g

 51Testing软件测试网#d(ZNM O:In&N

2 CppUnit提供了多种验证成功失败的方式:

,Ql;jQN}['`c0

CPPUNIT_ASSERT(condition)                  //确信condition为真51Testing软件测试网/v/d V7wg,Z

CPPUNIT_ASSERT_MESSAGE(message, condition)51Testing软件测试网BR2?2q$f-a-t

             //condition为假时失败,并打印message

k:|YB&UE+?"c0

CPPUNIT_FAIL(message)                        //当前测试失败,

TAG:

 

评分:0

我来说两句

日历

« 2024-04-18  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 4571
  • 日志数: 6
  • 建立时间: 2008-09-10
  • 更新时间: 2008-10-10

RSS订阅

Open Toolbar