【2007】知识是需要沉淀的; 思想是在不断学习,磨练中成熟的; 技术是在创新中开拓的…………… 【2007】不经历风雨,怎能见彩虹,没有人能随随便便成功。加油!

单元测试

上一篇 / 下一篇  2006-12-10 18:11:14 / 个人分类:软件测试理论

1.1.       单元测试概念

单元测试是对软件基本组成单元进行的测试,这里的基本单元不一定指一个具体的函数(FunctionProdure)或一个类的方法(Method)。

u9` VwHv]$@-Hr0

单元测试步骤如下:51Testing软件测试网rx+D$ck(mj r[S.B

① 计划单元测试:确定测试需求,制定测试策略,确定测试所用资源(包括人力资源和设备资源),创建测试任务的时间表等。51Testing软件测试网Q9h,NG f2xX@ Ez

② 设计单元测试:设计单元测试模型,制定测试方案,确认并结构化测试过程。

HaXaG l0p4e0

③ 实现单元测试:参考测试模型和测试方案,制定具体的测试用例,创建可重用的测试脚本。

#y*a:zi7g;wTp(V dEAY0

④ 执行单元测试:根据单元测试的方案、用例对单元进行测试,验证测试的结果并记录测试过程中出现的缺陷。

YQ/x)Vnu0

⑤ 评估单元测试:对单元测试的结果进行评估。主要从需求覆盖和代码覆盖的角度进行测试完备性的评估。51Testing软件测试网Of2{,M4I\ w

1.2.       单元测试设计

单元测试设计主要包括单元测试模型的设计和测试项目的设计。51Testing软件测试网&v R,O9s8o;yl;p$N

1.2.1.  单元测试模型的设计

因为单元本身不是一个独立的程序,一个完整的、可运行的软件系统并没有形成,所以在测试模型设计中必须为每一个单元测试开发驱动模块和桩模块。在绝大多数应用程序中,驱动模块只是一个接收测试数据并把数据传给要测试的模块,然后打印相关结果的“主程序”。“桩模块”作用是替代那些隶属于本模块(被调用)的模块。桩模块要使用子模块的接口,做少量的数据操作,并验证打印入口处的信息,然后返回。51Testing软件测试网O Pi}5~6J1|Q6}0\%w

驱动模块和状模块都是额外的开销,就是说两者都是必须开发,但有不能和最终软件一起提交的软件。构造单元测试模型的主要工作有:

Y lWyd0

① 构造最小运行调度系统,及驱动模块,用于模拟被测模块的上一级模块;

$l,T"dHQ0

② 模拟实现单元接口,即单元函数需调用的其他函数接口,即桩模块;

J0XW"j'lP0

③ 模拟生成测试数据或状态,为单元运行准备动态环境。51Testing软件测试网TT+j}N#]+yS

1.2.2.  测试项目的设计

测试项目是测试用例的一个总则,主要是根据测试需求设计测试点,不包含具体实现的用例。在测试项目的设计中,主要从功能覆盖和代码覆盖两个角度进行考虑;51Testing软件测试网qm&_4v Fk

功能覆盖属黑盒的范畴,用来指出测试用例是否已经覆盖了程序应该提供的功能。逻辑覆盖率是考核单元测试质量的一个关键指标。51Testing软件测试网-i!w)`7r'~JV

代码覆盖也称逻辑覆盖,包括语句覆盖、分支覆盖、路径覆盖,是一种常用的白盒测试方法;

4l'p'P!npx/V6RO0

在单元测试方案中要明确对所测单元的覆盖率要求,并注明得到被测单元覆盖率的方法。建议覆盖率指标:核心代码覆盖率达到100%,共享资源库的代码覆盖率达到100%,非核心代码覆盖率达到90%

