第16章 基于结构的测试技术(白盒测试技术)

一、静态测试技术

(一)概述

  • 不运行程序代码的情况下,通过质量准则或其他准则对测试项目进行检查的测试类型,人工或工具检查。

1、代码检查

2、编码规则检查

3、静态分析

静态分析概述
  • 不需要执行程序
控制流分析

通过生成程序的有效控制流图,分析代码

(1)控制流图绘制
  • 圆圈
  • 箭头(边)
  • 区域
    结点和箭头围成的封闭的空间就是一个区域
  • 绘制
    一组顺序结构:简化为一个圈
    汇聚结点:分叉之后没有闭合就需要加一个空圆圈
    复合条件表达式
    在这里插入图片描述
total = total + grade;
counter =counter + 1,
i=i+ 1;

在这里插入图片描述

if (grade >= 45)printf( “Passed\n” );
elseprintf( “Failed\n” );printf(“%s\n”,grade>=45?“Passed\n”:“Failed\n”);

Case多分支

switch(grade)case 'A':case 'a':++aCount;Break;……default:++dCount;Break;

在这里插入图片描述

	int product=2;while(product<=1000)product=2*product;

在这里插入图片描述

	int couter=l;do{printf(“%d”,counter);}while(++counter<=10);

在这里插入图片描述

int fT(int x ,int y , int z)
{if (y>1 && z==0)		//1 //2{x=(int)(x/y);				//3}if(y==2 || x>1)				//4 //5{x=x+1;						//6}return x;						//7
}
(2)McCabe圈复杂度
  • V(g)=边的数量-节点数量+2
  • V(g)=判断节点数+1
  • V(g)=封闭区域数+1
(3)圈度复杂性建议
  • 我们采用独立路径覆盖方法时,独立路径最大的数量是几条。
(4)独立路径
  • 一条路径中至少有一段路径在之前的路径中没有包含过的就是独立路径。
(5)函数调用关系图
  • 扇入
    当前模块被调用的次数叫做扇入;
    一个模块的扇入越大,就说明当前模块在系统中被重复利用的次数就越多,说明当前模块的通用性就越强。
  • 扇出
    一个模块要完成其功能,需要调用其他模块的数量;
    一个模块的扇出数越大,说明当前模块越复杂,一般不建议扇出数大于7
  • 扇入扇出应用
数据流分析
  • 测试变量设置点和使用点之间的路径的情况,称为“定义-使用对”或“设置-使用对”。

  • 通过“定义一使用对”能发现缺陷

    • 所使用的变量没有被定义(未定义),严重错误
    • 变量被定义,但从来没有使用(未使用),可能是编程错误
    • 变量在使用之前被定义了两次(重复定义),可能是编程错误
    • 撤销变量之后再使用,严重错误(考虑变量撤销情况)
    • 变量被定义随后又被撤销随后又被定义,可能是编程错误(考虑变量撤销情况)
    • 所撤销的变量没有被定义,可能是编程错误(考虑变量撤销情况)
    • 变量撤销后又再次被撤销,可能是编程错误(考虑变量撤销情况)
接口分析

接口一致性
主要是检查接口的情况。
内容

  • 形参与实参在类型、数量、维数、顺序、使用上的一致性
  • 全局变量和公共数据区在使用上的一致性
表达式分析

表达式分析纠正的错误

  • 在表达式中不正确地使用了括号造成错误
  • 数组下标越界造成错误
  • 除数为零造成错误
  • 对负数开平方,或对π求正切造成错误

(二)代码检查概述

  • 在编译和动态测试之前
  • 快速找出软件的一些缺陷的本质(黑盒是表面)
  • 能发现30%~70%左右的逻辑设计和编码的缺陷

(三)代码检查形式

1、代码审查

  • 按照程序所使用的语言和编码的规范,对照已经经过评审和确认的检查单,检查相关项目的代码。
  • 为了检查代码设计的一致性和标准是否按照约定标准在执行、代码的逻辑表达是否正确等

