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

news2024/11/20 13:43:03

一、静态测试技术

(一)概述

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

1、代码检查

2、编码规则检查

3、静态分析

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

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

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

在这里插入图片描述

if (grade >= 45)
	printf( “Passed\n” );
else
	printf( “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;								//1
	if(month>=1&&month<=12){
		if(month==2){
			if(year%4==0){
				if(year%100==0){
					if(year%400==0)
						maxday=29;
					else
						maxday=28;
				}
				else
					maxday=29;
			}
			else
				maxday=28;
		}
	else{
			if(month==4||month==6||month==9||month==11)
				maxday=30;
			else
				maxday=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.coloradmin.cn/o/1641845.html

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

相关文章

高边沿开关LM5050

可以用于高边沿单片机控制电路 LM5050-1/-Q1 高侧 OR-ing FET 控制器与外部 MOSFET 配合工作&#xff0c;当与电源串联时则用作理想的二 极管整流器。此 ORing 控制器可使 MOSFET 替换电 源分配网络中的二极管整流器&#xff0c;从而降低功率损耗和压 降。 LM5050-1/-Q1 控制器…

企业计算机服务器中了rmallox勒索病毒怎么处理,rmallox勒索病毒处理建议

在网络技术不断发展的时代&#xff0c;网络在企业中的应用广泛&#xff0c;可以为企业带来更多的便利&#xff0c;大大提升了企业的生产效率&#xff0c;但网络作为虚拟世界&#xff0c;在为企业提供便利的同时&#xff0c;也为企业数据安全带来严重威胁。近期&#xff0c;云天…

USB3.0线束特征阻抗测试报告解读

一. 衰减 从低频到高频&#xff0c;每个数据点都按照相对应的规范进行设置&#xff0c;形成一条标准线&#xff0c;如图1中所示&#xff0c;紫色线即为标准线&#xff0c;蓝色线为实测线。实测线在紫色线之上&#xff0c;说明线束衰减符合标准&#xff0c;反之表明线束衰减不符…

预防耳石症后遗症,了解RD的成因。

耳石症的后遗症&#xff0c;我们把它叫做RD RD的这个症状实际上它跟多因素有关。 第一个因素&#xff0c;就是跟这个病人的性格有关系的。 第二个因素&#xff0c;就是跟这个耳石复位后他这个机体的这个状态有关系。 第三个因素&#xff0c;还跟耳石的有一部分可能是真的没有…

AI大模型探索之路-训练篇12:语言模型Transformer库-Datasets组件实践

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

如何使用提示测试为LLMs构建单元测试?

原文地址&#xff1a;how-to-build-unit-tests-for-llms-using-prompt-testing 确保您的人工智能交付&#xff1a;快速测试完美生成应用程序的基本指南 2024 年 4 月 26 日 如果你曾经编写过软件&#xff0c;你就会知道测试是开发过程中必不可少的一部分。特别是单元测试&#…

windows系统网页卡死的时候 解决办法

第一种办法 同时按下ctrlshiftdelete键&#xff0c;清除缓存 如果这种办法不行&#xff0c;强制退出再打开还不行的话&#xff0c;再试第二种办法 第二种办法 打开f12开发者工具&#xff0c;如图在application标签页下&#xff0c;打开local storage&#xff0c; 右键选中virt…

Slave SQL线程与PXB FTWRL死锁问题分析

1. 问题背景 2.27号凌晨生产环境MySQL备库在执行备份期间出现因FLUSH TABLES WITH READ LOCK未释放导致备库复制延时拉大&#xff0c;慢日志内看持锁接近25分钟未释放。 版本&#xff1a; MySQL 5.7.21PXB 2.4.18 慢查询日志&#xff1a; 备份脚本中的备份命令&#xff1a;…

Hibernate执行流程分析及配置文详解

目录 1、Hibernate执行流程分析及配置文件详解 1&#xff09;Configuration对象 2&#xff09;ServiceRegistry对象&#xff08;hibernate4的新特性&#xff09; 3&#xff09;SessionFactory对象 4&#xff09;Session对象 5&#xff09;Transaction对象 6&#xff09;…

算法打卡day41

今日任务&#xff1a; 1&#xff09;198.打家劫舍 2&#xff09;213.打家劫舍II 3&#xff09;337.打家劫舍III 4&#xff09;复习day16 198.打家劫舍 题目链接&#xff1a;198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 你是一个专业的小偷&#xff0c;计划偷窃沿街…

AttributeError: module ‘numpy‘ has no attribute ‘int‘.

问题描述 复现代码过程中遇到错误&#xff1a;AttributeError: module numpy has no attribute int. 错误代码行&#xff1a; self.sf np.int(data[sf][0,...].squeeze().cpu().numpy()) # scale factor 解决方案 这是因为在Numpy 1.2.0版本中就已经弃用了这个用法&#x…

探索动态内存开辟的奥秘

✨✨欢迎&#x1f44d;&#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页&#xff1a;秋邱博客 所属栏目&#xff1a;C语言 前言 开始之前&#xff0c;我们先来了解一下C/C中程序内存区域划分。 在C/C程序中&#xff0c;内存区域通常被划分为以下几个部分&#xff1a; 1.栈&…

【基础算法总结】滑动窗口一

滑动窗口 1.长度最小的字数组2.无重复字符的最长子串3.最大连续1的个数 III4.将 x 减到 0 的最小操作数 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&…

软件测试(实验五)——Jmeter的使用

目录 实验目的 一、使用JMeter演示取样器、监听器、配置元件、断言的使用&#xff1b; 1、取样器 2、监听器 3、配置元件的使用 ① 用户定义的变量 ②HTTP信息头管理器 ③HTTP请求默认值 ④CSV数据文件设置 4、断言 ①响应断言 ②JSON断言 ③断言持续时间 二、使用…

普通二维码打开微信小程序并且传递参数

实现方法&#xff1a; 【1】确保有一个企业级别的认证过的微信小程序 【2】有一个https并且备案过的域名 【3】进入微信后台“开发”-“开发设置”-“扫普通链接二维码打开小程序”-“添加” 官方文档&#xff1a;https://developers.weixin.qq.com/miniprogram/introduction/q…

C语言实验-学生信息管理系统

按以下菜单界面编写学生信息管理系统&#xff1b; 1&#xff09;录入学生信息首先输入学生人数&#xff0c;然后根据学生人数开辟动态数组&#xff1b; 2&#xff09;学生信息包括学号、姓名、性别、三门课成绩、总分&#xff1b;其中学号、姓名、 性别、三门课成绩是需要从键盘…

YOLO自研模块:多尺度轻量化卷积模块

目录 一、原理 二、代码 三、配置文件 一、原理 不同大小的卷积核,提取目标特征的特征尺度不同,所以通过使用不同大小卷积核的卷积来提取特征就可以保证获取到目标的多尺度特征。 借鉴YOLOv8中,将通道数进行划分的操作,在卷积的输入过程中为了减小参数量,将输入通道数…

截图时,VSCode屏幕泛白

问题如图所示&#xff1a; 放弃前摇&#xff0c;直接给出解决方案&#xff1a;换个主题即可。 实测&#xff0c;Light Modern 的色域正常&#xff0c;其他的没有经过测试。 出现这个问题的原因&#xff0c;大概率就是色彩空间不匹配。 HDR 内容是为了在支持 HDR 的显示设备上展…

H3C MSTP 实验

H3C MSTP 实验 实验拓扑 ​​ 实验需求 所有交换机上创建 Vlan10&#xff0c;Vlan20&#xff0c;Vlan30 和 Vlan40所有交换机之间的端口配置为 Trunk&#xff0c;并放行相关 VLAN按照图示分区域配置 MSTP&#xff0c;并配置主备根网桥 实验步骤 VLAN基础配置&#xff08;…

C++ 多态(二)

四、多态纯虚函数 纯虚函数是在C中用来定义抽象类的一种特殊函数。纯虚函数没有具体的实现&#xff0c;只有函数声明&#xff0c;它的作用是为派生类提供一个接口&#xff0c;让派生类必须实现这个函数。如果一个类中包含了纯虚函数&#xff0c;那么这个类就是抽象类&#xff…