第七章_软件测试
本章介绍了软件测试的有关概念、方法及测试步骤。对本章提到的概念一定要理解记忆清楚,方法需要领会和记忆,设计测试用例的设计应该达到应用层次。本章是重点章。
一、软件测试的目的(识记)
软件测试的目的是为了发现错误。因此
1、软件测试就是为了发现错误而执行程序的过程。
2、一个好的测试是发现了至今尚未发现的错误测试。
3、一个成功的测试是发现了至今尚未发现错误的测试。
二、软件测试方法(识记和领会)
软件测试方法一般分为两大类:动态测试方法和静态测试方法。
静态测试是指被测程序不在机器上运行,而是采用人工检测和计算机辅助静态分析的手段对程序进行检测。
动态测试是指通过运行程序发现错误。一般意义的测试多指动态测试。
动态测试分为黑盒法和白盒法两种。
黑盒法,是指测试人员完全不考虑程序的内部结构和处理过程,只在软件接口处进行测试,依据需求规格说明书,检查程序是否满足功能要求。
举个例子,一头猪就我们的测试对象,输入它能吃的东东,输出它的猪肉和猪粪(有的情况下,输入其他内容可以输出小猪猪)。并且它能自动拒绝吃不能吃的东东(如石头之类),并且不会直接输出金元宝之类的东东。那么这个猪是健康的,正常的。我们的测试不去理会猪的内部有什么花花肠子,怎么把食物变成肉的。这就是黑盒测试法。
白盒法,是指测试人员须了解程序内部结构和处理过程,以检查处理过程的细节为基础,对程序中尽可能多的逻辑路径进行测试,检验内部控制结构和数据结构是否有错,实际的运行状态与预期的状态是否一致。
这就好象是给猪做B超啦,CT啦,胸透啦什么的,把它里面的花花肠子看个透,并且还要看看吃进去的东东都经过哪里,怎么出来的,通过这些检测来确定它每个脏器的功能是否正常,处理食物的状态是否和理论上的一致或者发现它肚子里长了个瘤。
呵呵,这种比较太粗鄙了,也不完全像。反正就是这样,一个是只看输入和输出,另一个是看里面的细节。但是两种测试法都不可能对程序进行穷举测试。
三、测试用例的设计(简单应用)
首先来了解白盒技术
白盒测试是结构测试,所以被测对象基本上是源程序,以程序内部逻辑为基础设计测试用例。
使用白盒技术,要尽可能覆盖最多的路径,当程序内部存在判定时,就要考虑逻辑覆盖。
(1)语句覆盖:就是要设计足够多的测试用例(也就是输入的数据),使被测程序中每个语句至少执行一次。在这里,重点在于每个语句即每个语句都要被执行过。设计时要记住这一点。
(2)判定覆盖:指设计足够的测试用例,使得程序中每个判定表达式至少获得一次"真"值和"假"值,从而使程序的每一个分支至少都通过一次,因此判定覆盖又称为"分支覆盖"。它和语句覆盖有什么不同呢?
就在于判定,语句覆盖不管是真是假,只要执行过这句就成,而判定覆盖则必须让这个语句的执行结构为真和为假都要有测试用例给出。所以判定覆盖比语句覆盖严格些。但是判定覆盖也不能检查出全部错误,因为有些条件语句即使写错了,也同样能够产生正确真值或假值。
比如 (a=2)or(x>1),由于这个or的存在,那么把x>1错写成x<1时,如果用例为a=2,语句的值都为"真"。要解决这个问题,就要看下面的覆盖。
(3)条件覆盖:是指设计足够的测试用例,使得判定表达式中每个条件的各种可能的值至少出现一次。这就比上面的单是判定覆盖要严格得多了,如上例,(a=2)
or (x>1);在这里必须使a=2 、x>1,a≠2、x≤1均出现一次。
(4)判定/条件覆盖:上面条件覆盖也不一定满足判定该,因为只符合条件覆盖的用例可能会不满足每个判定语句均有真值或假值出现。因此要两者兼顾,判定条件覆盖就是指设计足够
的测试用例,使得判定表达式中每个条件的所有可能取值至少出现一次并且每个判定表达式所有可能的结果也至少出现一次。
(5)条件组合覆盖:是指设计足够的测试用例,使得每个判定表达式中条件的各种或能的值的组合都至少出现一次。这就是前面两个覆盖的组合。
(6)路径覆盖:是指测设计足够的测试用例,覆盖被测试程序中所有可能的路径。
这六种覆盖进行比较有下面一个表:
条件组合发现错误的能力较强,凡满足其标准的测试用例,也必然满足前四种覆盖标准。在实际的逻辑测试中,一般以条件组合覆盖为主设计测试用例,然后再补充部分用例来达到路径覆盖的测试标准。
2、循环覆盖:当程序中存在循环结构时,要覆盖所有的路径是不可能的,但是可以通过限制循环结构来测试。
3、基本路径测试:由于实际问题中,程序的路径是庞大的,因此要将覆盖的路径压缩到一定限度才能解决这个问题。基本路径测试就是在程序控制流程图的基础上,通过分析控制构造的环路复杂性,导出基本路径集合从面设计测试用例保证这些路径至少通过一次。
再来看看黑盒技术
黑盒测试是功能测试。测试的是程序的接口。在设计测试用例时有以下几种方法:等价类的划分、边界值分析、错误推测和因果图。这几种方法都不能提供一组完整的测试用例,在实际测试中应把各种方法结合起来使用。
1、等价类的划分:是将输入数据按有效的或无效的(也称合理的或不合理的)划分成若干个等价类,测试每个等价类的代表值就等于对该类其他值的测试。用该法设计测试用例的步骤为:
(1)划分等价类(列一个表)
(2)确定测试用例:根据已划分的等价类,按以下步骤设计测试用例:
1)为每个等价类编号
2)设计一个测试用例,使其尽可能多的覆盖尚未被覆盖过的合理等价类。重复这步直到所有合理等价类被测试用例覆盖。
3)设计一个测试用例,使其只覆盖一个不合理等价类。重复这一步直到所有不合理等价类被覆盖。
要注意课本上的例子,会应用这种方法设计测试用例
2、边界值分析:也就是在为设计测试用例时,在等价类范围内选择一些边界值作为测试用例,这样可以比单用等价类划分法所选的测试用例能查出更多错误,因为实践表明,程序更容易在处理边界值时发生错误。
3、错误推测:通常根据经验或直觉来推测程序中可能出现错误的情况,并有针对性的编写检查这些错误的测试用例。
4、因果图:因果图能够有效地检测输入条件的各种组合可能会引起的错误。它的基本原理是通过画因果图,把用自然语言描述的功能说明转换为判定表,***为判定表的每一列设计一个测试用例。
在以上几种软件测试方法,各有所长,但各有所短,在实际测试中,应该采用综合策略,通常先用黑盒法设计基本的测试用例,再用白盒法补充一些必要的测试用例。
本节具体要掌握的就是等价类划分及边界值的测试用例设计。
四、软件测试过程(识记)
软件测试的步骤通常有四步:单元测试、集成测试、确认测试和系统测试。
1、单元测试主要针对模块的五个基本特征进行测试:模块接口、局部数据结构、重要的执行路径、错误处理和边界条件。单元测试时要用到"驱动模块"和"桩"模块。注意要概念:驱动模块是用来模拟被测试模块的上级调用模块。桩模块则用来代替被测试模块所调用的模块。
2、集成测试有两种方法:非渐增式测试和渐增式测试。
非渐增式测试是指首先对每个模块分别进行单元测试,再把所有模块组装成一个完整的系统进行的测试。而渐增式测试就是逐个把未经测试的模块组装到已经过测试的模块上去进行集成测试,每加入一个新模块进行一次集成测试,重复此过程直到程序组装完毕。渐增式测试有两种不同的组装方法:自顶向下和自底向上结合。注意两者区别。
3、确认测试又称有效性测试,它的任务是检查软件的功能与性能是否与需求规格说明书中确定的指标相符合。因而需求说明规格说明是确认测试的基础.确认测试有两项工作:进行确认测试与软件配置审查。
4、系统测试:即要对软件所运行的整个系统(包括硬件、外设、其他软件和操作人员等)结合在一起进行测试,确定其是否能够协调工作。
五、调试(识记)
软件测试的目的是尽可能多地发现程序中的错误,而调试则是在进行了成功的测试之后才开始的工作。调试的目的是确定错误的原因和位置,并改正错误,因此调试也称为纠错(Debug)。
调试方法有简单的调试方法、归纳法、演绎法和回溯法等。
【编辑推荐】