2、代码走查

  • 测试组人员扮演计算机角色,沿着程序的逻辑逐步运行设计好的测试用例检查程序,查找软件的缺陷

(四)代码检查的常见项目

  • 检查变量的交叉引用表
  • 检查标号的交叉引用表
  • 检查子程序、宏、函数
  • 等价性检查
  • 常量检查
  • 标准检查
  • 风格检查
  • 比较控制流
  • 选择、激活路径
  • 对照程序的规格说明,比较实际的代码和期望的代码,从差异中发现问题和错误
  • 补充文档

二、动态测试技术

(一)基于结构的动态测试用例设计原则

分为基于数据流控制流两类

  • 保证一个模块中的所有独立路径至少被使用一次
  • 对所有逻辑值均需测试true和false
  • 在上下边界及可操作范围内运行所有循环
  • 检查内部数据结构以确保其有效性

(二)基于控制流设计用例

在这里插入图片描述

int function1(bool a,bool b,bool c)
{int x;x=0;if(a&&(b||C)){x=1;}return x;
}

1、方法

(1)语句测试

(a)选择足够多测试数据,使每条语句都覆盖一次
(b)测试集是程序代码,测试条件是代码中可执行语句,测试覆盖项要覆盖每一条可执行的雨具。
(c)测试语句:x=0;if(a&&(b||C));x=1;return x;
(d)覆盖强度不强,可能检测不了逻辑与和逻辑或写错的情况
- 测试用例
- 用例1:a=T, b= T, c=T
预期结果x=1

(2)分支测试

(a)设计足够多测试用例,使程序中的每个分支都被覆盖
(b)可能检测不出逻辑与和逻辑或写错的情况
- 测试用例
- 用例1:a=T,b=T,C=T
预期结果x=1
- 用例2:a=F,b=F,C=F
预期结果x=0

(3)判定测试

(a)设计足够多测试用例,使程序中的==每个判定条件的取值(T/F)==都要被覆盖
(b)可能检测不出逻辑与和逻辑或写错的情况

  • 用例1:a=T,b=T,C=T
    预期结果x=1
  • 用例2:a=F,b=F,C=F,预期结果x=0
  • 判定测试与分支测试区别
float changeSalary( int serviceYear,int age, float salary)
{if(serviceYear<=5){if(age>30){salary *=1.2;}}else{salary *=2.0;}return salary;
}
  • 基本块
    形如{
    salary *=1.2;
    }这样的就是一个基本块,指程序的一组顺序执行的语句,只有一个入口和一个出口(if是入口,}是出口)
    在这里插入图片描述
  • 100%覆盖
    所有的边和判断都被覆盖,此时分支和判断无区别
  • 不完全覆盖
    分支测试覆盖率和判定测试覆盖率会产生差异
    • 测试用例:
      • serviceYear=10
      • age=40
      • salary=5000.00
      • 预期输出:10000.00
    • B1→B5→ B6
    • 判定覆盖率:1/4=25.00%
    • 分支覆盖率:2/7=28.57%
(4)分支条件测试

(a)设计足够多测试用例,使每个判定语句的取值,以及每个判定条件的取值都被覆盖
(b)可能检测不出逻辑与和逻辑或

  • 测试用例:
    • 用例1:a=F,b=T,C=F,
      预期结果x=0
    • 用例2:a=T,b=F,C=T
      预期结果x=1
(5)分支条件组合测试

(a)设计足够多测试用例,使每个判断中,所有条件的各种可能组合都被覆盖
(b)n个条件有2的n次方种测试用例
(c)覆盖强度最强,但工作量比较大

  • 测试用例:
    • 用例1: a=F,b= F ,c=F
      用例2: a=T,b=F,c= F
      用例3: a=F,b=T,c=F
      用例4: a=F,b=F,c=T
      用例5: a=T,b=T,c=F
      用例6: a=T,b=F,c=T
      用例7: a=F,b=T,c=T
      用例8: a=T,b=T,c=T
