CppUnit Cookbook中文版

上一篇 / 下一篇  2007-11-25 23:55:35 / 个人分类:测试工具

2003-6-30  伟网动力
51Testing软件测试网;y;T'lB U(z!Os

51Testing软件测试网|D?#N LY:B8c
这是我的第一份完整的翻译文章。欢迎大家指正,联系我:zgump@sina.com

0G'_&i ve051Testing软件测试网t@o8S.i2Hf

51Testing软件测试网0IM|b'j,pu

***************************************************************************51Testing软件测试网'GMN3k1k v)Kx)x

7L{7ONf3E0
~*]#q/t[Pb0本文是一篇简单的入门指导,帮助你快速上手。51Testing软件测试网y8g2r*{ lBJ^,p@ E9d(}

#] x1RU-lpE0简单测试用例(Simple Test Case)51Testing软件测试网_,f]&_0AaN

A3z @w#E4x{$jB0你希望知道你的代码是否正在工作51Testing软件测试网 H iQ1QcPu y"br
你该怎么办?51Testing软件测试网uK/qc9ZD
有很多种方法。使用调试器直接调试或者在你的代码里乱丢一些流输出指令是两种简单的方法,但是它们都有自己的缺点。直接调试代码是个好主意,但是它不是自动进行的。你不得不在每次改动代码以后重新调试。输出流文本也不错,但是它使代码变得面目可憎,并且大多数情况下,它输出的信息比你想要的要多。

-wNU!_#V%A1i+Z0

w5] k:Wc/N1|&h,s0CppUnit中测试可以自动进行。这些测试可以很容易被建立,并且一旦你书写完毕,他们可以帮助你时刻了解你代码的质量。

J.`n] nUy]%?051Testing软件测试网;C2h%DnS@ EtS

为了做一个简单的测试,下面这些是你要做的:

:a%h} RUd:{0

0PL:Po8z"N&e0O5Bk0从TestClass中派生一个类。Override runTest()方法。当你希望检查一个值的时候,调用 CPPUNIT_ASSERT(bool),如果测试成功这个assert表达式可以被顺利通过。51Testing软件测试网6I$p*_nA!o

51Testing软件测试网^)FIbep/H/CS"Q

比如,为了测试一个复数类的等值比较,书写如下:51Testing软件测试网 v!pC%|b6}%vL?

cT3j:h.xs*f0class ComplexNumberTest : public CppUnit::TestCase {
Mw G%pt;iF0public:
$PC i;{RI_ gq0ComplexNumberTest( std::string name ) : CppUnit::TestCase( name ) {}51Testing软件测试网moI q9UA)jVz4C`
51Testing软件测试网.y#Z L4A8LP.R#H:c
void runTest() {
{p4c(v,|$b!f;t)\0CPPUNIT_ASSERT( Complex (10, 1) == Complex (10, 1) );
m-FRf3G*x`0U0CPPUNIT_ASSERT( !(Complex (1, 1) == Complex (2, 2)) );
#R,F&_l}'~ H9k!J0}51Testing软件测试网qm f1t3F mQ s
};

}2wqM;X%]2fthw0

y5JI;h]/tZ0这就是一个简单的测试。通常来说,你会有很多小的测试用例,并且希望能在同一个对象集合中测试。为了达到这个目的,使用fixture。

)Z7A6xf-q!e0

aY/o9pb:N't X0Fixture51Testing软件测试网/z0gA!LFJK(B
一个fixture是一组对象,被用来作为测试一组用例的基础。当你边开发边测试的时候,使用fixture会非常方便。

9DT(U@%xFk0

&SG8[f%Un4Asi0那我们尝试一下这种开发方式,同时学习一下fixture的使用方法。假定我们就是想开发一个复数的类,我们从定义一个名为Complex的空类开始。51Testing软件测试网j&N[mL\*\

cm&]S'm,r gp8y0class Complex{};51Testing软件测试网(]Q v5{#DK0Z

n5\3i xN#?3p*\j0现在建立上面那个ComplexNumberTest测试用例,编译它们看看会发生什么。我们注意到的第一件事是有一些编译错误。测试使用了操作符==,但是它并没有被定义。修改如下:

;B/FF;`5\:g0

v%O B,]|"Z/WcA9]V6P0bool ōperator==( const Complex & a, const Complex & b )
Km/@&B$o&N(G*J0{
u|%W~+^._,e0`%A0return true;51Testing软件测试网D1l5gqL|
}

;bI+G.h m0h6l_+Q[![J051Testing软件测试网M3IB g1A

现在再次编译并运行之。这次编译通过了,但是没有通过测试。我们需要再写些代码使操作符==可以正确工作,所以我们再次修改代码:

5f r p;~+\qVh,D0

Z9xgG%m1L8tnD5e0class Complex {51Testing软件测试网 {1S&s#^c Ct R*v
friend bool ōperator ==(const Complex& a, const Complex& b);51Testing软件测试网 kJ2EL&I8Eo
double real, imaginary;
7t&Y}FoD w0public:
!}GH%i w9@7K0C0Complex( double r, double i = 0 )
D/@yr r6s;MG]0: real(r)51Testing软件测试网dgMbd
, imaginary(i)
rj/C3A!x5U@0{51Testing软件测试网J E8`.FWH
}
M t\Y:j0};51Testing软件测试网!w(b#d lX

51Testing软件测试网W|4O]]z)]z

