5MILY: 黑体">.其它测试方法
(3)人工测试与自动测试:顾名思义,人工测试是采用人工的手段对软件实施的测试,它是相对自动测试而言的。和静态测试不同,人工测试贯穿于软件生存期的各个阶段,并通过人工运行和审查会的形式对软件实施的测试。人工测试中,主要是测试人员根据一些成熟的软件设计规则对软件的正确性等进行审查,检验所进行的设计是否能满足需要。实践表明,人工测试是非常有效但往往被忽略。统计表明,人工测试能发现30%~70%的错误,IBM公司的代码审查会的查错率更高,竟能查出全部错误的80%。软件测试还有其它更多的测试方法,在后面的几章中将有详细的叙述。
1.8 软件测试步骤
图1.7给出了软件的生存期和软件测试之间的关系。也可以用图1.8来描述,即软件测试的V模型。软件测试是要分步进行的,为什么呢?打一个比方,对一个1000行的程序搜索一个错误和10个100行的程序搜索一个错误其代价是不一样的。从软件测试的角度来看,分步测试的原因有三个:一是和上述例子类似,即把大问题划成小问题,这更有利于问题的求解。二是软件则不同的层次上,其错误的类型是不一样的,其测试的侧重点和测试方法是不同的。其三是在级别高的层次上检测低级层次上的错误其花费要大幅度的增长,图有人做过统计,在下面的给出的四个测试层次上,即单元测试、集成测试、确认测试和系统测试,层次每增加一
(1)单元测试:单元测试是对软件中的基本组成单位进行测试,如一个模块、一个过程、一个函数或一个类,等等。单元测试是软件测试最基本的组成部分,也是最重要的部分之一。其目的是检验软件基本组成单位的正确性。一个软件单元的正确性是相对该单元的规约而言的,因此,单元测试是以被测单位的规约为基准。单元测试要注意如下的问题:
1)单元的大小要适宜。一般是以程序中给出的模块为准,但有时一个模块可能太大,有时也可能太少,这二者都会对单元测试的效果产生不利的影响。一般来讲,一个单元模块在几十行到几百行源代码为宜。
2)单元测试一般要给出驱动模块和桩模块。一般来讲,一个单元是不能独立运行的,因此,要设计一些模块,使之能驱动被测模块的执行,这种模块称之为驱动模块。另外,一个被测模块还可能调用其它的模块,而在测试一个单元时,一般是不考虑其它模块的测试的,因此设计一类模块称之为桩模块,用于模拟运行被测模块时调用的其它模块。
(2)集成测试:集成测试是在软件系统集成过程中所进行的测试,其主要目的是检查软件单位之间接口的正确性。它根据集成测试计划,一边将模块或其它软件单位组合成越来越大的系统,一边运行该系统,以分析所组成的系统是否正确,各组成部分是否合拍。集成测试的策略主要有自顶向下和自底向上两种。
1)自顶向下的集成测试策略从软件的主控模块入手,将其直接调用的模块首先与其集成。并将该子系统所调用的过程和所使用的数据用一些简单的代码——即桩模块代替,在桩模块的帮助下,可以运行并测试这一子系统,直至测试结果满足要求为止。然后,将这一子系统所调用的模块与该子系统集成,并重复上述过程,直到测试完毕。
2)自底向上的集成测试策略则相反,从软件中不调用任何其它单元的模块入手,把直接调用该模块的程序与其集成在一起,在驱动模块的帮助下,完成该子系统的测试。然后,再把调用该子系统的模块和该子系统集成,并重复上述过程,直到测试完毕。
这两种方法各有优缺点,在实践中,可将两种方法相结合。
(3)系统测试:系统测试是对已经集成好的软件系统进行彻底的测试,以检验软件系统的正确性和性能(如运算的精度、系统的反应时间)等是否满足其规约所指定的要求。系统测试在许多情况下是比较复杂的,仅仅编制一个测试程序是不够的,往往伴随着要建立一个软硬结合的测试系统。
(4)验收测试:验收测试旨在向软件的购买者展示该软件系统满足其用户的要求。它的测试数据通常是系统测试数据的子集。所不同的是,验收测试常常需要用户的代表在场,甚至在软件安装的现场。这是投入使用前的最后测试。
(5)回归测试:回归测试是在软件维护阶段,对软件修改之后进行的测试。其目的是检验对软件进行的修改是否正确。这里,修改的正确性有两重含义:一是指所作的修改达到了预期的目的,如错误得到改正,能够适应新的运行环境。二是指不影响软件的其它功能的正确性。
1.9 软件测试与软件可靠性
从理论上看,软件的可靠性只和存在于软件中的故障有关。假设软件S中有n个故障f1,f2,…,fn,直观上,软件S的可靠性R可以表示为RS= RS(f1,f2,…,fn)。假设D是S的定义域,f(D)是D中每个点取值的概率,{D,f(D)}是S的运行剖面,在{D,f(D)}下,假设每个故障被检测的概率为qi=P(fi),这里,所谓的检测概率是指一次性检测该故障的概率,或者说,一次运行产生错误的概率。若S中存在n个故障,则:
定理1:若n个故障f1,f2,…,fn是相互独立的,则:
实际上l即是在存在n个故障的前提下,软件S的风险函数。
根据软件可靠性理论,软件S初始的故障数目可以假设为一个常数n。随着测试的进行,存在于软件S的故障不断的被排除(假设是完全排除,即不引入新的故障),存在于软件中的故障会越来越少。由于每排除一个故障后,剩余的存在于S中故障集合是排除前存在于S中故障集合的子集,因此不难证明:
定理2:设F1和F2是软件S两个故障集合,若F
可以看出,随着测试的进行,故障被检测并被排除,软件的风险函数越来越少,其可靠性会越来越高。因此,软件测试是发现软件故障,提高软件可靠性的重要手段。
【例1.1】 假设软件中有5个错误,每个错误被检测的概率分别为:q1=10-6,q2=10-7,q3=10-8,q4=10-9,q5=10-10,时间单位是秒。假设错误的检测与排除是按照从检测概率大的到检测概率小的依次进行,因此,其对应的风险函数和平均无故障时间分别为:
(1) 初始状态:l1=1.11´10-6,MTBF=31.25(天)(每天按8小时计算)
(2) 排除第一个故障后:l2=1.11´10-7,MTBF=312.5(天)
(3) 排除第二个故障后:l3=1.11´10-8,MTBF=3128.1(天)
(4) 排除第三个故障后:l4=1.11´10-9,MTBF=31565.7(天)
(5) 排除第四个故障后:l5=10-10,MTBF=347222.2(天)
1.10 影响软件测试效率的因素
同其它任何一个产品相比,软件的测试是更为复杂的,这主要是因为到目前为止,人们对软件的错误发生的规律认识的还不是很清楚,软件测试也缺少有效的工具。影响软件测试的效率的因素是很多的,除了测试方法之外,主要因素还有人为因素、软件类型、错误类型、测试充分度等。下面对这些因素进行一些分析。
1.人为因素
在软件测试缺少自动化程度高的测试工具的前提下,软件测试的许多工作是由人来完成的。因此,人的因素是影响测试效率的重要方面。Basili和Selby的实验数据清楚地揭示出了人为因素的作用。表1.3揭示了不同水平层次的测试人员在发现软件错误的数量和测试效率的差异。这里,阶段1、2和3分别对应单元测试、集成测试和系统测试。
表1.3 人为因素对测试效率的影响
|
|
测试者水平层次 | |||||
阶段 |
初级 |
中级 |
高级 | ||||
|
平均值 |
标准差 |
平均值 |
标准差 |
平均值 |
标准差 | |
发现错误的个数 |
1 |
3.88 |
1.89 |
4.07 |
1.69 |
|
|
2 |
3.04 |
2.07 |
3.83 |
1.64 |
|
| |
3 |
3.90 |
1.83 |
4.18 |
1.99 |
5.00 |
1.53 | |
发现错误的效率 |
1 |
1.36 |
0.97 |
2.22 |
1.66 |
|
|
2 |
1.00 |
0.85 |
0.96 |
0.74 |
|
| |
3 |
2.14 |
2.48 |
2.53 |
2.48 |
2.36 |
1.61 |
2.软件类型
软件类型也是影响测试效率的一个重要因素,表1.4是Basili和Selby的实验数据。P1~P4代表了4个不同的程序。
表1.4 软件类型对测试效率的影响
|
|
程 序 | |||||||
阶段 |
P1 |
P2 |
P3 |
P4 | |||||
|
平均值 |
标准差 |
平均值 |
标准差 |
平均值 |
标准差 |
平均值 |
标准差 | |
发现错误的个数 |
1 |
4.07 |
1.62 |
3.48 |
1.45 |
4.28 |
2.25 |
|
|
2 |
3.23 |
2.20 |
3.31 |
1.97 |
|
|
3.31 |
1.84 | |
3 |
4.19 |
1.73 |
|
|
5.22 |
1.75 |
3.41 |
1.66 | |
发现错误的效率 |
1 |
1.60 |
1.39 |
1.19 |
0.83 |
2.09 |
1.42 |
|
|
2 |
0.98 |
0.67 |
0.71 |
0.71 |
|
|
1.05 |
1.04 | |
3 |
2.15 |
1.10 |
|
|
3.70 |
3.26 |
1.14 |
0.79 |
文章来源于领测软件测试网 https://www.ltesting.net/