6Iy;Sb3m{(O s0

(测试覆盖率?)51Testing软件测试网`1N'u.G/]/q*b @]h

1.2.3.  单元测试用例设计方法

① 规范导出法

'O"n|7{*?+H*v_ _0

规范导出的测试是根据相关的规范描述来设计测试用例的。每一个测试用例用来测试一个或多个规范陈述语句。一个比较实际的方法,是根据陈述规范所用语句的顺序来相应的为被测单元设计测试用例。例如,考虑一个计算平方根的规范:

[Pk-y6i#t"G:e?/w!J0

输入:实数51Testing软件测试网5y&J(`4L rKq:C

输出:实数

(}*_2C4m*X0

规范:当输入一个0或比0大的数,返回其正的平方根;当输入一个小于0的数时,显示错误信息“平方根非法”,返回0;库函数Print_Line可以输出错误信息。

V9i2k6I"d0

这个规范可以用以下两个测试用例来对应:

S hta!a0

测试用例1:输入4,输出251Testing软件测试网3NUf;ig U#Wd

测试用例2:输入-1,输出0

-NW3F9x[0

② 等价类划分51Testing软件测试网PV#B?TA

等价类划分是一种正式的测试用例设计方法,它基于对被测试单元的输入、输出所做的划分,对每一个划分中的所有输入、被测单元有等价的行为。划分也可以根据软件所能存取的数据确定,包括时间、输入输出顺序、状态。51Testing软件测试网"O FQ/K)N

上边的例子,输入可以有两个划分,输出可以有两个划分。

_U%~8y;~m4cW0

输入:(i<0 ; (ii) >= 051Testing软件测试网"ao4X0^ M3U u"A

输出:(a) >= 0 ;  (b) Error

w/y6A+T8_.Z4r0

这四个划分可以用两个测试用例实现:51Testing软件测试网7l iN f&Hjb"C8T

测试用例1:输入4,输出251Testing软件测试网|R r)Yg4@$|0i @+v!DW

测试用例2:输入-1,输出0

fg-c_%\7Y r(],d J0

③ 边界值分析法

t,|m-`8D Ei0

④ 状态转移测试法51Testing软件测试网4]P"K%n(\SG#u*f

⑤ 分支测试法51Testing软件测试网}$q4S+[ M\F

⑥ 条件测试法51Testing软件测试网 T G)_ a&f [2K6r8z

⑦ 数据定义法——使用测试法(数据流测试法)51Testing软件测试网$@0PV O xm`q

⑧ 内部边界值测试法51Testing软件测试网4nSD.C J1Z

⑨ 错误猜测法51Testing软件测试网+zhF1ixI

 

6S3Sr3w-F$\\0

1.3.       单元测试的执行

1.3.1.  测试的结论

测试的结论与执行被测试的单元中模拟目标环境下的程序执行精确性相关。为保证在估计这些特征时所有的环境因素均被考虑,必须小心。例如,所以的隐性输入必须被考虑(如系统时间,文件状态,单元加载地点),还有实际环境的代表物(即相同的编译器,加载者,操作系统,计算机,输入分布)也是测试环境必须考虑的。51Testing软件测试网^q1t/N_~\

1.3.2.  自动测试

自动测试大大提高工作效率。便于回归测试。一般来说自动测试有两种方式:一种是使用商业化的测试工具;另一种是自行开发一些工具来进行。

&s$T+f8w6S0

1.4.       单元测试的评估

单元测试完成后,需要对单元测试执行的效果进行评估,主要从以下几方面进行:51Testing软件测试网`,}7z?s6K)B

① 测试完备性评估,主要检查测试过程中是否已经执行了所有的测试用例,对新增的测试用例是否已及时更新测试方案等。51Testing软件测试网wB#az&U FC

② 代码覆盖率评估。主要根据代码覆盖率工具提供的语句覆盖情况报告,检查是否达到方案中的要求。51Testing软件测试网9E%V'?wi_R[ W&EZB

1.4.1.  单元测试

① 单元测试的四个过程:51Testing软件测试网+G@4oeh+G

v       检查编码是否遵循软件编程规范和标准;51Testing软件测试网4~,Y'|n-i/C

v       自动或手工分析程序;51Testing软件测试网c-Sl'U;z$m/@#K1Q

v       设计测试用例并运行测试用例;

Ht t:a+ty/FJ,gM0

v       错误跟踪分析51Testing软件测试网;M TQ4k5A Gxn

② 测试应该覆盖:

]5FKYc3Mh |R0

v       功能覆盖;

$u7m+U mC0

v       输入域覆盖;

(g$K9E6y$SB0

v       输出域覆盖;51Testing软件测试网+d6~Mt(p!g%V

v       函数交互覆盖;51Testing软件测试网 _n#APn

v       代码执行覆盖。51Testing软件测试网4m9w2~]yD6Eae*q#ra

③ 按针对性,单元测试应该有以下特性:51Testing软件测试网0V;I C wkE7s~HJ+|Q

v       声明测试:检查模块中所有变量是否被声明;

8^-R1m1k|&^q aP:q0

v       路径测试:要求模块中所有可能的路径都被执行一遍,属于逻辑覆盖测试;51Testing软件测试网p+~ z aJLep

v       循环测试:重点检查循环的条件-判断部分以及边界条件;

? W/^]$fMS4d9[0

v       循环测试应该包括测试下面每一个条件的测试用例:

.S:F*bm ~,j0

a.         循环不执行;

&|Hc/x!nBM0

b.        执行一次循环;

i"h3j`_._*S0

c.         执行两次循环;51Testing软件测试网6N[1u&j3h1Yx

d.        反映执行典型的循环的执行次数;

mrA8\*v9pF$~0

e.         如果有最大循环次数,最大循环次数减1

_ I N3@(Q&J%G5G0

f.          最大循环次数;

O+hP6})x uZ$E0

g.        大于最大循环次数。

$z7TG UIc'k*O0

④ 循环嵌套;

O I;fBd*|0

⑤ 边界值测试;

[hMMT@aUWE+LX0

⑥ 接口测试:检查模块的数据流(输入、输出)是否正确。检查输入的参数和声明的自变量的个数,数据类型和输入顺序是否一致。检查全局变量是否被正确的定义和使用;51Testing软件测试网 i(M/v"Nr8t$HPQ0l`F

⑦ 确认测试:是否接受有效输入数据(操作),拒绝无效数据(操作);51Testing软件测试网P(}BM6BR^8uy

⑧ 事物测试:输入--->输出,错误处理。测试用例设计时,对输入变量的定义域进行划分。51Testing软件测试网1n?V _cs8yq

1.4.2.  测试模块

结构化程序的测试原则是每个测试模块由单个功能组成。基于如下考虑:51Testing软件测试网}S qXG+c)v&m3N7gA

① 可重用性:模块不应该被设计成包含多个功能,这样做主要是模块化的要求。如果模块包含多个功能,它就不太可能被重复使用,因为不太可能有那么多同样的情况来使用这些功能。如果一个模块集中为一个功能,它就有可能被许多模块调用;

4sFH/Ozy0

② 复杂性:多个功能的模块容易变的复杂,复杂的模块代码容易混乱;

T4@`lD~(]0

③ 可维护性:模块需要被修改时,复杂模块要比简单模块难以维护。

#vNHnF1p0

1.5.       单元测试中的白盒测试设计

1.5.1.  一个程序模块的例子

该程序模块有四条不同的路径、四个可执行语句。

o+x| g7|UHQH ^ x0

L1a>c>e)简化为:ace   L2 (a>b>d)简化为:abd 

;PU4A.F-lV@%WU0

L3 (a>b>e)简化为:abe    L4 (a>c>d)简化为:acd

C QN+]k7{U0

(a>1)(b=0)51Testing软件测试网,}"p[lT_

X=X/A51Testing软件测试网x/f5p"B0yluz

(a>1)(b=0)

b:eOK H+Fn8{0

 

M6^ Lh#j0

X=X+151Testing软件测试网$M6_'l;R$@O+dV

          

JxZPc8kS.u0

四条路径应该满足的逻辑表达式分别为:

)n0th6_F'}e.k/g6P0

M={(a>1)(b=0)}N={(a>1)(b=0)}51Testing软件测试网#{L-Rz.PW.Q

L1a>c>e=M and N   <

相关阅读:

TAG: 单元测试 测试理论

嫣紫 引用 删除 嫣紫   /   2015-03-31 16:03:20
5
luckyitstar 引用 删除 luckyitstar   /   2013-05-06 13:12:16
5
qingffg的个人空间 引用 删除 qingffg   /   2013-04-12 13:21:16
我是想评5分的,唉,点错了
qingffg的个人空间 引用 删除 qingffg   /   2013-04-12 13:16:43
1
vnity的个人空间 引用 删除 vnity   /   2013-02-27 09:59:41
3
引用 删除 512011grace   /   2011-12-07 10:56:14
5
引用 删除 h363456974   /   2011-11-16 16:47:11
5
引用 删除 liangliang.j   /   2011-07-22 12:52:39
5
Amanda 引用 删除 wangyiman2010   /   2011-04-15 08:27:21
5
芙蓉 引用 删除 彭芙蓉   /   2010-11-30 15:14:09
1
浑然天成 引用 删除 linda22   /   2010-07-12 16:39:15
正好做参考,不错!
浑然天成 引用 删除 linda22   /   2010-07-12 16:38:46
1
 

评分:0

我来说两句

Open Toolbar