软件测试基础
常用的黑盒测试方法
1、等价类划分法
1.1 概述
用数据驱动的方式测试,穷举输入域的所有数据是不现实的,因此 以少代多 是可行的理想方法。如何将输入域集合划分为多个适当的数据子集合(等价类),使得每个等价类中选取的数据可以代表该类中的其他数据,这是等价类划分的基本思想。等价类分为有效等价类(正例,检查是否实现了需求中所有的功能和性能要求)、无效等价类(反例,检测程序的容错性和可靠性)
1.2 划分的规则
(1)按输入区间划分:规定了取值范围时,可以确定一个有效类和两个无效类(超过上限和低于下限)。
(2)按数值集合划分:规定输入值集合时,可以确定一个有效类和一个无效类(不属于属于集合的数据)。
(3)按离散数值划分:规定一组特定的值,可以确定n个(离散值的个数)有效类和一个无效类。
(4)按限制条件或规则划分:规定了“必须如何”等的规则或限制条件,可以确定一个有效类(符合规则的数据)和多个无效类(违反规则的不同情况下的数据)。
(5)按布尔量取值划分:规定输入是一个布尔量,可以确定一个有效类(真值)和一个无效类(假值)。
(6)细分等价类:当已划分的类中数据的处理方式在不同情况下不同时应考虑细分此等价类。
1.3 设计步骤
(1)按如下表建立等价类表,列举出所有的有效等价类和无效等价类,类是针对被测对象的,一定要弄清被测对象是什么。
分类条件/分类特征 | 有效等价类 | 无效等价类 |
---|---|---|
…… | …… | …… |
…… | …… | …… |
(2)给每个等价类规定一个唯一的编号,有时一个输入条件会对应多个类,无效等价类是有小等价类的“反面”。注意:等价类不等于测试用例,测试数据的组合也不等于测试用例。
(3)设计一个有效等价类的用例,使其尽可能多地覆盖尚未覆盖的有效等价类。重复这一步骤,知道所有的有效等价类都被覆盖。
(4)设计一个无效等价类的用例,使其只能覆盖一个 无效等价类。重复这一步骤,知道所有的有效等价类都被覆盖。
1.4 特点
等价类划分一般需要经历两个思维过程,分类与抽象。分类:对数据与根据相同或相似的功能进行分类;抽象:在各个分类中抽象出相同特性,然后用数据实例表征这个特征。优点是“以少代多”,节约时间,缺点是需花较多时间定义需求中一般不会明确给出的无效输出,同时缺乏对特殊用例的考虑,另外,划分出合适的分类也是一个难点。
2、边界值分析法(首尾)
2.1 概述
经验表明,程序在处理边界情况时最容易发生错误,因此边界值是测试的重点。边界,不仅仅是测输入,有时也要测输出的边界。
面试可能会问的几个重要概念:
内点:取值范围内的点。
上点:边界上的点,与开闭区间无关。如(90,100],[90,100]的上点均为90,80。
离点:离上点最近的点,与开闭区间有关。如(90,100]的离点为
91(下边界开区间的离点在域内,即91),
101(上边界闭区间的离点在域外,即101)
2.2 边界选取的原则
(1)若输入规定了取值范围,则取边界上的值和超出且最靠近边界的值。
(2)根据需求书上的每一个输出条件,使用以上原则。
2.3 两类边界选取的方法
五点法:又称一般边界值分析。取最大值、略低于最大值、最小值、略高于最小值、正常值作为输入测试。对于含N个变量的程序,其用例数为4N+1(1是这N个变量同时取normal时的情况)。
七点法:又称健壮性边界值分析。取最大值、略低于最大值、略高于最大值、最小值、略高于最小值、略低于最小值、正常值作为输入测试。对于含N个变量的程序,其用例数为6N+1。健壮性边界值分析测试的意义在于测试例外情况下程序如何处理,用以测试程序的健壮性。
2.4 特点
与等价类划分法的关系密切,划分等价类时,经常需要确定边界值,边界值法常作为等价类划分法的补充。
边界值适合具有多个相互独立的变量的函数,且这些变量具有明确的边界范围,对与相互影响的变量则不再适用;此外,边界值法在测试布尔量和逻辑变量时的意义不大。只采用单一的边界测试,测试用例有时是并不充分的。
3、判定表驱动法(亦可理解为 因果表法)
3.1 概述
判定表又称决策表,用于描述复杂的程序输入条件组合(各输入变量是相互影响的)与相应的程序处理动作之间**明确**的对应关系。等价类划分法和边界值分析法都只是孤立地考虑输入变量,对输入组合情况下可能会产生错误没有进行充分的测试,判定表从多个输入组合来满足测试的覆盖要求,是黑盒测试方法中最严格、最有逻辑性的测试方法。
3.2 表的构造
由以下四部分组成:
条件桩:列出问题所包含的所有条件,相当于输入动作。
动作桩:列出问题规定可能采取的操作,相当于输出结果。
条件项:条件桩中每个条件真假取值的组合。
动作项:列出在对应条件项组合下可能会出现的结果。。
条件桩 | 条件项 |
---|---|
动作桩 | 动作项 |
另外,贯穿条件项和动作项的一列称之为 规则。
3.3 构造表的步骤
(1)按需求说明书拆分条件、明确动作,列出所有的条件桩和动作桩。要注意需求中没有明确指出的默许规则和默许操作。
(2)按条件桩条件个数确定规则个数。
(3)按条件组合,填入条件取值,形成每一个条件项。
(4)填入对应的动作项,得到初始判定表。
(5)化简初始判定表,合并相似规则。化简原则为:若表中的两条或多条规则具有相同的动作,且它们的条件非常相似,则可以考虑将这些规则合并为一条规则。
3.4 特点
适于用判定表的用例的条件如下:
(1)需求说明书以判定表形式给出,或者很容易转换成判定表。
(2)条件和规则的**排列顺序**不会影响执行哪些操作。
(3)每当某一规则的条件已经满足,并确定要执行的操作时,不必检验别的操作。
(4)若某一规则得到满足时要执行多个操作,这些操作的顺序无关紧要。
优点:
(1)能将需求中各种复杂逻辑组合一一罗列出来,直观且易于理解,便于检查且能避免功能遗漏。
(2)每个测试用例可以覆盖多种输入情况,有利于提高测试效率。
(3)考虑了输入条件间的约束关系,避免了无效测试用例,提高测试有效性。
(4)能方便地给出每个用例地预期输出。
缺点:
(1)不能表达重复地动作,如循环语句的执行。
(2)当被测特性较多时,判定表的规模会很庞大。(此时可考虑两两组合测试及相应工具PICT)
(3)不能有效地确定某些输入组合是否必须测试,会造成一定的用例冗余。
4、因果图法
4.1 概述
如果输入条件与动作之间的关系是明确的,适合用判定表驱动法;但若输入条件与动作之间的关系不明确时,应使用因果图法;“因”即输入条件,“果”即输出动作,从这点上理解,则判定表驱动法也可称为“因果表法”。
4.2 原理
因果图用形式化的图形语言将自然语言的需求说明转换为图形化语言规格说明,能严格地表达程序输入与输出的逻辑关系,因果间有以下几种基本的逻辑关系,左节点C表示输入,右节点E表示输出(P75):
输入与输出之间往往存在某些依赖关系,称之为约束。因果图采用一些特定符号来表示这些约束,约束的图形符号如下:
它们的含义分别如下:
(1)互斥(Exclusion):C1与C2不会同时成立,两个最多有一个成立(可以两个都不成立,这是与唯一的区别)。
(2)包含(Include):C1、C2、C3至少有一个必须成立。
(3)唯一(Only):C1、C2两个原因中必须且只有一个成立。
(4)要求(Requirement):C1出现时,C2必须出现;与互斥相反。
(5)强制(Mandatory):结果E1为1时,E2必须为0。
在选择约束时,宜选取相对“宽松”些的约束,以便发现需求说明中可能存在的不完整性和二义性问题
4.3 因果图设计用例的步骤
(1)分析需求说明书,确定因果,为每个因果赋予标识符。
(2)分析需求说明书中语义信息,确定因因之间、果果之间、因果之间的逻辑关系。(难点)
(3)在因果图上标明约束,用约束表明因果间的相互关系(难点),来表示实际业务环境中的限制。
(4)将因果图转换为判定表。
(5)根据转换的判定表的每一条规则设计测试用例。
4.4 特点
优点:
(1)借助图形,能直观地分析和表达输入地各种组合关系、约束关系及每种条件下的输出结果。
(2)不仅可以发现输入和输出中的错误,而且能发现需求说明书中可能存在的不完整性和二义性问题。
缺点:
(1)有时因果关系难以从需求说明书中直接得到。
(2)当输入条件较多时,测试用例数量会很大,造成测试工作量大和用例不便维护的问题,需要按实际情况尽量精减输入条件的个数。
5、正交实验法
5.1 概述
正交实验法是用较少用例取得最佳测试效果的方法,用部分实验代替全面实验,用典型数据代替全体的一种能有效精简用例的方法。有两个重要概念:
因子:影响实验结果的条件因素,其中,各因子的取值称为状态。
水平数:状态数即为水平数。
以下是其他实验法的实验次数(因子数是m,水平数是n):
实验方法 | 实验次数 |
---|---|
全面实验法(完全测试) | nm |
简单对比法(控制变量法/孤立因素法) | n+(m-1) * (n-1) |
5.2 原理
根据伽瓦罗(Galois)理论,利用已有的规格化的正交表,从大量的实验点中挑选出适量的、有代表性的点,合理地安排实验,用较少的实验次数,取得较为准确和可靠的实验结果。正交表获取的参考网站:https://www.york.ac.uk/depts/maths/tables/orthogonal.htm。
5.3 正交表及其选取方法、用例的设计步骤
1、正交表的表示形式为:L实验次数(水平数因子数),
L:代表正交表。
实验次数:正交表的行数,亦即测试用例的条数。
水平数:任何单个因子能够取得的值的个数的最大值(即各因子的最大水平数)。
因子数:正交表最多可以安排的因子数,即正交表的列数。
正交表的实验次数(k)与每列水平数(n),存在如下关系:
k
=
∑
(
n
−
1
)
+
1
k=\sum{(n-1)}+1
k=∑(n−1)+1
2、选取方法:
因子数不同时:正交表的列数要大于等于因子数,从符合条件的表中选择行数最少的表。
水平数不同时:要选择能包含各输入因子的最大水平数且行数最少的表。
因子数与水平数均不同时:同时采用以上两种策略。
3、用例的设计步骤
(1)确定因子。根据需求,确定对软件运行结果产生影响的因子,若因子太多且测试资源有限时可优先测影响程度大的因子,将用例数控制在可控范围内。
(2)确定每个因子的水平。按需求挑出各因子的取值范围或集合,用等价类、边界值和其他软件测试技术方法,选出具有代表性的测试点,确定水平。必要时,应对因子水平按重要程度进行取舍。
(3)选择符合条件的行数最少的正交表。
(4)生成测试用例。将表中多余的因子(列)删除,,再将因子的各水平值用数字“映射”到表中,按表生成测试用例。
(5)适当补充。根据经验添加一些没有生成但有价值的测试用例作为补充。
5.4 特点
(1)正交性。
(2)代表性。
(3)综合可比性。
6、场景法
6.1 概述
场景法主要用于测试软件的业务过程或业务逻辑,是一种基于软件业务和用户行为的测试方法,重点在于业务流程与用户行为,测试数据的设计(数据设计适合用前面的设计方法)反倒在其次,是一种宏观全局(相对于重点关注测试数据的其他设计方法而言)上的测试。
6.2 基本概念
在系统功能侧面上测试时,不仅涉及测试数据的问题,更重要的是如何从系统整个业务流程的全局角度对系统进行测试。场景法运用场景对系统的功能点或业务流程进行描述,然后设计测试用例,从而提高对系统主要功能和业务流程的测试效果。
场景法包含基本流和备选流。
基本流:采用直黑线表示,是经过用例的最简单路径,即无任何差错,程序从开始直接执行到结束的流程,是用户最常用的操作过程,体现软件的主要功能。
备选流:除基本流之外的各个支流,用不同颜色显示。备选流的起点和终点可以是基本流、备选流或是直接终止。
示意图如下:
由上图可以确认以下场景:
场景1:基本流
场景2:基本流 -> 备选流1
场景3:基本流 -> 备选流1 -> 备选流2
场景4:基本流 -> 备选流3
场景5:基本流 -> 备选流3 -> 备选流1
场景6:基本流 -> 备选流3 -> 备选流1 -> 备选流2
场景7:基本流 -> 备选流4
场景8:基本流 -> 备选流3 -> 备选流4
为简化问题,以上场景只考虑备选流3只执行一次的情况。
以下是基本流和备选流的一些区别:
对比项 | 基本流 | 备选流 |
---|---|---|
测试重要性 | 重要 | 次要 |
数量 | 一个 | 一个或多个 |
初始节点位置 | 系统初始状态 | 基本流或其他备选流 |
终止节点位置 | 系统终止状态 | 基本流或系统终止状态 |
是否构成完整的业务流程 | 是 | 否,仅为业务的执行片段 |
能否构成场景 | 能 | 否,需要和基本流共同构成场景 |
6.3 设计用例的原则及步骤
场景法设计用例时,需要重点设计用户使用的重要操作和典型场景,一般包括以下两类:
(1)模拟用户完成正常功能和核心业务逻辑的操作,来验证软件的正确性。
(2)模拟用户操作中出现的主要错误(可能由客观环境/用户误操作引起),以验证软件异常错误处理能力。
需要选取典型场景进行测试的基本原则如下:
(1)有且仅有一个场景包含基本流;
(2)最少场景数等于基本流和备选流的总数;
(3)对于某个备选流,至少应当有一个场景覆盖它,且该场景应当尽量避免覆盖其他的备选流。
设计的步骤:
(1)按需求,描述程序基本流和各个备选流(怎么恰当地构建是难点);
(2)将基本流和各个备选流生成不同的场景(如何保证构建的场景满足测试完备和无冗余是难点);
(3)根据场景生成相应的测试用例(难点);
(4)对生成的用例再审查,去除冗余用例。确定用例后,为每个用例确定测试数据。
6.4 特点
能从宏观上看清业务流程和业务逻辑,使人能对系统总体有把控,能达到较好的需求覆盖;但对测试人员的测试经验、对业务流程/逻辑的熟悉程度要求较高,当备选流较多时,可能会造成场景爆炸。
7、错误推测法
7.1 概述
错误推测法是基于经验和直觉退测程序中可能出现的各种错误和容易发生错误的特殊情况,将其列举为清单,然后有针对性地设计测试用例。这些根据经验总结的错误清单通过不断修正和分享,可以帮助测试人员发现很多潜在的软件缺陷。
经验通常来自于软件项目的历史测试结果,也可以来自于用户反馈意见、项目测试过程中采用非用例方法发现的问题。
7.2 特点
依据经验和直觉,没有固定的方法,带有明显的主观性。一般先用其他的方法设计用例,再用错误推测法补充用例。
优点:
(1)能够充分发挥测试人员的经验和直觉;
(2)通过问题积累、总结和分享,做到集思广益和不断提高测试效果;
(3)使用方便,能够快速切入和解决问题。
缺点:
(1)能以统计测试的覆盖率;
(2)可能对大量未知的问题区域未作测试,无法保证测试的充分性;
(3)带有主观性,缺乏系统严格、有章可循的方法,因此难以复制;
(4)难以支持自动化测试。
8、黑盒测试应用策略
上述黑盒测试方法在实际应用中往往不是单独使用的,以下是一些常用的综合选择策略,可在实际应用中参考:
(1)对于业务流程清晰的系统,可以利用场景法贯穿整个测试过程,并在测试过程中综合使用各种测试方法;
(2)等价类划分法经常被优先使用,将无限测试变为有限测试;
(3)在任何情况下都应考虑边界值分析法;
(4)用错误推断法补充用例;
(5)程序应用中含输入组合的情况,且业务逻辑比较复杂,优先采用因果图法和判定表驱动法;
(6)对于参数配置类的软件,采用正交实验法;
(7)对照需求,检查用例覆盖程度,未达到标准时,补充用例。
应用黑盒测试方法时,立足需求是基础,深入理解业务是关键,灵活应用方法是手段。需求是为实际业务而存在。
9、思考题
1、什么是黑盒测试?
将被测程序看成一个整体,完全不考虑其内部逻辑结果、特点、计算过程等信息,通过程序接口或应用页面输入数据或执行操作运行程序,观察程序是否能正确的接收数据并产生正确的输出结果,是否在运行过程中保持数据库、文件等外部信息的完整性,检查是否满足需求。
2、比较各种黑盒测试方法的优缺点及适用性。
用例设计方法 | 适用范围 | 优点 | 缺点 |
---|---|---|---|
等价类划分法 | 输入数据之间最好是相互独立、互不影响的。 | “以少代多”,节约时间,能提高效率 | 需花较多时间定义需求中一般不会明确给出的无效输出,同时缺乏对特殊用例的考虑;另外,划分出合适的分类也是一个难点。 |
边界值分析法 | 适合具有多个**相互独立的变量的函数,且这些变量具有明确的边界范围**。 | 容易测出程序在处理边界值时易发生的错误 | 边界值法在测试布尔量和逻辑变量时的意义不大。只采用单一的边界测试,测试用例有时是并不充分的。 |
判定表驱动法(因果表法) | 条件和规则的**排列顺序不会影响执行操作,输入条件间会相互影响**,且输入条件与动作之间的关系明确 | (1)能将需求中各种复杂逻辑组合一一罗列出来,直观且易于理解,便于检查且能避免功能遗漏。 (2)每个测试用例可以覆盖多种输入情况,有利于提高测试效率。 (3)考虑了输入条件间的约束关系,避免了无效测试用例,提高测试有效性。 (4)能方便地给出每个用例地预期输出。 | (1)不能表达重复地动作,如循环语句的执行。 (2)当被测特性较多时,判定表的规模会很庞大。 (3)不能有效地确定某些输入组合是否必须测试,会造成一定的用例冗余。 |
因果图法 | 条件和规则的**排列顺序不会影响执行操作,输入条件间会相互影响**,且输入条件与动作之间的关系不明确,需借助图形明确关系。 | (1)借助图形,能直观地分析和表达输入地各种组合关系、约束关系及每种条件下的输出结果。 (2)不仅可以发现输入和输出中的错误,而且能发现需求说明书中可能存在的不完整性和二义性问题。 | (1)有时因果关系难以从需求说明书中直接得到。 (2)当输入条件较多时,测试用例数量会很大,造成测试工作量大和用例不便维护的问题,需要按实际情况尽量精减输入条件的个数。 |
正交实验法 | 适合配置类软件、输入条件较多且测试资源有限,需要以典型数据代替全部数据的软件。 | (1)正交性。 (2)代表性。 (3)综合可比性。 | 可能会遗漏某些有效的测试数据或场景 |
场景法 | 软件的业务过程或业务逻辑十分清晰或易于整理。 | 能从宏观上看清业务流程和业务逻辑,使人能对系统总体有把控,对实际应用场景能达到较好的需求覆盖。 | 对测试人员的测试经验、对业务流程/逻辑的熟悉程度要求较高,当备选流较多时,可能会造成场景爆炸。 |
错误推测法 | 无任何限制,但有迭代经历的项目更易从历史迭代bug中获取有效用例。 | (1)能够充分发挥测试人员的经验和直觉; (2)通过问题积累、总结和分享,做到集思广益和不断提高测试效果; (3)使用方便,能够快速切入和解决问题。 | (1)能以统计测试的覆盖率; (2)可能对大量未知的问题区域未作测试,无法保证测试的充分性; (3)带有主观性,缺乏系统严格、有章可循的方法,因此难以复制 (4)难以支持自动化测试。 |
3、为什么在等价类划分法中,一个无效等价类用例只覆盖一个无效类?
因为无效等价类用于检测软件的容错性和稳定性,当一个用例含多个无效类时,一旦发现其中一个无效类错误时,程序将终止,不再检测其他错误,因此无法发现其他无效类会导致的错误。简言之,已发现的错误会屏蔽其他错误。