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

CPPUNIT实例

上一篇 / 下一篇  2008-10-10 17:22:03

一、实例

在《CPPUNIT基本原理》中举了一个简单的例子,在这个实例的基础上,另外写了一个稍微复杂的例子用作cppunit测试51Testing软件测试网3cy?V)P

这个实例包含一个Write2File cpp,一个Write2File h文件,功能是实现从一个文件复制内容到另一个文件。具体实现如下:

LA-V+cV5C)RP4B'c0

Write2File.cpp的代码:51Testing软件测试网h3f|Y-z

#include "Write2File.h"51Testing软件测试网s\/['L"wom4|?4~

 

D3[!C8X tK j7j0

Write2File::Write2File()

(z0[&I U2jO0

{51Testing软件测试网5UA5Z)@ ZMY:j

}

;WQI0}#~0

 51Testing软件测试网9tBD'y)N

Write2File::~Write2File()

s|l1eq0

{

&Pf^diE8J%d n0

}51Testing软件测试网4H'M qn~LJf(D%y

int Write2File::Process()       //主过程51Testing软件测试网SD_*J{T

{51Testing软件测试网QW$Q)S d7j[,I

       ReadCfgFile( );51Testing软件测试网4{L"D"fS H R

       if( ReadFileSrc() )

;| pkX5K"z&?0

       {51Testing软件测试网5U2a.kI1G.vY

       return -1;51Testing软件测试网_\0e-j9lL*B

       }

0FUt K0Ve0

       if( WriteFileOut() )51Testing软件测试网.ha A B c!HL1a e#e

       {51Testing软件测试网3NMQ5B ~6C

       return -1;51Testing软件测试网SY%GA1m:S"{

       }

,_B"z"h._0V0

       return 0;

lD nt.MU7U0

}51Testing软件测试网C$v2^6d/x }W@

 51Testing软件测试网%tC kK ]IB

int Write2File::ReadCfgFile()        //这个函数本来是想实现从配置文件中获取输出目录和输出目录的,后来简化了这段代码,直接将路径赋值给变量了。51Testing软件测试网Yz.m o[(E5v W

