软件测试-白盒测试:逻辑覆盖

逻辑覆盖

参考文献:
软件测试第4章白盒测试一
软件测试——白盒测试
白盒测试-覆盖测试(六种覆盖方法)

几种常用的逻辑覆盖测试方法

目的:结构测试是依据被测程序的逻辑结构设计测试用例,驱动被测程序运行完成的测试。逻辑覆盖能够给出结构测试的覆盖准则,即可以结束测试的条件。
软件测试-白盒测试:逻辑覆盖_第1张图片

  • 语句覆盖
    首先设计若干个测试用例,使程序中的每个可执行语句至少执行一次。这里所谓“若干个”,自然是越少越好。
    Case1:A=2, B=0, X=3。便可以达到语句覆盖,路径为ace。
    为什么达到了?不是b和d没走吗?再想想,b和d上有语句吗?(图中有语句的线走一遍)
    如果第一个判断的AND写成OR,或者第二个的OR写成AND,仍然使用第一个参数用例,仍然做到语句覆盖,可是发现不了错误。
  • 判定覆盖(分支)
    设计若干测试用例,使得程序中每个判断的取真分支取假分支至少经历一次,即判断的真假值均曾被满足。
    Case2:A=1, B=0, X=1,路径为abd。Case1和Case2一起可以实现判定覆盖。可是第二个判断X>1错写成X<1,不能发现错误。
    什么是判断?菱形中的语句if语句就是判断语句。如本题中,就有2个判断,当2个判断都执行过T和F时(4种情况),就完成了判定覆盖。
  • 条件覆盖
    设计若干测试用例,使每个判断中每个条件的可能取值至少满足一次。
    Case3:A=2, B=1, X=1,路径为abe。Case1、Case2和Case3一起可以实现条件覆盖。
    什么是条件?通过逻辑运算符进行分割,每一个结果就是一个条件。如本题中,就有4个条件,当4个条件都执行过T和F时,就完成了条件覆盖。
    软件测试-白盒测试:逻辑覆盖_第2张图片
  • 判定-条件覆盖
    设计足够的测试用例,使得判断中每个条件的所有可能至少出现一次,并且每个判断本身的判定结果也至少出现一次。
    Case1、Case2和Case3一起可以实现判定-条件覆盖。
    为什么符合?因为覆盖了每条线,也覆盖了所有条件。(此处和部分PPT不同,因为它们没有考虑条件组合覆盖)
  • 条件组合覆盖
    设计足够的测试用例,使得判断中每个条件的所有可能至少出现一次,并且每个判断本身的判定结果也至少出现一次。它与条件覆盖的差别是它不是简单的要求每个条件都出现“真”与“假”两种结果,而是让这些结果的所有可能组合都出现一次。
    软件测试-白盒测试:逻辑覆盖_第3张图片
    条件组合只针对同一个判断语句内存在多个条件的情况。让这些添加的取值进行笛卡尔乘积组合。
  • 路径覆盖
    设计足够的测试用例,要求覆盖程序中所有可能的路径。
    Case3:A=3, B=0, X=1,路径为acd。Case1、Case2、Case3和Case4一起可以实现路径覆盖。
    软件测试-白盒测试:逻辑覆盖_第4张图片

最少测试用例数计算

结构化程序是由顺序型、选择型、重复型3种基本控制结构组成。为了把问题化简,避免出现测试用例极多的组合爆炸,把构成循环操作的重复型结构用选择结构代替。
软件测试-白盒测试:逻辑覆盖_第5张图片
如何计算最少测试用例数呢?我们先看一道简单的题。
软件测试-白盒测试:逻辑覆盖_第6张图片
至少提供4个测试用例才能做到逻辑覆盖,这里的4是图中第1个分支谓词引出的两个操作及第2个分支谓词引出的两个操作组合起来而得到的即2 × 2 = 4,并且,这里的2是由于两个并列的操作1 + 1 = 2而得到的。
总结:并联相加,串联相乘。
软件测试-白盒测试:逻辑覆盖_第7张图片
计算公式:(5*3+1)*3=48
步骤:((5,4,3,2)(7,6),(1))(9,8)
核心:一层一层剥开。不断划分串联和并联,直到只有Y和N,然后开始逆向计算。

逻辑覆盖的出发点是合理的、完善的。所谓“覆盖,就是想要做到全面而无遗漏,但逻辑覆盖并不能真正做到无遗漏。
if(x>3&&z<10) 若不小心写成了if(x>=3&&z<10),按照前面设计的测试用例(x取2或4),逻辑覆盖对这样的问题是无能为力的,而原因就在于:错误区域仅仅在x=3这个点上,即仅当x的值取3时,测试才能发现错误。而这里就用到了测试覆盖中需要遵循的两条准则:ESTCA准则、LCSAJ准则。
FOSTER的ESTCA覆盖准则:

  • 对于A rel B(rel可以是<、 = 和>)型的分支谓词,应适当地选择A与B的值,使得测试执行到该分支语句时,A<B、A = B和A>B的情况分别出现一次。
  • 对于A rel1 C(rel1可以是<或是>,A是变量,C是常量)型的分支谓词,当rel1为<时,应适当地选择A的值,使A = C − M,当rel1为>时,应适当地选择A,使A = C + M。(M是距C最小的机器容许正数,若A和C均为整型时,M = 1)
  • 对外部输入变量赋值,使其在每一测试用例中均有不同的值与符号,并与同一组测试用例中其他变量的值与符号不一致。

LCSAJ是指一组顺序执行的代码,以控制流跳转为结束点。它可产生以下4层覆盖:

  • 第一层:语句覆盖。
  • 第二层:分支覆盖。
  • 第三层:LCSAJ覆盖。
  • 第四层:两层LCSAJ覆盖,直到N个LCSAJ。

你可能感兴趣的:(软件测试,测试用例,软件测试)