(6)修正条件判定测试

(a)保证测试覆盖强度的基础上,减少分支条件组合覆盖测试用例的数量 的一种基于控制流的动态的测试技术。
(b)设计足够多的测试用例,来确定各个条件能够影响到包含的判定结果
(c)步骤:

  • MC/DC首先要求实现分支条件覆盖在此基础上,对于每一个条件C,要求存在符合以下条件的两次计算:
  • 条件C所在判定内的所有条件,除条件C外,其他条件的取值完全相同
  • 条件C的取值相反
  • 判定的计算结果相反

(三)基于数据流设计用例

1、数据流

  • 通过选择的定义-使用的覆盖率来导出测试用例集,覆盖测试项中变量定义和使用间的路径。

2、定义-使用

(1)定义
  • 给变量赋值的过程;
(2)使用
  • 在程序中用到这个变量但没有给它赋值的过程。
  • 分为计算使用和谓词使用。
    计算使用:一个变量作为其他变量定义、或者输出的计算输入。
    谓词使用:用变量作为判定条件(谓词)的结果。

3、特征集

  • 基于数据流的测试中,测试特征集是被测的代码段。

4、测试条件

  • 代码中的定义-使用对。

5、测试覆盖项

  • 全定义测试
  • 全计算使用测试
  • 全谓词使用测试
  • 全使用测试
  • 全定义–使用路径测试

6、测试用例

(1)测试用例的覆盖率
  • 执行对应测试用例所覆盖到的测试项占整个待测试项的百分比
(2)全定义测试
  • 从变量定义到使用的控制流子路径
  • 要求覆盖变量所有定义,要覆盖从定义到其谓词使用或计算使用的至少一个子路径
(3)全计算使用测试
  • 从变量定义到该定义所有计算使用的控制流子路径
  • 要求至少覆盖一次变量从定义到其计算使用的自由子路径
(4)全谓词使用测试
  • 从变量定义到该定义所有谓词使用的控制子路径
  • 要求至少覆盖一次变量从定义到其谓词使用的自由子路径
(5)全使用测试
  • 从变量定义到该定义的所有使用的控制子路径
  • 要求至少覆盖一次变量从定义到它的每个使用的自由子路径
(6)全定义–使用路径测试
  • 从每个变量定义到该定义的每次使用(包括谓词使用和计算使用)的所有控制流子路径
  • 要求覆盖到从每个变量定义到它的每次使用的所有无环子路径(从定义到使用的过程中,对这个变量不再做第二次定义)
    全使用测试和全定义–使用路径测试的区别

例如当定义到计算使用有两条路径时,全使用只需要测试其中一条路径即可,但是全定义–使用必须把这两条路径都测试了。

7、示例

(1)定义、使用分析

程序+流图
表

(2)全定义测试:定义-使用对

在这里插入图片描述
在这里插入图片描述

(3)全定义测试:测试覆盖项

在这里插入图片描述

(4)全定义测试:测试用例

在这里插入图片描述
在这里插入图片描述

(5)全计算使用测试:定义-使用对

在这里插入图片描述
在这里插入图片描述

(6)全计算使用测试:测试覆盖项

在这里插入图片描述

(7)全计算使用测试:测试用例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(8)全谓词使用测试:定义-使用对

在这里插入图片描述
在这里插入图片描述

(9)全谓词使用测试:测试覆盖项

在这里插入图片描述

(10)全谓词使用测试:测试用例

在这里插入图片描述
在这里插入图片描述

(11)全使用测试:定义-使用对

在这里插入图片描述
在这里插入图片描述

(12)全使用测试:测试覆盖项

在这里插入图片描述
在这里插入图片描述

(13)全使用测试:测试用例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(14)全定义-使用测试:定义-使用对