bool ōperator ==( const Complex &a, const Complex &b )
6c"x4eZA0{51Testing软件测试网BM:i`Tw
return eq( a.real, b.real ) && eq( a.imaginary, b.imaginary );
r`w.Q!cX0}

w"x-c$B'l0

$IC$F+h9n7{y0如果我们现在编译并运行,就可以顺利通过测试。51Testing软件测试网3f)jLO @$la

"JrCa$i$@0现在我们准备添加一些新的操作符和新的测试用例。这时使用一个fixture会很方便。如果我们实例化3到4个复数并在测试中反复使用它们,可能我们的测试会更好些。
1e-_/U:|8Y!cB0我们这样做:51Testing软件测试网(x4`!F,x/J%i|e.yX
* 为fixture的每个部分添加成员变量。51Testing软件测试网 YL7IT1m`b
* Override setUp() 初始化这些变量。
!l-?C R7q!Jj1ch(h0* Override tearDown()释放你在setUp()中使用的资源。

O*s:T dh ?051Testing软件测试网+gLO2ac'G _(D

class ComplexNumberTest : public CppUnit::TestFixture {51Testing软件测试网v+v#YVag$o
private:
TF `tUa&} d0gM0Complex *m_10_1, *m_1_1, *m_11_2;
@+U:F-sG0protected:
0|m7{ R:t5| Z0void setUp()51Testing软件测试网"~(b#N8KT%m
{51Testing软件测试网p%e^zl4lk/rB
m_10_1 = new Complex( 10, 1 );51Testing软件测试网Q\JjZ
m_1_1 = new Complex( 1, 1 );
0O-o0tK4E%I*Kd0m_11_2 = new Complex( 11, 2 );
&i^g4g W0}

K5F*Wk?#@i0

e{Z#T/e4K;Q0void tearDown()
I.y)I| Mk8a0{51Testing软件测试网Xd K0SN
delete m_10_1;
"IA M6n5p8J"mJ,gDm!e0delete m_1_1;
XX)v6XO9voO0delete m_11_2;51Testing软件测试网y,|[ {6DYY8s
}
$AR FM Si8y0};51Testing软件测试网v chrf+x W z3h\

_2q~C#SO0一旦我们拥有了这个fixture,我们就可以添加操作符+,以及整个开发过程中其他的任何操作符。51Testing软件测试网)q&q4d'a*{^(F!|$o8U&w#Z

51Testing软件测试网3K&v9m-s(XV

Test Case
z(f-` O)Qi5J VG0为了使用一个fixture来调用单独的测试,该如何做呢?
n b?z F K[s6`7[0分为两个步骤:
lOZ"~&l)cy8pd0*以一个method的形式,在fixture类中写一个测试用例
kUx,[P3r$saf0j4G$@0*创建TestCaller来运行那个method

z]G,t$p c051Testing软件测试网,`R[_ nF@ BS

这里是我们加了一些额外的用例method书写的测试类:
}ui&wV]0private:51Testing软件测试网 nE/S [6Do's%]#s
Complex *m_10_1, *m_1_1, *m_11_2;51Testing软件测试网]A%yYE%p H"_!H [
protected:51Testing软件测试网!M6so#Wo2E
void setUp()
f+K FS Hl4r0{
4^ R \-~ S0m_10_1 = new Complex( 10, 1 );51Testing软件测试网 J|t%A\z&_
m_1_1 = new Complex( 1, 1 );51Testing软件测试网re0o:| KS
m_11_2 = new Complex( 11, 2 );
jBMWT0}

~;I'B0g~-IGa051Testing软件测试网l4fPJdUf$Ep*f C

void tearDown()
:{r:L}z&n l,vX0{51Testing软件测试网.r&[/{)? Jdw{Z b
delete m_10_1;51Testing软件测试网6U~ `5]%{
delete m_1_1;51Testing软件测试网|.T/@+T7M.yR
delete m_11_2;51Testing软件测试网b)\!oOI
}

I#Lw5S4x9KS+L4Lfd&W051Testing软件测试网7LpR Z _T6M

void testEquality()51Testing软件测试网@)P(}HzgEbE
{51Testing软件测试网2{,g @n.my'f/V4q[1L
CPPUNIT_ASSERT( *m_10_1 == *m_10_1 );
4lQpR#h"mb'X Fe vX0CPPUNIT_ASSERT( !(*m_10_1 == *m_11_2) );51Testing软件测试网"Xi.h Fx5iG9{
}

fOYRs`#x%t7V%p051Testing软件测试网a.E:?N c,[o%H.T

void testAddition()51Testing软件测试网?^+CxEb[6Hw$A8a
{51Testing软件测试网9q4J:_+GY:o
CPPUNIT_ASSERT( *m_10_1 + *m_1_1 == *m_11_2 );51Testing软件测试网 L,?v)D'V'zK Q
}51Testing软件测试网X*L7} OFtP} E
};51Testing软件测试网.u}9_o9H:|1RBl

51Testing软件测试网"H5PLliA

我们可以象下面这样为每个测试用例创建并运行一个实例:
e0Mb:E w#N1S0CppUnit::TestCaller<ComplexNumberTest> test( "testEquality",51Testing软件测试网z:]|8W/[?
&ComplexNumberTest::testEquality );
IPaU#v3E0CppUnit::TestResult result;
M;B$N"c2S0test.run( &result );

G.[]LB*D*u*CF;~:K051Testing软件测试网mPJ.ZMr P+vh

TestCaller的构造函数的第二个参数是ComplexNumberTest中对应method的地址。当这个TestCaller运行的时候,指定的method会运行。但是,这个办法也效果不彰,因为它不显示诊断信息。我们可以使用TestRunner(下面会讲到)来显示这个诊断信息。

#Qx1J{ GFQ0

z6H$gol%B+aB|C S3g0一旦我们有了几个测试用例,可以把它们归入一个suite中。

a:ZIh9G5L e\s0

"Y C ? a,B0Suite51Testing软件测试网SddR%P7{7C,e
为了建立多个用例并且让它们一次全部运行,你该如何做呢?51Testing软件测试网0R^,Q"`l&g W!~
CppUnit提供了一个TestSuite类来同时运行任意个用例。51Testing软件测试网 n8C T"~o O9J:a$@
在上面我们看到了如何运行一个测试用例。51Testing软件测试网jJNA _-ijw\e#w
为了创建含有两个或更多用例的suite,你应该这么办:
O'Tv y hU.y4rj3eo%~0CppUnit::TestSuite suite;
2i~4R~i;@6T0CppUnit::TestResult result;51Testing软件测试网$ms"P/I&C$Ok&Q
suite.addTest( new CppUnit::TestCaller<ComplexNumberTest>(51Testing软件测试网sqE+e7d3Y [TID| F Fj
"testEquality",51Testing软件测试网Mp P#}b$X7|7Zh"_"c
&ComplexNumberTest::testEquality ) );
Y Z(YV$r `T yR\-T0suite.addTest( new CppUnit::TestCaller<ComplexNumberTest>(
wY%K^p'D.\K r.G0"testAddition",51Testing软件测试网8{ u#|3{r ]Z f ^
&ComplexNumberTest::testAddition ) );51Testing软件测试网8F:z~pL/O
suite.run( &result );51Testing软件测试网Q \hc ZA `(xB;B

51Testing软件测试网Ca7F/{%x'~#J^M*o X

TestSuites不必仅仅含有测试用例的caller.它们可以包含实现Test 接口的任意对象。例如:你可以在你的代码中创建一个TestSuite,我也可以在我的代码里建立一个,我们通过建立一个同时包含它们两个的TestSuite使它们得以同时运行。
8E"wX]E:f0CppUnit::TestSuite suite;
8Gzzvk S8ZC'y0CppUnit::TestResult result;
5t0?]$H5q(X&|0suite.addTest( ComplexNumberTest::suite() );51Testing软件测试网+d8a$]c `iz
suite.addTest( SurrealNumberTest::suite() );51Testing软件测试网'm)Iu;A ]d
suite.run( &result );51Testing软件测试网j)m K#@ OP

o.v5JvW+cLbFX0TestRunner51Testing软件测试网t[`5]u(@
你该如何运行你的用例并收集测试结果呢?51Testing软件测试网[Sb7DpHZ}jz

1{R5e\i#Q H0一旦你有了一个TestSuite, 你会想运行它。CppUnit提供了定义这些suite并显示结果的工具。你可以通过在一个TestSuite中加入一个名为suite的静态的method使你的suite与TestRunner建立联系。

WR wq7sFJ'Rv051Testing软件测试网 j,o1IuJ

例如,为了使TestRunner可以看到一个ComplexNumberTest suite,在ComplexNumberTest中加入一下代码:
OF&[V,Zy0public:51Testing软件测试网R(P1~ugr'v
static CppUnit::Test *suite()
0v*n+l)Th-GJpT0{51Testing软件测试网Yfl~@5\L[:?
CppUnit::TestSuite *suiteOfTests = new CppUnit::TestSuite( "ComplexNumberTest" );51Testing软件测试网:tkD.^9w.x&D
suiteOfTests->addTest( new CppUnit::TestCaller<ComplexNumberTest>(51Testing软件测试网k9Iez`E
"testEquality",51Testing软件测试网t"]x Tx5W
&ComplexNumberTest::testEquality ) );51Testing软件测试网*kgY0Y"|~
suiteOfTests->addTest( new CppUnit::TestCaller<ComplexNumberTest>(51Testing软件测试网^u8v dqSjIf
"testAddition",
l&bq7Ot9_mj0&ComplexNumberTest::testAddition ) );
S&K7@ {@&PPW0return suiteOfTests;
p[J*}Pu a{~lN$J&H V0}

Bv*L+q-ttwF+D0

[-Da lv9}V O#U+dlw0为了使用这个版本,在Main.cpp中包含以下头文件:51Testing软件测试网a| q+@ `6S&I:W
#include <cppunit/ui/text/TestRunner.h>
&ncM{4nc0#include "ExampleTestCase.h"51Testing软件测试网#}1@^Hy%k#M
#include "ComplexNumberTest.h"

n9F+}2vm+s)VL0

/N me0b1EI hV ~,`0然后在main()中加入addTest(CppUnit::Test *)的调用:51Testing软件测试网;NAQ&z jR.]8Y
int main( int argc, char **argv)
't1Xt}YYQbS0{
;goH;KB*MkN0CppUnit::TextUi::TestRunner runner;51Testing软件测试网uj9CvZ'y]
runner.addTest( ExampleTestCase::suite() );51Testing软件测试网e){|R1}J7g S,x
runner.addTest( ComplexNumberTest::suite() );51Testing软件测试网2z4`t]}%_I
runner.run();
[8ji"b%V:f+qP9K/_0return 0;
c%|(OY i%X0}

(]Au{6fhG O(b%|r&[U8t051Testing软件测试网\g+d4_P0S dP

TestRunner会运行这些用例。如果所有的测试都顺利通过,你会得到一个反馈。如果任何一个测试没有通过,你会得到以下信息:
kDH[vL0*失败的测试用例的名字
8XWh){Z0*包含这个测试源文件的名字51Testing软件测试网W[ d.B!a5|
*错误发生的行号
Sh:Sn1V9LO-{$Z(uV0*发现错误的CPPUNIT_ASSERT()调用中的所有文字。

6cw7b*d R3J7a051Testing软件测试网3rH w H}?

Helper Macros51Testing软件测试网)~3N:qh Dv(udzK+C
你可能已经注意到了,实现fixture中的static suite()是一个要反复要做的,并且容易出错的任务。我们可以使用一组写 test fixture的宏来自动执行这些静态的suite method.51Testing软件测试网q*ySw+h1ozV]

51Testing软件测试网iTM"f"iT

下面是使用这些宏重写了类ComplexNumberTest后的代码:
Fi9N| J!E*_7d8R/~0#include <cppunit/extensions/HelperMacros.h>

.d.V.O]u1k0

O2@%y9ma5A+J0class ComplexNumberTest : public CppUnit::TestFixture {

?*e)w [2U2AA0

'vt`|~l [ i0首先我们声明这个suite,把这个类的名字传递给宏:51Testing软件测试网Qlo1D U{wcyi
CPPUNIT_TEST_SUITE( ComplexNumberTest );

,u uHb4m;T#`|0

#T;hd CBCNJ0这个使用静态的suite() method建立的suite以类的名字来命名。然后,我们为每个测试用例声明:
'R"[[6CMO~0CPPUNIT_TEST( testEquality );51Testing软件测试网k3P,@o1H]]'A
CPPUNIT_TEST( testAddition );51Testing软件测试网!F2n'|^D4UsC/E

51Testing软件测试网:o/s5pl8Ls@m

最后,我们结束这个suite声明:51Testing软件测试网.t+t+I ei y F
CPPUNIT_TEST_SUITE_END();

N ` @ s-pb HN%u0

-?3b6j6F[0在这里下面这个method已经被实现了:51Testing软件测试网|4Qv ^(C7l9S b0D
static CppUnit::TestSuite *suite();

"\V'iB-n&]IB051Testing软件测试网3evr3l%OzS9SM

剩下的fixture保持不动:51Testing软件测试网 s1| UG tJ,Ck(QL4E B
private:
.M*d"`6u)WJ4a!z%^P2U4n0Complex *m_10_1, *m_1_1, *m_11_2;
n0If I6_k0protected:51Testing软件测试网!X@-R4K?"G/M5r
void setUp()51Testing软件测试网Q/|;nDD.?)J?m+z2@I
{
)A%a9t LqN,Y.}F(G"_0m_10_1 = new Complex( 10, 1 );
nL%?$P A+W;?I}6s.S0m_1_1 = new Complex( 1, 1 );51Testing软件测试网&`IkHCs;B:^
m_11_2 = new Complex( 11, 2 );
3DuN{/rM0}51Testing软件测试网o O_ _.?^0Ql

+ZrB6a]0void tearDown()51Testing软件测试网 Z;C)dek-h
{51Testing软件测试网O5A+r Qw T)Q#?#r k V
delete m_10_1;
J r?/n@0delete m_1_1;51Testing软件测试网kU)me"^
delete m_11_2;51Testing软件测试网czs{9e}6tS5A!p
}51Testing软件测试网I%PI(x1YM,T/p+y

g)U4s{k?1vU5du0void testEquality()51Testing软件测试网'`"^N8Sk-^
{
a3@b0xU,f/a0CPPUNIT_ASSERT( *m_10_1 == *m_10_1 );51Testing软件测试网*S:\@5c%U IDb{c
CPPUNIT_ASSERT( !(*m_10_1 == *m_11_2) );
:U9o9g2|P0}

3zM-v RRNi ej0

%?9u w;N"I9^ b0void testAddition()
bj1sL!n}-T0{51Testing软件测试网:NrWP(`
CPPUNIT_ASSERT( *m_10_1 + *m_1_1 == *m_11_2 );
:oZ~.K:i8A0}
{*^ m D:wj1IC0};

3u IdD*@4Nu051Testing软件测试网'@ i1DOp;F

加入这个suite的TestCaller的名字是这个fixture名字和method名字的组合。51Testing软件测试网M)c3[|3{/SD
对目前这个用例来说,名字会是"ComplexNumberTest.testEquality" 和"ComplexNumberTest.testAddition".

E~:dU n!E H0

4})h c `5k0helper macros帮你写些常用的断言。例如。检查当一个数被零除的时候ComplexNumber是否会抛出MathException异常:
8K R R3De'hSk0*把这个测试用例加入使用CPPUNIT_TEST_EXCEPTION的suite中,指定希望的异常的类型。
gZE x5Oe0*写这个测试用例的method

\(n ?~ Y;DwP051Testing软件测试网_"Z.X+M4|7F%LFH&sq

CPPUNIT_TEST_SUITE( ComplexNumberTest );
;J N j?D G9[g0// [...]51Testing软件测试网&x{Whk|(qt
CPPUNIT_TEST_EXCEPTION( testDivideByZeroThrows, MathException );51Testing软件测试网z&i Op#\LWZ
CPPUNIT_TEST_SUITE_END();51Testing软件测试网-Ow0Q2IbK8X,N

2Ro h~ZN1TC5QU0// [...]51Testing软件测试网f8C` vv&}

/Ia/\9O6G c5R0void testDivideByZeroThrows()
a(C]ql0{51Testing软件测试网g ]1I{&E3]8T
// The following line should throw a MathException.
} ~tx'X5q5a:K\0*m_10_1 / ComplexNumber(0);51Testing软件测试网 `.JN!U Q%G[(~c{z
}51Testing软件测试网"xyty/n

F'@wjQ qY QX0如果期望的异常没有被抛出,这个断言就会失败。51Testing软件测试网:yhk6C5wGx

51Testing软件测试网3_ |.H.g#pJ

TestFactoryRegistry

l0v9D$q$h }!Y P4W%d3Y0

p.EA8}pN[0TestFactoryRegistry是用来解决以下两个缺陷的:
W$tW`i N0*忘了把你的fixture suite加入test runner(因为它在另外一个文件中,很容易忘)
pHn$K"OD.~6X'i0*因为加入所有测试用例头文件造成的编译瓶颈。51Testing软件测试网zQ4zY$V/oW

HA(?-\Y2zk0TestFactoryRegistry是在初始化的时候注册suite的地方。

;{,B&Q#t a5Q\051Testing软件测试网sf Ia@

为了注册ComplexNumber suite,在.cpp中加入:
Eht-M8J*S1V0#include <cppunit/extensions/HelperMacros.h>51Testing软件测试网@4o'p/Ff w'ZKu

;A D+p X Zpq0CPPUNIT_TEST_SUITE_REGISTRATION( ComplexNumber );51Testing软件测试网5U"|f2[@k

;I@8ra/@q.EP+t&z)v0事实上,桌面下的动作是,一个静态的AutoRegisterSuite类型变量被声明。在构建的时候,它会注册一个TestSuiteFactory到TestFactoryRegistry。 TestSuiteFactory返回ComplexNumber::suite()返回的TestSuite。51Testing软件测试网&Kv:?d/]E`Y

51Testing软件测试网s;\7wP(v._S

为了运行这些用例,使用文字的test runner,我们不必包含fixture了:
SpyzX*{6C0#include <cppunit/extensions/TestFactoryRegistry.h>
{+D%lt-p#]0#include <cppunit/ui/text/TestRunner.h>

pZkxy:Y0

|9@ ['jfMs B%[8]0int main( int argc, char **argv)
'{_uDu"r7h,t0{51Testing软件测试网 zENNK7Q'JN_N
CppUnit::TextUi::TestRunner runner;51Testing软件测试网*T1S2Vc{%V9?H6}2G

51Testing软件测试网deI)G M4stkl

首先我们得到TestFactoryRegistry的实例:51Testing软件测试网;[ Bb4R)ym%{1Zd
CppUnit::TestFactoryRegistry ®istry = CppUnit::TestFactoryRegistry::getRegistry();51Testing软件测试网0b [5wnNFd/v
然后我们获得并添加一个由TestFactoryRegistry产生的新的TestSuite,它包含了使用CPPUNIT_TEST_SUITE_REGISTRATION()注册的所有的test suite.
S8M;K%|xf0runner.addTest( registry.makeTest() );
?mh8e"lO(r0runner.run();
}g3q fr'F:S0return 0;51Testing软件测试网 U&l!S1e1q*y
}

a:g3Hs&hq8w051Testing软件测试网AC AzO~0cS

Post-build check
*@)zZ n,ca0好了,现在我们已经可以使测试运行了,那么把它集成到编译过程中去怎么样?
YC(T8lB,w%V0为了达到这个目的,应用程序必须返回一个非0值表明出现了错误。51Testing软件测试网EI*B;kh:g?r$?
TestRunner::run()返回一个布尔值来表明run()是否成功。51Testing软件测试网D?;rg_ E
更新一下我们的main函数,我们得到:51Testing软件测试网3y l?#T a!Z | T#Qz
#include <cppunit/extensions/TestFactoryRegistry.h>51Testing软件测试网d^%moss/`
#include <cppunit/ui/text/TestRunner.h>

r~)hL!OI,b0

5UVxz;[5B Z0int main( int argc, char **argv)51Testing软件测试网)\0R FPM5`hE^
{
T+e2T Xb0CppUnit::TextUi::TestRunner runner;51Testing软件测试网{6fk6N2dW(r
CppUnit::TestFactoryRegistry ®istry = CppUnit::TestFactoryRegistry::getRegistry();
Q}j2Ru3D3_ga0runner.addTest( registry.makeTest() );
Y)Z$X4H(m E&Ek:l0bool wasSucessful = runner.run( "", false );51Testing软件测试网p t2puv'Py
return wasSucessful;
l6B9O+NH`OJ-j0}

X#s9N:pi)G0

2HKr,N)CFF0现在,你需要编译后运行你的应用程序。51Testing软件测试网/`V,W5p2xT
使用 Visual C++的话,可以在Project Settings/Post-Build step中加入下面的命令。它被扩展到应用程序的执行路径。使用这个技术的时候看看project examples/cppunittest/CppUnitTestMain.dsp 中是如何设置的。

Qu8M"nQ+L0M0

b:fDV"Ie`;X0Original version by Michael Feathers. Doxygen conversion and update by Baptiste Lepilleur.51Testing软件测试网V hD ?r
51Testing软件测试网 v)F0P9L&R0L
51Testing软件测试网9C5hD H t6e2h2_)`

原作者:tonny51Testing软件测试网ZM4oWl"t;SQ-J$Y
来 源:转载

_.p ?O"rP1K4h8q0

TAG: CppUnit 测试工具

 

评分:0

我来说两句

Open Toolbar