{51Testing软件测试网q$K.W6H T3WQ0b2~

       strcpy( SrcPath , m_srcp );

7bD'PW4Z0

       strcpy( OutPath , m_outp );

,C3R-ul){y.W.f0

       51Testing软件测试网V6w&CFl+[ Xz

       return 0;51Testing软件测试网GO0~ I3_"T-T ^

}

vA,sA*n6z CX_0

int Write2File::ReadFileSrc()        //读取源文件的内容51Testing软件测试网^Q4tO*_F

{

0Q+W3D)f w[&{0

       FILE *fp = NULL;

!p!f#Zg!wf0

       memset( SrcFilename , 0 ,sizeof( SrcFilename ) );

/Yt'@1m T[t!R0

       sprintf( SrcFilename , "%s/test_src.txt" , SrcPath );

s crhiQ4_"@0

       if( ( fp = fopen( SrcFilename , "r" ) ) == NULL )51Testing软件测试网Q#l)G"U5D b\?

       {51Testing软件测试网)~{'EZC2~

       printf( "Open srcfile error :%s\n" , SrcFilename );

nx+O ^C r0[r9@E0

       return -1;     

mN^C#Whg0

       }

L"i8Z j7a*Y,@0

       fnum = stat(SrcFilename,&statbuf);

;S0_ nh(Q-u0

       if( fnum < 0 )  51Testing软件测试网Iu#E1pg

       {  51Testing软件测试网d.L0Rv}

       printf("there  need  size  of  file\n");  

D6d] A9?i0

       }51Testing软件测试网5xh/`JJr4q\t

       51Testing软件测试网H\ dT b5zw(c

       fnum = statbuf.st_size;       //源文件的大小51Testing软件测试网+~)H-Z7`^&Bi$W

       fread( m_Buf , statbuf.st_size, 1 , fp );51Testing软件测试网D0dN:v;z)ob[

       fclose( fp );

L&x%b0Lk2ntJZ0

       return 0;

&A(AE1J"Pb[0

 51Testing软件测试网9KoH%C+[k1K z

}

+YqD)ew0

 51Testing软件测试网"`p N1W$kc3fAa

int Write2File::WriteFileOut()        //将读取的内容输入到输出文件

1b`'R7S W0

{51Testing软件测试网:cA:t*O!@8P.F'D

       FILE *fp = NULL;51Testing软件测试网-i4O'G^UZc

       memset( OutFilename , 0 , sizeof(OutFilename ) );

)@#EM7{$[1RX0

       sprintf( OutFilename , "%s/test_out.txt", OutPath );51Testing软件测试网-dRp+keH

       if( access(OutFilename , F_OK) == 0 ) unlink( OutFilename );51Testing软件测试网t,m3m B |@&P

       if( ( fp = fopen(OutFilename , "a+") ) == NULL )

F!{%|awym0

       {51Testing软件测试网#Fo'AZ h!K;^

       printf("Read file %s error!\n",OutFilename );

7Y5Am%mLV0

       return -1;51Testing软件测试网$KS0~"ZIMc w.w@3f

       }51Testing软件测试网 s cWir0H)K-~*EW

       fwrite( m_Buf , statbuf.st_size , 1 , fp );

7ooA y1KN7D$V0

       fclose( fp );51Testing软件测试网4xt k3y:M,i

       return 0;51Testing软件测试网GrHH?;G @

}

Rf9h m$uRT0

 51Testing软件测试网pI c&Df^0T*r t

int main(int argc , const char **argv)         

`b!rR4TF0

{51Testing软件测试网-_E?5[#j zt1{

       Write2File writefile;

Ud%v6a6{d(TWs0

       if( argc!=3 )

/C!r%F+Y7ZM;r'YW"s0

       {

0k!l8[.h)Z)ThE3v0

               printf( "ERROR,Example: Write2File srcpath outpath \n" );51Testing软件测试网)}+z4H/UG _%B

               return -1;51Testing软件测试网jG#Qi z o9k,a

       }51Testing软件测试网T*mi;`z,W6WWt

       m_argc = argc;

z_W+?)p)uH0

       strcpy( m_srcp , argv[1] );

;d g2C v\O fq0

       strcpy( m_outp , argv[2] );51Testing软件测试网};G W)kSF.b&c@

       //m_srcp = argv;

2OLIi5W:y o]K]&d0

       writefile.Process();51Testing软件测试网fw/n D-h8`&rpi

       return 0;51Testing软件测试网sAu]$v:@

}51Testing软件测试网N}QA'q1?

 51Testing软件测试网HJ7k0`2P0X8AZ

Write2File.h的代码:51Testing软件测试网6te R}\9Hi

#include <stdlib.h>51Testing软件测试网p&F/e:b*}c?'y

#include <math.h>

w IOH"j\g0

#include <iostream.h>

+y4[P-L?M{4L#ut%~t0

#include <unistd.h>

G~2}-G9T:M)_0

#include <sys/stat.h>51Testing软件测试网I4X]zm3LI*]

#include <sstream>51Testing软件测试网'pJ,s!H8A DpV3q g

 

$P:n y V,Zl}4U0

class Write2File51Testing软件测试网IRel8AmQ

{51Testing软件测试网 [E*c5p&akOK1un(v

public:

)x;LI}b"Z0

       Write2File();

T xNmb K{)cM0

       ~Write2File();

0Q? Z+jo0

public:

}6gxqt0

       char m_Buf[m_BufSize];51Testing软件测试网N g ? c4\2f8d)a&r%U

//protected:

`4YVR HA c R*r0

       int ReadCfgFile();

:ZdO Bx5A0

       int Process();51Testing软件测试网q0rm-~ca:Md#x3Q

       int ReadFileSrc();

}$Q&]eY@0_0

       int WriteFileOut();

