单元测试的基本方法
上一篇 /
下一篇 2007-12-02 16:18:32
单元测试的对象是软件设计的最小单位——模块。单元测试的依据是详细设描述,单元测试应对模块内所有重要的控制路径设计测试用例,以便发现模块内部的错误。单元测试多采用白盒测试技术,系统内多个模块可以并行地进行测试。
WK{8F[0Y
]rj%U0
r5R'_1u#^m0单元测试任务测试爱好者v7gE)phk
;c$AwvYed0 单元测试任务包括:1 模块接口测试;2 模块局部数据结构测试;3 模块边界条件测试;4 模块中所有独立执行通路测试;5 模块的各条错误处理通路测试。测试爱好者0a4w&}#@]?y
zRO
测试爱好者%c+YN{G/A
\sx{
模块接口测试是单元测试的基础。只有在数据能正确流入、流出模块的前提下,其他测试才有意义。测试接口正确与否应该考虑下列因素:测试爱好者!T!rFzAt
测试爱好者
X#F!td T;d&vA
1 输入的实际参数与形式参数的个数是否相同;
,r7?8@&iRT0测试爱好者%V'\:g v1iz8U7V|
2 输入的实际参数与形式参数的属性是否匹配;
w6i6t f`k(jd0
_Y
|L*pS&U0 3 输入的实际参数与形式参数的量纲是否一致;
#l c4O|sRAJ0测试爱好者M
uu)PtW#Z Q
4 调用其他模块时所给实际参数的个数是否与被调模块的形参个数相同;
i1|y*^8c@7t0测试爱好者!tY7Po'd9}'h+@S'Q
5 调用其他模块时所给实际参数的属性是否与被调模块的形参属性匹配;
/q!HV zfMwc0
/w&xb? crc0 6调用其他模块时所给实际参数的量纲是否与被调模块的形参量纲一致;
WU M.u*Fn$p'e0测试爱好者t]-p1@8];VG/c5Q
7 调用预定义函数时所用参数的个数、属性和次序是否正确;测试爱好者F
i9l0lEY
8h|4a \(Om0 8 是否存在与当前入口点无关的参数引用;测试爱好者;p&V7H AnX9qyK^
9O+hT,C;U0 9 是否修改了只读型参数;
4Xib)V Rq
Z0测试爱好者Q5py+]1u
10 对全程变量的定义各模块是否一致;
U@Jv!T'X'I;NW0测试爱好者P7F.H!},n
11是否把某些约束作为参数传递。测试爱好者GjC;[!^
X'G6w
:R4H.Ovt&K;l[/G0 如果模块内包括外部输入输出,还应该考虑下列因素:
-H#j-j-`|,c-_
O0测试爱好者m%@x"D#yoP%K
H
1 文件属性是否正确;测试爱好者w_w c
Db
k&V8g
|+XQ{\Q0 2 OPEN/CLOSE语句是否正确;测试爱好者4VeQ o+BI
测试爱好者Cl2SQ
C8v
dc
3 格式说明与输入输出语句是否匹配;
Ut0BF?c;B;U/O+{0
.O[5~ cJ`-C R0 4缓冲区大小与记录长度是否匹配;
da;[z8@)A%sSAF0测试爱好者5x
IEu#M
5文件使用前是否已经打开;
O.r jhL9c(BF0
I%sGx7q E"V0 6是否处理了文件尾;测试爱好者,yR6Jmdi R
z.wSqPs9k-_.k+i0 7是否处理了输入/输出错误;
@,B-~/r4G'B
r0
5K;\w
@0W,F0 8输出信息中是否有文字性错误;测试爱好者j9z4Zd*p$J
nlp
测试爱好者;O$J ^3Dy.m z(QYh
检查局部数据结构是为了保证临时存储在模块内的数据在程序执行过程中完整、正确。局部数据结构往往是错误的根源,应仔细设计测试用例,力求发现下面几类错误:测试爱好者u_qJ#m%y
4Xi4P:Y(J1n
n0 1 不合适或不相容的类型说明;
E q`W_:B}0测试爱好者iBE2J
JP'dl+B
2变量无初值;
)X0sg'G7rW~0测试爱好者nd,W?ZE{A.h
3变量初始化或省缺值有错;测试爱好者7\1ns5y {9sq
fr no)pI
测试爱好者#m#K!{*gz%\A4@"m `c#Q
4不正确的变量名(拼错或不正确地截断); 测试爱好者P_^/E:\O_x1]!^/y
:d;wjG/^-e0 5出现上溢、下溢和地址异常。
`p,W%f5^0
*f^E&{t8mk8S!Qdl5\0 除了局部数据结构外,如果可能,单元测试时还应该查清全局数据(例如FORTRAN的公用区)对模块的影响。
t6c8~8s5P^*b0测试爱好者-{
M!i3hg)}9R1P
在模块中应对每一条独立执行路径进行测试,单元测试的基本任务是保证模块中每条语句至少执行一次。此时设计测试用例是为了发现因错误计算、不正确的比较和不适当的控制流造成的错误。此时基本路径测试和循环测试是最常用且最有效的测试技术。计算中常见的错误包括:
#~
b/[+M8\
^9t0测试爱好者8N~(\#Uz
1 误解或用错了算符优先级;
~X+j
w\D
ey'_0
|?tA h&f0 2混合类型运算;
YQ7[1E$@0
FS8x;q:K&yk0 3变量初值错;
5A"I#dn9NU
@0测试爱好者z-o;N$@^_C
4精度不够;
O)x,wE)Oj)~/tZ|)?0测试爱好者 A cN9d;]W`Q:mH
5表达式符号错。测试爱好者&Z1a&nBZxy;{
-ack%AD0Ev!^r1Y0 比较判断与控制流常常紧密相关,测试用例还应致力于发现下列错误:
B(Za#oeHh?K0测试爱好者 jF yd!^"X
1不同数据类型的对象之间进行比较;
(m5n+Es.T&_7p0测试爱好者#uwWO7w8[7VQ
^
2错误地使用逻辑运算符或优先级;测试爱好者vl,{cL[
测试爱好者IX@4M?Z]y
3因计算机表示的局限性,期望理论上相等而实际上不相等的两个量相等;测试爱好者-v[ZzBm:Y4R
(f\.}&c&RXj?0 4比较运算或变量出错;
'Kb
oKv0
E3BRc,@&Y$y0 5循环终止条件或不可能出现;测试爱好者 Nr|;p7|t:_{3R(Z
A
V*}zC1S0 6迭代发散时不能退出;
6?H#P:m1P\9\L0
-WD8J ]
r(glr,Z!@9z0 7错误地修改了循环变量。
M y6Y ]2@ `
Y8x0
y|@N$A:T4}|0 一个好的设计应能预见各种出错条件,并预设各种出错处理通路,出错处理通路同样需要认真测试,测试应着重检查下列问题:测试爱好者s3`$W5oar7w8?zh
b,P"|#YU*}0 1输出的出错信息难以理解;
m:T [5G(r0测试爱好者`$H tXq%P
2记录的错误与实际遇到的错误不相符;测试爱好者6e
q7qN#[ pL
测试爱好者.i9sT0x8AFtz
3在程序自定义的出错处理段运行之前,系统已介入;测试爱好者Bo;n
jPq
2~(P^%~v p0 4异常处理不当;
m5n#zw7z? B
Ze0测试爱好者6}!_q$Z,M
5错误陈述中未能提供足够的定位出错信息。
K
d2pE,Q]9P
R#gT0
W5x^w V y(Kerln(?0 边界条件测试是单元测试中最后,也是最重要的一项任务。众的周知,软件经常在边界上失效,采用边界值分析技术,针对边界值及其左、右设计测试用例,很有可能发现新的错误。测试爱好者 ZuA2J"p4[6t
测试爱好者I x;f VyM
单元测试过程
?VJ|z0测试爱好者d-a3Oj2a(tX
一般认为单元测试应紧接在编码之后,当源程序编制完成并通过复审和编译检查,便可开始单元测试。测试用例的设计应与复审工作相结合,根据设计信息选取测试数据,将增大发现上述各类错误的可能性。在确定测试用例的同时,应给出期望结果。测试爱好者No-iwmyr:B Cb
9DjFp,\4d%N/I0 应为测试模块开发一个驱动模块(driver)和(或)若干个桩模块(stub),下图显示了一般单元测试的环境。驱动模块在大多数场合称为“主程序”,它接收测试数据并将这些数据传递到被测试模块,被测试模块被调用后,“主程序”打印“进入-退出”消息。
pLwI2p0测试爱好者#^,[f8DsrkXB
驱动模块和桩模块是测试使用的软件,而不是软件产品的组成部分,但它需要一定的开发费用。若驱动和桩模块比较简单,实际开销相对低些。遗憾的是,仅用简单的驱动模块和桩模块不能完成某些模块的测试任务,这些模块的单元测试只能采用下面讨论的综合测试方法。测试爱好者2S8p2bW1Hx7{.U
-Z(TE^:X~$x}0 提高模块的内聚度可简化单元测试,如果每个模块只能完成一个,所需测试用例数目将显著减少,模块中的错误也更容易发现。
导入论坛
引用链接
收藏
分享给好友
推荐到圈子
管理
举报
TAG: