• 黑盒测试《等价类划分》-有这篇就够了


    大家好,我是吉提。在疫情消停不下来的2020年,既然不好跳槽,不好涨薪,也不好发挥创造力,那么就沉下心来,跟我一起,巩固软件测试基础知识。积攒力量,蓄势待发。

    本文将会详细描述“等价类划分",它是黑盒测试最基本的用例设计方法。

    目录:

    1. 定义(What)
    2. 为什么使用该方法?(Why)
    3. 如何划分等价类?(How)
    4. 设计测试用例
    5. 使用场景
    6. 根据测试用例的完整性划分
    7. 等价类划分注意事项
    8. 等价类划分的优缺点
    9. 实战演练

     

    1. 定义(What)

    等价类划分法是一种典型的,并且是最基础的黑盒测试用例设计方法。采用等价类划分法时,完全不用考虑程序内部结构,设计测试用例的唯一依据是软件需求规格说明书。

    所谓等价类,是输入条件的一个子集合,该输入集合中的数据对于揭示程序中的错误是等价的。从每一个子集中选取少数具有代表性的数据,从而生成测试用例。

    等价类又分为有效等价类和无效等价类。有效等价类代表对程序有效的输入,而无效等价类则是其他任何可能的输入(即不正确的输入值)。有效等价类和无效等价类都是使用等价类划分法设计用例时所必须的,因为被测程序若是正确的,就应该既能接受有效的输入,也能接受无效输入的考验。

    2. 为什么使用该方法?(Why)

    理想的测试,是从所有可能的输入中找出某个小的子集,并且是可能发现错误最多的子集。即:使用最少的测试数据,达到最好的测试质量(最高性价比)。

    这个子集如何确定?可以借助测试用例的两个特性:测试用例数量达到最少;某个测试用例要能覆盖大部分其他测试用例。第二个特性就暗示我们,应该尽量将程序输入范围进行划分,将其划分为有限数量的等价类,这样就可以合理地假设测试每个等价类的代表性数据等同于测试该类的其他任何数据。这两种特性形成了称为等价类划分的黑盒测试方法。

    因此,等价类划分是黑盒测试最基本的方法。

    3. 如何划分等价类?(How)

    在给定了输入或外部条件之后,等价类的划分原则如下:

    • 如果输入条件规定了一个取值范围(例如,“数量可以是1到999”),那么就应确定出一个有效等价类(1<数量<999),以及两个无效等价类(数量<1,数量>999)。
    • 如果输入条件规定了取值的个数(例如,“汽车可登记一至六名车主”),那么就应确定出一个有效等价类和两个无效等价类(没有车主,或车主多于六个)。
    • 如果输入条件规定了一个输入值的集合,而且有理由认为程序会对每个值进行不同处理(例如,“交通工具的类型必须是公共汽车、卡车、出租车、火车或摩托车”),那么就应为每个输入值确定一个有效等价类和一个无效等价类(例如,“拖车”)。
    • 如果存在输入条件规定了“必须是”的情况,例如“标识符的第一个字符必须是字母”,那么就应确定一个有效等价类(首字符是字母)和一个无效等价类(首字符不是字母)。
    • 以上是基于字面上的需求划分的等价类,而细化等价类依据的是数据在内存或数据库中存储的类型。(举例,测试加法器,两个文本框,要求输入-99~99之间的整数。整数的存储在计算机底层中会使用不同的算法,正整数和负整数算法不同。所以测试时正整数和负整数应该分开来测(一般对有效等价类数据应用,无效等价类数据一般不需要正、负分别测)。所以将有效等价类细分为:-99--(-1)负整数、0—99 正整数。

    Tips:如果有任何理由可以认为程序并未等同地处理等价类中的元素,那么应该将这个等价类再划分为小一些的等价类。

    划分等价类的标准:

    • 完备测试、避免冗余;
    • 划分等价类重要的是:集合的划分,划分为互不相交的一组子集,而子集的并是整个集合;
    • 并是整个集合:完备性;
    • 子集互不相交:保证一种形式的无冗余性;
    • 同一类中标识(选择)一个测试用例,同一等价类中,往往处理相同,相同处理映射到"相同的执行路径"。

    4. 设计测试用例

    Step1.确定等价类

    确定等价类是选取每一个输入条件(通常是规格说明中的一个句子或短语)并将其划分为两个或更多的组。注意,我们确定了两类等价类:有效等价类代表对程序的有效输入,而无效等价类代表的则是其他任何可能的输入条件(即不正确的输入值)。这样,我们就遵循了测试原则,即要注意无效和未预料到的输入情况。

    Step2.建立等价类表

    划分等价类后,应建立等价类表,列出与每一个输入条件对应的有效等价类和无效等价类,并为每个等价类设置一个唯一的编号。

     

    Step3.生成测试用例

    现在利用等价类表来生成测试用例,其过程如下:

    • 编写新的测试用例,尽可能多地覆盖那些尚未被涵盖的有效等价类,直到所有的有效等价类都被测试用例所覆盖(包含进去)。
    • 编写新的用例,每次覆盖一个(仅一个)尚未被涵盖的无效等价类,直到所有的无效等价类都被测试用例所覆盖(包含进去)。

    Tips:用测试用例每次只覆盖1个无效等价类,是因为某些特定的输入错误检查可能会屏蔽或取代其他输入错误检查。举例,如果规格说明规定了“请输入书籍类型(硬皮、软皮或活页)及数量(1~999)”,代表两个错误输入(书籍类型错误,数量错误)的测试用例“(XYZ,0)”,很可能不会执行对数量的检查,因为程序也许会提示“XYZ是未知的书籍类型”,就不检查输入的其余部分了。

    5. 使用场景

    有数据输入(编辑框)的地方,可以使用等价类划分法。例如用户登录、注册、新建、查询。

     

     

    6. 根据测试用例的完整性划分

    日常逼叨叨:解释一下啥叫根据完整性划分。测试用例没有完美的,不是必须列到多少条才叫100分,再怎么测试都不可能找出所有bug。测试行为是一个精益求精的过程,100分是理想国,测试工程师以这个理想国为目的地,始终在朝拜它的路上,不问何时抵达,只求更接近一步。设计测试用例的目的,图的就是有逻辑得有规律得找出更多bug,那么就有理由认为,测试用例设计的越完整,逻辑性就越强,考虑得就越周到,就可以找出更多bug。小王设计4条用例,小张在这4条基础上,又增加了3条,一共设计7条,那么小张的测试用例一定比小王的更完整。

    完整性从弱到强排序:弱一般等价类测试、弱健壮等价类测试。强一般等价类测试、强健壮等价类测试。下面逐一定义。

    • 弱一般等价类:遵循单缺陷原则,要求用例覆盖每一个变量的一种取值即可,取值为有效值。

     

    • 弱健壮等价类:在弱一般等价类的基础上,增加取值为无效值的情况。“健壮”意味着程序要有容错性,取到无效值也要正确识别出来。对于有效输入,使用每个有效值类的一个值。对于无效输入,测试用例将拥有一个无效值,并保持其余的值是有效的。

     

    • 强一般等价类:遵循多缺陷原则,要求用例覆盖每个变量的每种取值之间的迪卡尔乘积,即所有变量所有取值的所有组合,取值为有效值。例如变量X有3个等价类,变量Y有2个等价类,那么应设计3*2共6个用例。要覆盖所有的有效等价类组合。

     

    • 强健壮等价类:在强一般等价类的基础上,增加取值为无效值的情况。(不仅取单个无效值,也要取多个无效值。)

    7. 等价类划分注意事项

    不仅要针对输入域进行等价类划分,也应针对输出域进行等价类划分(见“实战演练”的“三角形问题”),这点一定不要忘记了!此外,如果考虑将端到端场景进行细分,等价类划分法同时也适用于中间过程的输入、输出域进行划分。

    8.等价类划分的优缺点

    • 优点:等价类划分的测试用例设计方法减少了穷举法带来的大量测试用例,保证测试效果和测试效率,一般是有输入性需求的被测对象可以采用的方法;
    • 缺点:输入与输入之间的关系考虑少,可能产生一些逻辑错误。还需要其他用例设计方法来补充测试。

    9.实战演练

    例1.注册邮箱

    邮箱名要求6~18个字符,可使用字母、数字、下划线、需以字母开头。

     

     

     

    例2. 三角形问题

    程序要求:输入三个整数a、b、c分别作为三角形的三边长度,通过程序判定所构成的三角形的类型;当三角形为一般三角形、等腰三角形或等边三角形时,分别作处理。

    <问题分析>

    • 输入值域的显/隐式要求:A整数、B三个、C正数、D两边之和大于第三边、E三边均不相等、F两边相等但不等于第三边、G三边相等;(D~G由输出值域的等价类隐性确定)
    • 输出值域的等价类:R1={不构成三角形}、R2={一般三角形}、R3={等腰三角形}、R4={等边三角形};

    <问题解答>

    (1)列出等价类表并编号

     

    (2)设计覆盖有效等价类的测试用例

     

    (3)设计覆盖无效等价类的测试用例

     

    例3.NextDate 函数

    函数包含三个变量:month 、 day 和 year ,函数的输出为输入日期后一天的日期。 例如,输入为 2020年3月 7日,则函数的输出为 2020年3月8日 。要求输入变量 month 、 day 和 year 均为整数值,并且满足下列条件:1≤month≤12,1≤day≤31,1920≤year≤2050。

    <问题分析>

    该函数的主要特点是输入变量之间的逻辑关系比较复杂,具体体现在:输入域的复杂性;闰年规则。如,变量year和变量mouth取不同值时,对应的变量day会有不同的取值范围,或1~30或1~31或1~28或1~29。

    <问题解答>

    (1)划分等价类

    等价关系的要点是:等价类中的元素要被“同样处理”,即要么都在有效层次上进行,要么都在无效层次上进行。因此,更详细地有效等价类为:

    • 变量mouth:M1={mouth: mouth有30天}、M2={mouth: mouth有31天,除去12月}、M3={mouth: mouth是2月}、M4={mouth: mouth是12月};
    • 变量day:D1={day: 1≤day≤28}、D2={day: day=29}、D3={day: day=30}、D4={day: day=31};
    • 变量day:Y1={year: year是闰年}、Y2={year: year是平年}。

    (2)一般等价类测试

    • 弱一般等价类测试

    考虑到单边假设,机械地以对称方式来选择对应类的有效输入:

     

    • 强一般等价类测试

    从弱等价类测试到强等价类测试,不管是一般类还是健壮类,都做要独立性假设,都要以等价类的笛卡尔积表示。

    在本问题中,变量mouth等价类数量为4、变量day等价类数量为4、变量year等价类数量为2,故强一般等价类测试用例数量为4*4*2=32。

    (3)健壮等价类测试

    • 弱健壮等价类测试
    • 强健壮等价类测试

     

    -end-

  • 相关阅读:
    (引)spring学习笔记1.什么是控制反转
    Arduino 各种模块篇 步进电机 step motor 舵机 servo 直流电机 总复习
    Raspberry Pi Wireless Adaptor
    Pyramid 使用总结1
    Arduino 各种模块篇 人体红外感应模块 proximity sensor
    Pyramid 使用总结2
    Webcam Streaming Desktop Recording on Linux for ubuntu or its destros
    Arduino 各种模块篇 步进电机 step motor( 不用库,不用shield, 纯)
    Arduino 各种模块篇 motor shield 电机扩展板(舵机、直流电机、步进电机party)
    转载 stepper motors
  • 原文地址:https://www.cnblogs.com/jitipaper/p/12496229.html
Copyright © 2020-2023  润新知