在这里插入图片描述
在这里插入图片描述

(15)全定义-使用测试:测试覆盖项

在这里插入图片描述
在这里插入图片描述

(16)全定义-使用测试:测试用例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、基于结构的测试辅助技术

(一)词法和语法分析

1、标号交叉引用表

2、变量交叉引用表(变量定义与引用表)

3、子程序、宏和函数表

4、等价表

5、常数表

(二)程序插桩和驱动分析

1、程序插桩技术

2、程序驱动技术

四、基于结构测试的综合策略

  • 应尽量先用工具对被测软件进行静态分析
  • 可采取先静态后动态的组合方式
  • 覆盖率是对动态测试用例设计是否充分的监督
  • 根据安全风险要求,应使用与之对应的覆盖率标准来衡量代码需要被多少测试用例进行充分测试
  • 在不同的测试阶段,测试的侧重点不同
    • 单元测试阶段
      • 代码检查和静态分析度量工具检查和动态测试为主
    • 系统测试阶段
      • 在使用编码规则检查和静态分析度量工具对代码进行扫描检查后,主要根据黑盒测试的结果,采取相应的白盒测试作为补充

五、测试覆盖准则

1、ESTCA覆盖准则

  • 规则1(为了检测rel符号的错误)
    • 对于ArelB(rel可以是<、>、=)型分支谓词
    • 应适当地选择A与B的值,使得当测试执行到该分支语句时,A>B、A<B、A=B的情况分别出现一次
  • 规则2(为了检查差1之类的错误)
    • 对于ArelC(rel可以是<、>;A是变量,C是常量
      )型分支谓词
    • 当rel为<时,应适当地选择A的值,使A=C-M
    • 当rel为>时,应适当地选择A的值,使A=C+MM是最小单位的正数,若A和C均为整型,则M=1
  • 规则3(为了检测程序语句中的错误,如该引用变量的却引用了常量)
    • 对于外部输入变量赋值,使其在每一测试用例中均有不同的值和符号,并与同一组测试用例中其他变量的值和符号不一致

2、层次LCSAJ覆盖准则

  • 第一层:语句覆盖
  • 第二层:分支覆盖
  • 第三层:LCSAJ覆盖(即程序中的每一个LCSAJ都至少在测试中被经历过一次)
  • 第四层:是两两LCSAJ覆盖(即程序中的每两个首尾相连的LCSAJ组合起来都至少在测试中被经历过一次……直到第n+2层,每n个首尾相连的LCSAJ组合起来都至少在测试中被经历过一次)

3、N-S盒图

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

六、真题

题目

阅读下列C程序,回答问题1至问题3,将解答填入答题纸的对应栏内。

int GetMaxDay(int year, int month){int maxday=0;								//1if(month>=1&&month<=12){if(month==2){if(year%4==0){if(year%100==0){if(year%400==0)maxday=29;elsemaxday=28;}elsemaxday=29;}elsemaxday=28;}else{if(month==4||month==6||month==9||month==11)maxday=30;elsemaxday=31;}}return maxday;}```#### 问答
【问题1】(6分)
请针对上述C程序给出满足100%DC(判定覆盖)所需的逻辑条件。
**答案:
Month>=1&&month<=12
Month<1||month>12
Month>=1&&month<=12&&Month==2
Month>=1&&month<=12&&Month≠2
Month>=1&&month<=12&&Month==2&&Year%4==0
Month>=1&&month<=12&&Month==2&&Year%4≠0
Month>=1&&month<=12&&Month==2&&Year%4==0&&Year%100==0
Month>=1&&month<=12&&Month==2&&Year%4==0&&Year%100≠0
Month>=1&&month<=12&&Month==2&&Year%4==0&8Year%100==0&&Year%400==0
Month>=1&&month<=12&&Month==2&&Year%64==0&&Year%100==0&&Year%400≠0
Month>=1&&month<=12&&(Month==4||Month==6||Month==9||Month==11)Month>=1&&month<=12&&Month≠4&&Month ≠6&&Month≠9&&Month≠11
或者等价的表达式**【问题2】(9分)
请画出上述程序的控制流图,并计算其环路复杂度V(G)。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5a824e5678b74894ab6a90475b8eb5a4.png)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/6368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

