CppUnit Cookbook中文版
上一篇 / 下一篇 2007-11-25 23:55:35 / 个人分类:测试工具
51Testing软件测试网 |D?#NLY:B8c
这是我的第一份完整的翻译文章。欢迎大家指正,联系我:zgump@sina.com0G'_&ive051Testing软件测试网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 i Q1QcPu y"br
-wNU!_#V%A1i+Z0
你该怎么办?51Testing软件测试网uK/qc9ZD
有很多种方法。使用调试器直接调试或者在你的代码里乱丢一些流输出指令是两种简单的方法,但是它们都有自己的缺点。直接调试代码是个好主意,但是它不是自动进行的。你不得不在每次改动代码以后重新调试。输出流文本也不错,但是它使代码变得面目可憎,并且大多数情况下,它输出的信息比你想要的要多。w5] k:Wc/N1|&h,s0在CppUnit中测试可以自动进行。这些测试可以很容易被建立,并且一旦你书写完毕,他们可以帮助你时刻了解你代码的质量。
J.`n] nUy]%?051Testing软件测试网;C2h%DnS@EtS为了做一个简单的测试,下面这些是你要做的:
:a%h} RUd:{00PL:P o8z"N&e0O5Bk0从TestClass中派生一个类。Override runTest()方法。当你希望检查一个值的时候,调用 CPPUNIT_ASSERT(bool),如果测试成功这个assert表达式可以被顺利通过。51Testing软件测试网6I$p*_nA!o
51Testing软件测试网^)FIb ep/H/CS"Q比如,为了测试一个复数类的等值比较,书写如下:51Testing软件测试网v!pC%|b6}%vL?
cT3j:h.xs*f0class ComplexNumberTest : public CppUnit::TestCase {
}2wqM;X%]2fthw0
MwG%pt;iF0public:
$PCi;{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
};y5JI;h]/tZ0这就是一个简单的测试。通常来说,你会有很多小的测试用例,并且希望能在同一个对象集合中测试。为了达到这个目的,使用fixture。
)Z7A6xf-q!e0a Y/o9pb:N'tX0Fixture51Testing软件测试网/z0gA!LFJK(B
9DT(U@%xFk0
一个fixture是一组对象,被用来作为测试一组用例的基础。当你边开发边测试的时候,使用fixture会非常方便。&SG8[f%Un4Asi0那我们尝试一下这种开发方式,同时学习一下fixture的使用方法。假定我们就是想开发一个复数的类,我们从定义一个名为Complex的空类开始。51Testing软件测试网j&N[mL\*\
cm&]S'm,r g p8y0class Complex{};51Testing软件测试网(]Qv5{#DK0Z
n5\3i xN#?3p*\j0现在建立上面那个ComplexNumberTest测试用例,编译它们看看会发生什么。我们注意到的第一件事是有一些编译错误。测试使用了操作符==,但是它并没有被定义。修改如下:
;B/FF;`5\:g0v%O B,]|"Z/WcA9]V6P0bool ōperator==( const Complex & a, const Complex & b )
;bI+G.h m0h6l_+Q[![J051Testing软件测试网M3IBg1A
Km/@&B$o&N(G*J0{
u |%W~+^._,e0`%A0return true;51Testing软件测试网D1l5gqL|
}现在再次编译并运行之。这次编译通过了,但是没有通过测试。我们需要再写些代码使操作符==可以正确工作,所以我们再次修改代码:
5f r p;~+\qVh,D0Z9x gG%m1L8tnD5e0class Complex {51Testing软件测试网 {1S&s#^c Ct R*v
51Testing软件测试网W|4O]]z)]z
friend bool ōperator ==(const Complex& a, const Complex& b);51Testing软件测试网 kJ2EL&I8Eo
double real, imaginary;
7t&Y}FoDw0public:
!}GH%i w9@7K0C0Complex( double r, double i = 0 )
D/@yrr6s;MG]0: real(r)51Testing软件测试网dgMbd
, imaginary(i)
rj/C3A!x5U@0{51Testing软件测试网J E8`.FWH
}
M t\Y:j0};51Testing软件测试网!w(b#d lXbool ōperator ==( const Complex &a, const Complex &b )
w"x-c$B'l0
6c"x4eZA0{51Testing软件测试网BM:i`Tw
return eq( a.real, b.real ) && eq( a.imaginary, b.imaginary );
r`w.Q!cX0}$IC$F+h9n7{y0如果我们现在编译并运行,就可以顺利通过测试。51Testing软件测试网3f)jLO@$la
"JrCa$i$@0现在我们准备添加一些新的操作符和新的测试用例。这时使用一个fixture会很方便。如果我们实例化3到4个复数并在测试中反复使用它们,可能我们的测试会更好些。
O*s:T d h ?051Testing软件测试网+gLO2a c'G_(D
1e-_/U:|8Y!cB0我们这样做:51Testing软件测试网(x4`!F,x/J%i|e.yX
* 为fixture的每个部分添加成员变量。51Testing软件测试网 YL7IT1m`b
* Override setUp() 初始化这些变量。
!l-?CR7q!Jj1ch(h0* Override tearDown()释放你在setUp()中使用的资源。class ComplexNumberTest : public CppUnit::TestFixture {51Testing软件测试网v+v#YV ag$o
K5F*Wk?#@i0
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^g4gW0}e{Z#T/e4K;Q0void tearDown()
I.y)I| Mk8a0{51Testing软件测试网XdK0SN
delete m_10_1;
"IA M6n5p8J"mJ,gDm!e0delete m_1_1;
XX)v6XO9voO0delete m_11_2;51Testing软件测试网y,| [{6DYY8s
}
$AR FMSi8y0};51Testing软件测试网v chrf+xW z3h\_2q~C#SO0一旦我们拥有了这个fixture,我们就可以添加操作符+,以及整个开发过程中其他的任何操作符。51Testing软件测试网)q&q4d'a*{^(F!|$o8U&w#Z
51Testing软件测试网3K&v9m-s(X VTest Case
z]G,t$p c051Testing软件测试网,`R[_ nF@ BS
z(f-` O)Qi5J VG0为了使用一个fixture来调用单独的测试,该如何做呢?
nb?z F K[s6`7[0分为两个步骤:
lOZ"~&l)cy8pd0*以一个method的形式,在fixture类中写一个测试用例
kUx,[P3r$saf0j4G$@0*创建TestCaller来运行那个method这里是我们加了一些额外的用例method书写的测试类:
}ui&w