『软件测试4』一文详解四大典型的白盒测试方法(二)

简介: 笔记

2、基本路径测试法


(1)独立路径


独立路径是指包括一组以前没有处理的的语句或条件的一条路径。

从控制流图来看,一条独立路径是至少包含一条在其他独立路径中从未有过的边的路径。


(2)程序控制流图


1)程序控制流图的定义

控制流程图是描述程序控制流的一种图示方式。(有向图)

2)控制流图的两种图形符号

  • 图中的每一个圆圈称为流图的结点,表示一个或多个无分支的语句或源程序语句。
  • 流图中的箭头称为边或连接,表示控制流线。

3)程序控制流图的5种基本结构

10.png

4)程序控制流图的描述

  • 程序控制流图实际上可以看作是一种简化了的程序流程图。
  • 在控制流图中,只关注程序的流程,不关心各个处理框的细节
  • 因此,原来程序流程图中的各个处理框(包括语句框、判断框、输入/输出框等)都被简化为结点,一般用圆圈表示,而原来程序流程图中的带有箭头的控制流变成了控制流图中的有向边

5)举个栗子:chestnut:

下图是典型的程序流程图转换为相对应的流图。对(a)图所示的程序流程图进行简化,得到(b)图所示的流图。

11.png

6)注意事项

在将程序流程图简化成控制流图时,应注意如下几点:

  • 一组顺序结构可以映射为一个单一的结点
  • 在选择多分支结构中分支的汇集处时,即使没有执行语句也应该添加一个汇聚结点
  • 边和结点圈定的范围叫做区域,当对区域计数时,图形外的区域也应记为一个区域(开放区域)
  • 如果判断中的条件表达式是由多个逻辑运算符(OR,AND…)连接的复合条件表达式,则需要改为一系列只有单个条件的嵌套的判断


(3)软件复杂度


  • 软件复杂度是指理解和处理软件的难易程度。
  • 程序复杂度是软件度量的重要组成部分
  • 度量方法:McCabe 度量法(环路度量)


(4)程序复杂度


环路复杂度又称为圈复杂度,是一种为程序逻辑复杂度提供定量尺度的软件度量。它可以提供程序基本路径集的独立路径数量,这是确保所有语句至少执行一次的过程所必须的最少测试用例数。常用于基本路径测试法


(5)环路复杂度


McCabe 复杂性度量方式有如下三种:

V(G)= {区域数边数−结点数+2判定结点数+1\begin{cases} 区域数 \\ 边数-结点数+2 \\ 判定结点数+1\\ \end{cases}+2+1  :star::star::star:

1)通过控制流图的区域个数来计算

公式:V(G)=区域数

程序的环路复杂性为控制流图的区域数(即封闭的区域数+1)。

在下图中可以看到,有 12 两个封闭区域,因此,环路复杂度V(G)=2 + 1 = 3。

(2个封闭的区域+1个开放区域) 

12.png

2)通过控制流图的边数和结点数来计算

公式:V(G) = e - n + 2

其中, eedge ,表示图中边的数目nnode ,表示结点个数

下图中V(G)= e - n + 2 = 7条边 − 6个结点 + 2 = 3。

因此,环路复杂度V(G)=3。

13.png

3)通过控制流图中的判定结点个数来计算

公式:V(G) = P + 1

其中,P表示判定结点的数目。所谓判定节点数,即有多个分支的节点,比如下图中的节点 2 ,它可以走3或者5,这个时候它就需要做判断了。所以, 2 是一个判定节点。同样地,下面的 节点3 也像节点 2 一样分析。

因此,图中V(G)=2个判定结点+1 = 3,所以环路复杂度为3。

14.png

讲到这里,我们来给环路复杂性做个小结。事实上,程序的环路复杂性给出了程序基本路径集中的独立路径条数,这是确保可执行语句至少执行一次所必需的测试用例数目的上界。

通过对以上三个例子的了解,相信大家对环路复杂度的三种求解方式有了一个新的认识。有了上面一系列内容的铺垫,我们来开始讲解基本路径测试法


(4)基本路径测试法


1)基本路径测试法是什么

路径测试就是从一个程序的入口开始,执行所经历的各个语句的完整过程。从广义的角度讲,任何有关路径分析的测试都可以被称为路径测试