短视频矩阵系统源码==3年源头开发

一 短视频矩阵系统具备以下特点: 1.内容管理功能:用户可以在系统中多账号托管 一次性上传、编辑和发布多个短视频平台的内容&#xff0c;无需在每个平台上重复操作&#xff0c;从而提高工作效率并保持内容的一致性和高质量 2.批量剪辑视频:系统支持上传批量素材管理剪辑 视频…

Visual studio调试技巧

Visual studio调试技巧 bug是什么&#xff1f;Debug和ReleaseDebugRelease 如何调试VS调试快捷键调试过程中查看程序信息查看临时变量的值查看内存信息查看调用堆栈查看汇编信息查看寄存器信息 编译常见错误编译型错误链接型错误运行时错误 bug是什么&#xff1f; bug的英文释…

SAM:Segment Anything Model

论文&#xff08;ICCV&#xff0c;fackbook&#xff09;&#xff1a;Segment Anything 源码&#xff1a; https://github.com/facebookresearch/segment-anything demo&#xff1a;Segment Anything | Meta AI (segment-anything.com) 一、摘要 本文介绍了“Segment Anything…

活动回顾 | 春起潮涌——硬件驱动的量化交易与AI

4月20日&#xff0c;华锐技术ACLUB联合AMD在上海举办了“春起潮涌——硬件驱动的量化交易与AI”沙龙活动&#xff0c;会议围绕FPGA硬件加速、CPU&网卡调优、AI技术应用等展开&#xff0c;近50位量化IT与分享嘉宾一起探讨硬件技术在量化交易和AI领域的应用和创新。 FPGA在交…

【C++第七课-string用法】