iQgvGLu1l0

 51Testing软件测试网r |UJ)?*t1}*o wr#c

       char SrcPath[256];51Testing软件测试网:k@PV(Gz"Y1r:u

       char OutPath[256];51Testing软件测试网k6Eg@c;n2x

       char SrcFilename[256];51Testing软件测试网PkFhoG

       char OutFilename[256];51Testing软件测试网no/P2P*qi_

       char Logfile[256];51Testing软件测试网"wsm{6B8K

       char Logfilepath[256];

iX,?Fj D l0

       char Logfilename[256];51Testing软件测试网B AT5f,`

       struct  stat  statbuf; 51Testing软件测试网t;h4U5}+[O2E

       int fnum;

*P;\L+A f4b,c0

};51Testing软件测试网-qZL e o? ler)F

       int m_argc;

r{&`.Y1N0

       char m_srcp[256];

@!@G1} {0I(^0

       char m_outp[256];

:z&] V%qh!S/N v0

 

Ah!o*Lz5n _(js0

cppunit的写的测试代码如下,其中包含main.cpp, testw2file.cpp, testw2file.h51Testing软件测试网pCcxdU

main.cpp的代码如下:——基本上,这个main.cpp不需要修改了,即使增加了测试用例也不需要修改这部分代码。

3?#~I/b4eX:Y [0

#include "testw2file.h"51Testing软件测试网k ]+YGH

 51Testing软件测试网 g!\ UQL(Y$N

int main( )

m4m5U#bH'hz n0

{

K5r8sM*R2ZrS0

//CPPUNIT_TEST_SUITE_REGISTRATION(Test);

)Z/J:ZTi8D9n h0

 51Testing软件测试网 xgL{$Mrf2y.D@

CPPUNIT_NS::TestResult controller;

DE E ?Z}0

CPPUNIT_NS::TestResultCollector result;

n8G]eT0C_!gQ0

controller.addListener(&result);

$M{B |O]0

 

#`"L'h|];j9A0

CPPUNIT_NS::BriefTestProgressListener progress;51Testing软件测试网k{/D-N9d&CzL

controller.addListener(&progress);51Testing软件测试网j5y;I)w0R{r

 

k-lo |4r8zV:e0

CPPUNIT_NS::TestRunner runner;

Dj nZH1q5f)^ ]0

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

[ mWA4L6fUU0

runner.run(controller);

cUg!@A2_0

return result.wasSuccessful()?0:-1;

j8k/s[un0

}51Testing软件测试网,x E?9kqRG

 

"|$O!Si*[0

testw2file.h的代码如下:51Testing软件测试网*PM+Z4a8A,nM;q$}

#include "cppunit/Portability.h"51Testing软件测试网?x X?G WnN.]0L

#include "cppunit/TestAssert.h"

,t0T#n a9N$`e_ I?0

#include "cppunit/extensions/TestFactoryRegistry.h"51Testing软件测试网-Y Y~ \;H

#include "cppunit/extensions/HelperMacros.h"

TE,P#r$p"Y}^c;m![F0

#include "cppunit/TestResult.h"

[9qU6P,X2e!z:s0

#include "cppunit/TestRunner.h"51Testing软件测试网 Z+GO-])r]

#include "cppunit/TestResultCollector.h"51Testing软件测试网/h*qw)Y$yg\'E

#include "cppunit/BriefTestProgressListener.h"

T1se|0Y#GNAVW8I0

#include "Logger.h"

7j2k#r;MT&r!O0

#include "/cxcs04/_hl/study/cppunit/testw2file/src/Write2File.cpp"          //头文件把源代码文件包含进来,无须把被测试的源代码复制过来。51Testing软件测试网"? ] qP _Yw [

 

8g} ]~? N2YHJ0