完成路径测试的理想情况就是做到路径覆盖,但对于复杂性较大的程序要做到所有的路径覆盖(测试所有可执行路径)是不可能的。

在不能做到所有路径覆盖的情况下,如果某一程序的每一个独立路径都被执行到,那么就可以认为程序中的每个语句都已经检验过了,即达到了语句覆盖。这种测试方法就是通常所说的基路径测试法

基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径的集合,从而设计测试用例的方法。设计出的测试用例要保证在测试中程序的每个可执行语句至少执行一次。

2)基本路径测试法的4个步骤

基本路径测试法包括以下4个步骤:

  • 详细设计源代码作为基础,绘制程序的控制流图
  • 计算得到的控制流图G的环路复杂性V(G)
  • 确定独立路径的集合。通过程序控制流图导出基本路径集,列出程序的独立路径。所谓独立路径,是指至少包含一条新边的路径,也就是包含一些前面的路径未包含的语句,当所有的语句都包含了,基路径集就够了。(线性无关路径)
  • 设计测试用例,确保基本路径集中每条路径的执行。

3)例子阐述1 :chestnut:

依据以下代码,用基本路径测试法,设计该程序的测试用例。

if(a>8 && b>10)   //1,2
    m=m+1;       //3
if(a=10 || c>5)  //4,5
   m=m+5;       //6
复制代码

解答:

①绘制程序控制流图,如下图所示。

15.png

②计算环路复杂度

V(G)=4(3个封闭区域+1个开放区域)

③确定线性无关路径:

路径1:1、4、6

路径2:1、4、5、6

路径3:1、2、4、5、6

路径4:1、2、3、4、5、6

④设计测试用例

编号 输入数据 预期输出 覆盖路径
1 a=2,b=3,c=4 m=0 1、4、6
2 a=2,b=3,c=8 m=5 1、4、5、6
3 a=10,b=6,c=8 m=5 1、2、4、5、6
4 a=10,b=15,c=8 m=6 1、2、3、4、5、6

4)例子阐述2 :chestnut:

依据以下代码,用基本路径测试法,设计该程序的测试用例。

static void permute_args(int panonopt_start, int panonopt_end, int opt_eng, int ncycle){
    int cstart, cycle, i, j, nnonopts, nopts, pos; //1
    nnonopts = panonopt_end - panonopt_start;
    nopts = opt_end - panonopt_end;
    cyclelen = (opt_end - panonopt_start)/ncycle;
    for(i = 0; i < ncycle; i++){ //2
        cstart = panonopt_end + i; //3
        pos = cstart;
        for(j = 0; j < cyclelen; j++){ //4
            if(pos >= panonopt_end){ //5
                pos -= nnonopts; //6
            }else{
                pos += nopts; //7
            }
        }
    }
} //8
复制代码

【问题1】请针对上述C程序给出满足100%DC(判定覆盖)所需的逻辑条件。

【问题2】请画出上述程序的控制流图,并计算其控制流图的环路复杂度V(G)。

【问题3】请给出问题2种控制流图的线性无关路径。

解答:

【问题1】

满足100%判定的逻辑条件为:

i<ncycle;
i>=ncycle;
j<cyclelen;
j>=yclelen;
pos>=panonopt_end;
pos<panonopt_end; 
复制代码

【问题2】

控制流图如下图所示,V(G)=4。

16.png

【问题3】

线性无关路径:

路径1:1、2、8

路径2:1、2、3、4、2…

路径3:1、2、3、4、5、6、4…

路径4:1、2、3、4、5、7、4…


四、写在最后



🙋‍♀️🙋‍♀️🙋‍♀️

对于软件测试中的白盒测试来说,主要需要了解白盒测试的基本概念,静态和动态白盒测试的方法,内容较黑盒测试来说逻辑性会更强一些。同时,值得注意的是,在动态测试中的基本路径测试法中,线性无关路径的识别要尤为小心,在计算过程中很容易出现多写的问题。因此,在此基础上,大家可以再多找几道相关的题目进行练习,举一反三。