这里写自定义目录标题 string的初步介绍sring的构造函数string的构造函数-重点掌握无参的构造函数用常量字符串来初始化拷贝构造 string的构造函数-非重点掌握拷贝字符串str从pos位置开始的len个字符拷贝字符串s的前n个字符用n个c去初始化 string的赋值string的遍历和访问下标[…

爬虫自动化之drissionpage实现随时切换代理ip

目录 一、视频二、dp首次启动设置代理三、dp利用插件随时切换代理一、视频 视频直接点击学习SwitchyOmega插件使用其它二、dp首次启动设置代理 from DrissionPage import ChromiumPage, ChromiumOptions from loguru

matplotlib/seaborn 绘图可视化全面总结

1.概述 使用Matplotlib 绘图实现可视化时&#xff0c;会面临不同的需求有所调整&#xff0c;本文档重点对绘图过程中产生的一些小众需求进行全面总结&#xff0c;其他任务时可以随时即抽即用。 2.绘图 2.1 一般绘图 plt.figure() 参数设置说明 matplotlib.pyplot.figure( …

C++设计模式-创建型设计模式

设计模式 设计模式是什么 设计模式是指在软件开发中&#xff0c;经过验证的&#xff0c;用于解决在特定环境下&#xff0c;重复出现的&#xff0c;特定问题的解决方案&#xff1b;其实就是解决问题的固定套路。但是要慎用设计模式&#xff0c;有一定的工程代码量之后用它比较…

【论文阅读】Tutorial on Diffusion Models for Imaging and Vision

1.The Basics: Variational Auto-Encoder 1.1 VAE Setting 自动编码器有一个输入变量x和一个潜在变量z Example. 获得图像的潜在表现并不是一件陌生的事情。回到jpeg压缩&#xff0c;使用离散余弦变换&#xff08;dct&#xff09;基φn对图像的底层图像/块进行编码。如果你给…

先电2.4的openstack搭建

先电2.4版本的openstack&#xff0c;前期虚拟机部署参考上一篇2.2版本&#xff0c;基本步骤是一样的&#xff0c;准备两个镜像文件CentOS-7.5-x86_64-DVD-1804.iso&#xff0c;XianDian-IaaS-V2.4.iso [rootcontroller ~]# cat /etc/sysconfig/network-scripts/ifcfg-eno16777…

华为OD机试 - 小扇和小船的数字游戏 - 二进制(Java 2024 C卷 200分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

论文笔记(四十五)Attention Is All You Need

Attention Is All You Need 文章概括摘要1. 介绍2. 背景3. 模型架构3.1 编码器和解码器堆栈3.2 Attention3.2.1 按比例点积Attention3.2.2 Multi-Head Attention3.2.3 注意力在模型中的应用 3.3 定位前馈网络3.4 嵌入与 Softmax3.5 位置编码 4 为什么 Self-Attention5. Trainin…

ssm104园区停车管理系统+jsp

园区停车管理系统的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管…

P9422 [蓝桥杯 2023 国 B] 合并数列

P9422 [蓝桥杯 2023 国 B] 合并数列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 用队列即可 当两个队列队首&#xff1a;a b &#xff0c;弹出 当a < b&#xff0c;把a加给其后一个元素&#xff0c;弹出a 当b < a&#xff0c;把b加给其后一个元素&#xff0c;弹出…

[初阶数据结构】时间复杂度与空间复杂度

前言 &#x1f4da;作者简介&#xff1a;爱编程的小马&#xff0c;正在学习C/C&#xff0c;Linux及MySQL。 &#x1f4da;本文收录于初阶数据结构系列&#xff0c;本专栏主要是针对时间、空间复杂度&#xff0c;顺序表和链表、栈和队列、二叉树以及各类排序算法&#xff0c;持续…

无人机+无人车:自组网协同技术及应用前景详解

无人车&#xff0c;也被称为自动驾驶汽车、电脑驾驶汽车或轮式移动机器人&#xff0c;是一种通过电脑系统实现无人驾驶的智能汽车。这种汽车依靠人工智能、视觉计算、雷达、监控装置和全球定位系统协同合作&#xff0c;使得电脑可以在没有任何人类主动操作的情况下&#xff0c;…

C++基础——输入输出(文件)

一、标准输入输出流 C 的输入输出是程序与用户或外部设备&#xff08;如文件、网络等&#xff09;之间交换信息的过程。 C 提供了丰富的标准库来支持这种交互&#xff0c;主要通过流的概念来实现。 流&#xff1a;抽象概念&#xff0c;表示一连串的数据&#xff08;字节或字…

typescript:vscode的settings配置文件配置ts语法提示

typescript&#xff1a;vscode的settings配置文件配置ts语法提示 1 找到vscode左下角的齿轮按钮 2 点击Settings&#xff08;或者快捷键ctrl,&#xff09;&#xff1a; 点击右上角的Open Settings(JSON)按钮打开配置文件&#xff1a; 或者ctrlshiftp&#xff0c;搜索settings&…

展开说说:Android实现多线程几种方式

1、线程是什么 关于线程&#xff0c;Android开发经常遇到的一个和线程相关的异常报错&#xff1a;NetworkOnMainThreadException&#xff0c;因为网络请求不可以运行在主线程&#xff08;又称UI线程&#xff09;。和网络请求一样的还有I/O操作、数据库操作等耗时任务一样都只能…

奈氏准则和香农定理

一、奈奎斯特和香农 哈里奈奎斯特&#xff08;Harry Nyquist&#xff09;(左) 克劳德艾尔伍德香农&#xff08;Claude Elwood Shannon&#xff09;(右) 我们应该在心里记住他们&#xff0c;记住所有为人类伟大事业做出贡献的人&#xff0c;因为他们我们的生活变得越来越精彩&…