『软件测试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…


四、写在最后



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

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

相关文章
|
1月前
|
人工智能 搜索推荐 数据管理
探索软件测试中的自动化测试框架选择与优化策略
本文深入探讨了在现代软件开发流程中,如何根据项目特性、团队技能和长期维护需求,精准选择合适的自动化测试框架。
98 8
|
2月前
|
测试技术
软件测试的艺术:探索式测试的实践与思考
在软件开发的广阔海洋中,测试是确保航船稳健行驶的关键。本文将带你领略探索式测试的魅力,一种结合创造性思维和严格方法论的测试方式。我们将一起揭开探索式测试的神秘面纱,了解其核心概念、实施步骤和带来的效益。通过实际代码示例,你将学会如何将探索式测试融入日常的软件质量保证流程中,提升测试效率与质量。
|
1月前
|
数据采集 监控 机器人
浅谈网页端IM技术及相关测试方法实践(包括WebSocket性能测试)
最开始转转的客服系统体系如IM、工单以及机器人等都是使用第三方的产品。但第三方产品对于转转的业务,以及客服的效率等都产生了诸多限制,所以我们决定自研替换第三方系统。下面主要分享一下网页端IM技术及相关测试方法,我们先从了解IM系统和WebSocket开始。
50 4
|
1月前
|
测试技术 持续交付
探索软件测试中的自动化测试策略
随着软件开发周期的加速和市场需求的不断增长,传统的手动软件测试方法已难以满足现代软件开发的高效性和准确性要求。本文旨在探讨自动化测试在软件测试中的重要性、实施策略及其对提高软件质量的影响。通过分析自动化测试的优势与挑战,以及提供实用的自动化测试工具和框架选择指南,旨在帮助读者理解并应用自动化测试以提升软件开发效率和产品质量。
|
1月前
|
机器学习/深度学习 人工智能 监控
软件测试中的自动化测试策略与最佳实践##
在当今快速发展的软件行业中,自动化测试已成为确保软件质量和加速产品上市的关键工具。本文将探讨自动化测试的重要性,分析不同类型的自动化测试工具和框架,并深入讨论实施自动化测试的最佳实践。通过案例研究和数据分析,我们将揭示如何有效整合自动化测试到软件开发生命周期中,以及它如何帮助团队提高测试效率和覆盖率。 ##
62 1
|
2月前
|
测试技术 UED 开发者
软件测试的艺术与科学:探索有效的测试策略
在软件开发的宇宙中,测试是一颗璀璨的星辰,它不仅保障着产品的质量,也指引着项目的方向。本文将带你穿梭于测试的银河系,从基础的单元测试到复杂的集成测试,再到全面的系统测试,我们将一探究竟。你会发现,每一个测试阶段都是一次对代码深度和广度的挑战,也是一次对开发者耐心和智慧的考验。准备好了吗?让我们开始这段探索之旅,看看如何通过精心设计的测试案例来确保我们的软件能够在现实世界中稳健运行。
|
1月前
|
Java 测试技术 API
探索软件测试中的自动化测试框架
本文深入探讨了自动化测试在软件开发中的重要性,并详细介绍了几种流行的自动化测试框架。通过比较它们的优缺点和适用场景,旨在为读者提供选择合适自动化测试工具的参考依据。
|
1月前
|
数据管理 测试技术 持续交付
软件测试中的自动化测试策略与最佳实践
在当今快速迭代的软件开发环境中,自动化测试已成为确保软件质量和加速产品上市的关键手段。本文旨在探讨软件测试中的自动化测试策略,包括选择合适的自动化测试工具、构建有效的自动化测试框架以及实施持续集成和持续部署(CI/CD)。通过分析自动化测试的最佳实践,本文为软件开发团队提供了一系列实用的指南,以优化测试流程、提高测试效率并减少人为错误。
70 4
|
1月前
|
监控 测试技术 定位技术
探索软件测试中的自动化测试框架选择与实施###
本文不概述传统意义上的摘要内容,而是直接以一段对话形式引入,旨在激发读者兴趣。想象一下,你是一名勇敢的探险家,面前摆满了各式各样的自动化测试工具地图,每张地图都指向未知的宝藏——高效、精准的软件测试领域。我们将一起踏上这段旅程,探讨如何根据项目特性选择合适的自动化测试框架,并分享实施过程中的关键步骤与避坑指南。 ###
49 4
|
1月前
|
测试技术 持续交付 数据安全/隐私保护
软件测试的艺术与科学:探索自动化测试框架
在软件开发的世界中,测试是确保产品质量的关键环节。本文将深入探讨自动化测试框架的重要性和实现方法,旨在为读者揭示如何通过自动化测试提升软件测试效率和准确性。我们将从测试的基本概念出发,逐步引导读者了解自动化测试框架的设计和实施过程,以及如何选择合适的工具来支持测试活动。文章不仅提供理论知识,还将分享实用的代码示例,帮助读者将理论应用于实践。无论你是测试新手还是经验丰富的开发者,这篇文章都将为你打开一扇通往更高效、更可靠软件测试的大门。
38 1