相关文章
|
14天前
|
敏捷开发 Java 测试技术
探索软件测试中的自动化测试框架
在软件开发的生命周期中,软件测试扮演着至关重要的角色。随着技术的不断进步和软件项目的日益复杂化,传统的手动测试方法已经无法满足高效、准确的测试需求。自动化测试作为一种提高测试效率和质量的有效手段,越来越受到开发者和测试者的青睐。本文将深入探讨自动化测试框架的重要性、常见的自动化测试工具以及如何选择合适的自动化测试框架。
38 10
|
22天前
|
机器学习/深度学习 前端开发 测试技术
探索软件测试中的自动化测试框架选择与优化策略####
本文深入探讨了在当前软件开发生命周期中,自动化测试框架的选择对于提升测试效率、保障产品质量的重要性。通过分析市场上主流的自动化测试工具,如Selenium、Appium、Jest等,结合具体项目需求,提出了一套系统化的选型与优化策略。文章首先概述了自动化测试的基本原理及其在现代软件开发中的角色变迁,随后详细对比了各主流框架的功能特点、适用场景及优缺点,最后基于实际案例,阐述了如何根据项目特性量身定制自动化测试解决方案,并给出了持续集成/持续部署(CI/CD)环境下的最佳实践建议。 --- ####
|
2月前
|
测试技术 API 项目管理
API测试方法
【10月更文挑战第18天】API测试方法
49 1
|
2月前
|
测试技术 UED
软件测试中的“灰盒”方法:一种平衡透明度与效率的策略
在软件开发的复杂世界中,确保产品质量和用户体验至关重要。本文将探讨一种被称为“灰盒测试”的方法,它结合了白盒和黑盒测试的优点,旨在提高测试效率同时保持一定程度的透明度。我们将通过具体案例分析,展示灰盒测试如何在实际工作中发挥作用,并讨论其对现代软件开发流程的影响。
|
26天前
|
测试技术 开发者 UED
探索软件测试的深度:从单元测试到自动化测试
【10月更文挑战第30天】在软件开发的世界中,测试是确保产品质量和用户满意度的关键步骤。本文将深入探讨软件测试的不同层次,从基本的单元测试到复杂的自动化测试,揭示它们如何共同构建一个坚实的质量保证体系。我们将通过实际代码示例,展示如何在开发过程中实施有效的测试策略,以确保软件的稳定性和可靠性。无论你是新手还是经验丰富的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。
|
24天前
|
jenkins 测试技术 持续交付
软件测试中的自动化测试策略
在当今快速发展的软件行业中,自动化测试已成为确保软件质量和效率的关键工具。本文将探讨自动化测试的重要性、实施策略以及面临的挑战,旨在为软件开发团队提供实用的指导和建议。
|
28天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
73 2
|
1月前
|
测试技术
探索软件测试中的“思维侧翼”——如何以创新思维引领测试策略###
本文旨在探讨软件测试领域中,如何通过培养与运用创新思维,提升测试策略的有效性与效率。不同于传统的技术解析或理论阐述,本文将以“思维侧翼”为喻,启发读者从不同维度审视软件测试,寻找突破常规的思路与方法。我们相信,在快速迭代的软件开发周期中,灵活多变且富有创造力的测试思维,是发现潜在缺陷、保障产品质量的关键。 ###
|
1月前
|
测试技术 定位技术 UED
软件测试的艺术:探索性测试的深度与广度
【10月更文挑战第22天】在软件开发的广阔舞台上,测试扮演着不可或缺的角色。本文将带领读者深入理解探索性测试(Exploratory Testing)的精髓,揭示其在现代软件质量保证中的价值。我们将通过实际案例、生动比喻和具体步骤,展现如何像艺术家一样进行软件测试,确保产品质量的同时,提升测试的效率和乐趣。文章不仅适合初学者建立测试基础,也能帮助资深测试人员深化对探索性测试的理解和应用。
|
1月前
|
监控 安全 jenkins
探索软件测试的奥秘:自动化测试框架的搭建与实践
【10月更文挑战第24天】在软件开发的海洋里,测试是确保航行安全的灯塔。本文将带领读者揭开软件测试的神秘面纱,深入探讨如何从零开始搭建一个自动化测试框架,并配以代码示例。我们将一起航行在自动化测试的浪潮之上,体验从理论到实践的转变,最终达到提高测试效率和质量的彼岸。