『软件测试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月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
201 1
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
如何让AI更“聪明”?VLM模型的优化策略与测试方法全解析​
本文系统解析视觉语言模型(VLM)的核心机制、推理优化、评测方法与挑战。涵盖多模态对齐、KV Cache优化、性能测试及主流基准,助你全面掌握VLM技术前沿。建议点赞收藏,深入学习。
410 8
|
4月前
|
测试技术
软考软件评测师——可靠性测试测试方法
软件可靠性是指软件在规定条件和时间内完成预定功能的能力,受运行环境、软件规模、内部结构、开发方法及可靠性投入等因素影响。失效概率指软件运行中出现失效的可能性,可靠度为不发生失效的概率,平均无失效时间(MTTF)体现软件可靠程度。案例分析显示,嵌入式软件需满足高可靠性要求,如机载软件的可靠度需达99.99%以上,通过定量指标评估其是否达标。
|
4月前
|
消息中间件 缓存 监控
性能测试怎么做?方法、流程与核心要点解析
本文系统阐述了性能测试的核心方法论、实施流程、问题定位优化及报告编写规范。涵盖五大测试类型(负载验证、极限压力、基准比对、持续稳定性、弹性扩展)与七项关键指标,详解各阶段任务如需求分析、场景设计和环境搭建,并提供常见瓶颈识别与优化实战案例。最后规范测试报告内容框架与数据可视化建议,为企业级实践提出建立基线库、自动化回归和全链路压测体系等建议,助力高效开展性能测试工作。
|
8月前
|
编解码 缓存 Prometheus
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
本期内容为「ximagine」频道《显示器测试流程》的规范及标准,我们主要使用Calman、DisplayCAL、i1Profiler等软件及CA410、Spyder X、i1Pro 2等设备,是我们目前制作内容数据的重要来源,我们深知所做的仍是比较表面的活儿,和工程师、科研人员相比有着不小的差距,测试并不复杂,但是相当繁琐,收集整理测试无不花费大量时间精力,内容不完善或者有错误的地方,希望大佬指出我们好改进!
551 16
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
|
8月前
|
人工智能 自然语言处理 测试技术
AxBench:斯坦福大学推出评估语言模型控制方法的基准测试框架
AxBench 是由斯坦福大学推出,用于评估语言模型可解释性方法的基准测试框架,支持概念检测和模型转向任务,帮助研究者系统地比较不同控制技术的有效性。
190 5
AxBench:斯坦福大学推出评估语言模型控制方法的基准测试框架
|
设计模式 测试技术 持续交付
深入白盒测试:提升软件质量与性能的关键策略
【4月更文挑战第20天】 在软件开发的复杂世界中,确保产品的质量和性能始终是至关重要的任务。白盒测试,作为软件测试领域的重要分支,提供了对程序内部结构和逻辑的深入分析手段。本文将探讨如何通过有效的白盒测试策略来优化软件性能,减少缺陷,并最终提高用户满意度。通过剖析代码检查、单元测试、集成测试等白盒测试技术,我们将了解这些方法如何揭示潜在的问题点,并为改进提供方向。
175 2
|
供应链 测试技术
深入白盒测试:提升软件质量的关键策略
【4月更文挑战第7天】 在软件开发的复杂世界中,确保代码质量和性能的可靠性是至关重要的。白盒测试作为一种重要的软件测试方法,允许测试者通过检查内部结构、设计和编码来验证软件的正确性。本文将探讨白盒测试的核心概念、优势以及如何有效利用它来提高软件产品的质量。我们将深入分析不同的测试技术,如静态分析和动态测试,并讨论如何将这些方法应用于实际测试场景中,以便发现和修复潜在缺陷。通过案例研究和最佳实践的分享,本文旨在为读者提供一套全面的白盒测试策略,以支持他们在不断变化的技术环境中保持竞争力。
|
算法 安全 测试技术
深入探索白盒测试:提升软件质量与效率的关键策略
【4月更文挑战第11天】 在软件开发的生命周期中,确保代码质量和功能的正确性是至关重要的。白盒测试,作为一项关键的验证手段,允许测试者通过检查内部结构、设计和编码逻辑来识别软件中的缺陷和漏洞。本文将探讨白盒测试的核心概念、方法及其在提升软件测试效率和质量上的重要性。我们将分析静态分析和动态测试的策略,并讨论如何通过白盒测试优化软件开发过程。