class W2File_Test:public CPPUNIT_NS::TestCase51Testing软件测试网v b*s/]6[Or%b

{

`{2N]rGI0

       CPPUNIT_TEST_SUITE(W2File_Test);

U/s N}u*o{0

       CPPUNIT_TEST(testw2file);

F-m[UCKQ6N0

       CPPUNIT_TEST_SUITE_END();51Testing软件测试网iY-D8M/a$O b{|

 51Testing软件测试网"k%{7k j)Y Xu_/G

       public:51Testing软件测试网b,vpM v5fTx"J

       void setUp(void);51Testing软件测试网7npS? C'|

       void tearDown(void);

$q'YfX/Xz%X0

       char SrcPath[256];51Testing软件测试网] ^!t(p3Uo

 51Testing软件测试网;Y&U-vk~ PH H*VQ

       protected:

;[ _tm XJ0

       int t_argc ;

~/MP#r4e0

       const char *t_argv[3]; 

:T x'miq ^MkXQ0

       void testw2file(void);

4H7oa a4PEpV0

       int f_num;

b5X NO"yC ohU i0

       struct  stat  statbuf;       

f'K7t.Sj4E,r8kx ^0

 51Testing软件测试网,Ab^\m!};[&}

};

L"V$|9a3Q/n.B:\t,^0

 

"Q8P w.qB`IG+s0

CPPUNIT_TEST_SUITE_REGISTRATION(W2File_Test);

6r^s&uzD2`o0

 51Testing软件测试网vt'Jy7m

testw2file.cpp代码如下:51Testing软件测试网9a.~2V5pQ!f{$cZ

#include "testw2file.h"

/x0p Jq I5^%w9n{l0

 

[ Y'P3S/J.{0

void W2File_Test::setUp(void)

"r6Q ?FXj3dj@0

{51Testing软件测试网 @W-X`.M+{*d

       t_argc = 3;

'M!F;h.H(qS @_:n;Z0

       t_argv[0]="1";

8V"M4U"c.p8J&U6hd'`@0

       t_argv[1]="/cxcs04/_hl/study/cppunit/testw2file/src";51Testing软件测试网 k#OW9~@5?oZ\

       t_argv[2]="/cxcs04/_hl/study/cppunit/testw2file/src";

r/E#P9xf)FK G PE!F4t0

}51Testing软件测试网y6H3eN1l"e(~5T S_T

 

!Q)O7cGm/v(`}(l g0

void W2File_Test::tearDown(void)

&j3c/EpUN!cP0

{

N!x%[G;k0

       51Testing软件测试网'p0F*} D?1cE

}   51Testing软件测试网a-s%j+l:Z#w

 51Testing软件测试网:v5D:p+vw'u

void W2File_Test::testw2file(void)51Testing软件测试网@%P,v#J3Q:N

{

6Rg8z;TO!B F0

       int i;

N uz;I'A#?6Z0

       FILE *fp_out=NULL;

/q _EC*Q0

       Write2File W2file;51Testing软件测试网x&~ g\a3V I:Pe `H

       char t_outfile[256];51Testing软件测试网Ar$?QjwB

       sprintf( t_outfile , "%s/test_out.txt" , t_argv[1] );51Testing软件测试网EJ2M"M J8Tgs

       W2file.ReadCfgFile(t_argc , t_argv );

+L*`7]1v9ML(Y5?0

 51Testing软件测试网Eo} d ~j

       fp_out = fopen(t_outfile , "r");51Testing软件测试网X6XV;w6QNMe

       stat( t_outfile , &statbuf );

?Z:y,i9B%H0

       f_num = statbuf.st_size;//测试代码获取输出文件的真实大小

.[Dt:p&|;XS`-k+hs ]0

       printf( "outfile size =%d , srcfile size =%d\n" , f_num , W2file.fnum );    //将代码中获取的输出文件的真实大小和源代码中源文件的大小作对比(即预期值)

{Y5O7xI%D&e0

       CPPUNIT_ASSERT( f_num == W2file.fnum );  //判断两个值的大小,如果一致这个用例就是成功的。51Testing软件测试网$}|,_/B:?5RX.[

 51Testing软件测试网%I!qBYti`

}

K7H!NV3LO#@0

 

?i5q uZ|N3y#}0

如果是在unix环境下,可以写makefile文件完成程序的编译,在此顺便把我的makefile文件也贴出来:

]~%XIX? [kL!Y0

CPP =g++ -g51Testing软件测试网T/w5J;V7I3a%Re

INCL     = -I/mylib/include               

RMiY7Re*B9e$}&_0

LIBS   =-L/mylib/lib -lcppunit51Testing软件测试网/} ?T(Os

SYSLIB   = -ldl

IO!zPMSui~pa0

PROGRAMS = testw2file

RRJ`7oFx0

OBJS   =main.o testw2file.o51Testing软件测试网1S6\RTwg@9s

testw2file:${OBJS}

u8Z @3y_ v)G!h M%Q3o:U%`0

   $(CPP) $(CPPFLAG) -o $@ ${OBJS} $(LIBS) ${SYSLIB} ${INCL}

8[zj!K&p)r\\0

clean:

wb!c0@c.\!u,_0

   rm *.o testw2file51Testing软件测试网hE_4\ `b:v^2y9fA

二、总结

      在网上有不少CPPUNIT的资料,不知道最初的出处在哪里,有一些看了也不是特别清楚要怎么去使用cppunit,实例也不一定就能真正运行起来(当然这份资料也是借鉴了很多网上同行的资料)。为了让入门者更容易上手,在这里班门弄匠地总结一下自己接触CPPUNIT的心得,上面也附了一两个实例,仅是互相学习的意思。

X!B`Q*w \0

      1 CPPUNIT其实是相当于一个框架,我们设计好了测试的方法、预期值后,将源代码放到这个框架中去执行,以检查源代码的输出是否跟预期值是相符的。51Testing软件测试网,S(n#cg0XZ4^

      2不需要将源代码贴到测试代码中去,一般建议保持源代码和测试代码的独立性51Testing软件测试网 LYtE1v a}

      3对于预期值需要根据源代码的实际情况去设置,比如如果我要判断一个复制文件的函数执行是否成功,可能先要在测试代码中实现获取复制文件的大小,再将这个大小和源文件进行对比,如果一致,说明这个函数执行是成功的。因此,如何判断某个函数的执行是否成功,这个预期值应该取什么值以及要如何获得这个预期值,都是需要思考的,而且在测试代码中的实现有可能也会比较复杂。不过只要一次实现后,以后的修改就比较小了。51Testing软件测试网*h*NI*K G%Q%\

      4对于有桩函数或者是驱动函数的函数,需要在测试代码中实现先将被测源代码中实现桩函数或驱动函数的功能。比如被测函数需要用到一个变量,则需要在测试代码中先给这个变量赋值,或者是被测函数需要桩函数先实现某个功能或达到某个条件,则需要在测试代码中先将这个前提条件满足。

+d!K` ~|l(e0

      5如果涉及数据库的代码,建议是不要用CPPUNIT来实现,其实直接用功能测试来检查结果会更快捷.

"P5f3M7^E0

 

'Y&y5Y?M-`3~1t-hU0

__原创文章,欢迎探讨

:r!\ } On.A9^Q B0

TAG:

引用 删除 xiaoler   /   2010-08-23 16:24:53
CppUnit提供一个单元测试测试框架,基本能满足单元测试的需求,但仍然存在一些弊端,建议看看C++test专业测试博客上面的一些论述:www.mytestlife.com
孙为礼的测试Blog 引用 删除 swlcom   /   2010-05-05 18:13:41
谢谢楼主共享
孙为礼的测试Blog 引用 删除 swlcom   /   2010-05-05 18:13:13
5
小宝 引用 删除 ken867   /   2008-11-25 10:34:30
CPPUNIT,测试框架,挺好用的一个工具,相对于其他的测试工具来说似乎相对比较复杂,楼主写得很好,对不知道怎么做的测试开发工程师是一个很好的提高
learning_test 引用 删除 define_NULL   /   2008-10-30 11:45:27
楼主写得不错。不过我有几点疑问!
1。 首先我觉得在测试Process(0之前,没有对ReadFileSrc() 和WriteFile Src()做测试,这样子。可行吗?万一出错在这中间,怎么定位!
2. 看你写的测试,直接是改掉了被测类属性域属性,那样的话,测试都应该按照那样去改?
3. 对于面向对象的单元测试,确实很迷糊,如有的函数没有参数,直接对类属性的修改,这个该怎么测?(只是针对这个修改API而言)
 

评分:0

我来说两句

日历

« 2023-10-09  
1234567
891011121314
15161718192021
22232425262728
293031    

数据统计

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

RSS订阅

Open Toolbar