白盒测试_学习总结

news2024/11/17 1:48:06

目录

一、白盒测试的概念理解

二、白盒测试的分类

1、静态分析

2、动态分析

(1)逻辑覆盖测试

a、语句覆盖

b、判定覆盖

c、条件覆盖

d、判定条件覆盖

e、条件组合覆盖

f、路径覆盖

(2)基本路径测试法

 3、总结


一、白盒测试的概念理解

        我们以往说的测试通常是基于黑盒测试,即不需要了解具体的程序代码而进行的测试。白盒测试是在程序代码的层面进行的测试,所以和黑盒测试的方法是截然不同的。

        白盒测试又称为结构测试、逻辑驱动测试,白盒测试需要遵循的四大原则

① 保证一个模块中的所有路径至少被测试一次;

② 所有逻辑值都要测试真(true)和假(false)的两种情况;

③ 检查程序的内部数据都要真实有效;

④ 检查上、下边界以及可操作范围内运行所有循环。

二、白盒测试的分类

        白盒测试主要分为静态分析和动态分析。

1、静态分析

        静态分析是指不运行代码程序,通过桌面检查、代码审查、代码走查、代码扫描工具等方式对代码和文档进行检查。

        在该阶段常见的代码错误有:

① 参数传递错误,少传递/传递错参数;

② 数组索引越界;

③ 空指针异常、未初始化直接使用;

④ 边界错误,例如int c = a / b,是否考虑 b = 0 的情况;

⑤ 经验错误,例如if(a == 3)的判定条件写成了 if(a = 3);

⑥ 算法逻辑错误,例如玩家角色受到伤害后,血量自动减1,但是实际上血量并没有减。

......

2、动态分析

        动态分是指运行代码程序,检查运行结果与预期结果的差异,并分析运行效率和健壮性等性能。

        动态分析的测试流程:

① 选取定义域内的有效值,或定义域外的无效值(等价类思想);

② 对已选取的值进行预期;

③ 用已选取值执行程序;

④ 执行结果与预期结果进行对比,不吻合则有错误。

(1)逻辑覆盖测试

         逻辑覆盖测试指的是通过对程序逻辑结构的遍历来实现程序的覆盖。当程序运行起来时,需要走到每一个item上。item语句、判定、条件、判定条件、条件组合、路径

以上6中覆盖方式发现错误的能力由弱到强变化:

① 语句覆盖 每条语句至少执行一次;

② 判定覆盖 每个判定的分支至少执行一次;

③ 条件覆盖 每个判定的每个条件应渠道各种可能的值;

④ 判定条件覆盖 同时满足判定覆盖和条件覆盖;

⑤ 条件组合覆盖 每个判定中各条的每一种组合至少出现一次;

⑥ 路径覆盖 时程序中每一条可能的路径至少执行一次。

        在这个过程中,代码覆盖率要尽可能的高。

代码覆盖率:

 覆盖率 = 至少被执行一次的 item 数  / item总数

例如:代码中一共有4条可执行的语句,设计测试用例执行了3条,则语句覆盖率为3/4 = 0.75

a、语句覆盖

        看每一行的代码是否被覆盖到。

例如:

static int logicExample(int x,int y,int magic){
        int a;
        if(x>0&&y>0){
            //语句块1
            a=x+y+10;
        }else {
            //语句块2
            a=x+y-10;
        }
        if(magic<0){
            //语句块3
            a=0;
        }
        //语句块4
        return a;
    }

程序流程图:

 

要想实现语句覆盖率达到100%,就要测试到所有的语句块,则需要执行的测试用例:

① {x = 1, y = 1, maigc = 2} ,覆盖了语句1 + 语句4,语句覆盖率:50%(2/4)

② {x = -1, y = -1, maigc = -2} ,覆盖了语句2 + 语句3 + 语句4,语句覆盖率:75%(3/4)

        但是语句覆盖的方法仍然存在局限性,对于if判定的条件,无法每一个都覆盖到,比如在上述的if条件中,范围是 x>0 && y>0,但是用例中只涉及了x=1&&y=1一种情况,无法令每个判定都被组合一遍。

使用以上测用例时,

        正确代码:if(x>0 && y >0)

        错误代码:if(x>0 || y>0)   无法被发现

可见语句覆盖不能准确的判断运算中的逻辑关系错误

在六种逻辑覆盖标准中,语句覆盖是最弱的。 

b、判定覆盖

         要求每个判定的真(true)和假(false)都至少执行一次

判定覆盖率 = 每个判定的真假值至少出现一次 / 判定结果的总数。 

 例如:针对上一个代码,做判定覆盖的时候,使得程序代码中的每一个判定至少获得一次真和一次假。

设计测试用例如下:

① {x = 1, y = 1, maigc = 2} :x>0 && y>0为true,magic<0为false;判定覆盖率:50%(2/4)

② {x = -1, y = -1, maigc = -2} :x>0&&y>0为false,magic<0为true;判定覆盖率:50%(2/4)

        但是判定覆盖会忽略条件中取或(or) 的情况

使用以上测用例时,

        正确代码:if(x>0 && y >0)

        错误代码:if(x>0 || y>0)   无法被发现

 只要满足了判定覆盖,就一定满足语句覆盖。

c、条件覆盖

        要求判定中的每个条件至少有一次取真值,有一次取假值。并且当遇到多个if条件覆盖的情况时,需要使用到条件覆盖。

条件覆盖率 = 每个条件真假值至少出现一次 / 条件结果的总数。 

         针对上一个代码中,有2个判定,3个条件。条件结果为6个:

判定1:if(x>0 && y >0)

x>0 为真 T1,x>0 为假 -T1;

y>0 为真 T2,y>0 为假 -T2;

判定2:if(magic<0)

magic<0 为真 T3,magic<0 为假 -T3;

        则要想每个条件至少有一次真一次假,可以设计测试用例如下:

T1,-T2,T3

-T1,T2,-T3

已经满足每个条件至少有一次真一次假了。可以设计测试用例为:

① {x = 3, y = 0, maigc = -2} 条件覆盖率:50%(3/6)

② {x = -3, y = 1, maigc = 2} 条件覆盖率:50%(3/6)

        但是针对该用例,判定1为真的情况并没有涉及。因此条件覆盖并不能保证判定覆盖。 

d、判定条件覆盖

         要求判定中的每个条件至少有一次取真值,有一次取假值,并且每个判定至少有一次取真值,有一次取假值

判定条件覆盖率 = 每个判定真假值和条件真假值至少出现一次 / (判定结果的总数 + 条件结果的总数)

即同时满足100%判定覆盖和100%条件覆盖。

         针对上一个代码中,有2个判定,3个条件。条件结果为6个,判定结果为4个:

判定1:if(x>0 && y >0)

x>0 为真 T1,x>0 为假 -T1

y>0 为真 T2,y>0 为假 -T2

判定2:if(magic<0)

magic<0 为真 T3,magic<0 为假 -T3

判定1为真 P1,判定1为假 -P1

判定2为真 P2,判定2为假 -P2

        则要想满足每个判定和每个条件的真假值至少出现一次,可以设计测试用例如下:

T1,T2,T3  =>P1,P2

-T1,-T2,-T3   =>-P1,-P2

已经满足每个判定和每个条件的真假值至少出现一次了。可以设计测试用例为:

① {x = 3, y = 3, maigc = -2} 判定条件覆盖率:50%((3+2)/(6+4))

② {x = -3, y = 0, maigc = 2} 判定条件覆盖率:50%((3+2)/(6+4))

        满足判定条件覆盖,一定满足条件覆盖、判定覆盖和语句覆盖。

        但是判定条件覆盖会忽略条件取或(or)的情况

 使用以上测用例时,

        正确代码:if(x>0 && y >0)

        错误代码:if(x>0 || y>0)   无法被发现

e、条件组合覆盖

        要求每个判定中条件结果的所有可能组合至少执行一次。

         针对上一个代码中,有2个判定,3个条件。判定1有2个条件,判定2有1个条件。则判定1的条件组合为4个,判定2的条件组合为2个。

判定1:if(x>0 && y >0)

x>0 为真 T1,x>0 为假 -T1

y>0 为真 T2,y>0 为假 -T2

判定2:if(magic<0)

magic<0 为真 T3,magic<0 为假 -T3

判定1为真 P1,判定1为假 -P1

判定2为真 P2,判定2为假 -P2

判定1的条件组合:

        T1,T2

        -T1,-T2

        -T1,T2

        T1,-T2

判定2的条件组合:

        T3

        -T3

        设计的测试用例:

T1、T2、T3

-T1、-T2、-T3

T1,-T2,T3

-T1,T2,-T3 

        条件组合覆盖满足语句覆盖、判定覆盖、条件覆盖、判定条件覆盖。但条件组合覆盖不能保证所有的路径被执行。 

f、路径覆盖

        覆盖被测试程序中的所有可能路径,是最强的覆盖准则。

        设计测试用例:

a-b-d-f => T1,T2,T3

a-b-e-f => T1,T2,-T3

a-c-d-f => -T1,T2,T3

a-c-e-f => -T1,T2,-T3

T2为假的情况并未涉及。

        路径覆盖可以对程序进行彻底的测试,比前面5种覆盖面都要广。但是满足路径覆盖,并不一定能满足条件覆盖,也就不能满足条件组合覆盖。

(2)基本路径测试法

         路径覆盖要覆盖程序中所有可能的路径,但是但路径数目很庞大时,无法真正做到覆盖所有的路径。

         基本路径测试法就是在程序控制流图的基础上,通过分析控制流图的环形复杂度,导出基本可执行的集合。保证被测程序的每一条可执行语句至少执行一次

程序控制流图:

 3、总结

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

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

相关文章

Arduino基础入门学习——BH1750(GY-302)+ LED模拟自动路灯的实现

BH1750&#xff08;GY-302&#xff09; LED 一、前言三、准备工作四、程序代码五、运行结果六、结束语 一、前言 相信很多人都见过一种路灯&#xff0c;白天的时候它是不亮的&#xff0c;等到了晚上环境变暗时就开始它的照明工作了&#xff0c;不了解的人可能认为是人为操纵它工…

如何编写Prompt,利用AI高效生成图表——图表狐(FoxChart)指南

在数据可视化领域&#xff0c;图表是数据的重要表达方式。为了让更多人能够轻松高校地生成美观、专业的图表&#xff0c;图表狐(FoxChart)应用而生。然而&#xff0c;要想充分发挥AI的潜力&#xff0c;编写合适的Prompt至关重要。本文介绍一些编写Prompt的原则&#xff0c;帮助…

代码随想录算法训练营第39天|198.打家劫舍、 213.打家劫舍II、337. 打家劫舍 III

目录 198.打家劫舍1、题目描述2、思路3、code4、复杂度分析 213.打家劫舍II1、题目描述2、思路3、code4、复杂度分析 337. 打家劫舍 III1、题目描述2、思路3、code4、复杂度分析 198.打家劫舍 题目链接&#xff1a;添加链接描述 1、题目描述 你是一个专业的小偷&#xff0c;计…

8、用户行为数据同步

1、 数据通道 用户行为数据由Flume从Kafka直接同步到HDFS&#xff0c;由于离线数仓采用Hive的分区表按天统计&#xff0c;所以目标路径要包含一层日期。具体数据流向如下图所示。 2、 日志消费Flume配置概述 按照规划&#xff0c;该Flume需将Kafka中topic_log的数据发往HDFS。…

cmake编译MQTT-C源码

Windows端编译MQTT-C源码&#xff0c;获取mqttc库&#xff08;动态库与静态库&#xff09;&#xff0c;用于集成到Qt工程中使用mqtt订阅与发布功能。 编译源码与编译出来的mqttc动态库、静态库下载​​​​​​​​​​​​​​https://download.csdn.net/download/qq_38159549…

直播怎么录屏?录屏网页的工具有吗?推荐这3款你千万不要错过~

直播与网页录屏&#xff1a;三款必备录屏软件推荐 为什么要记录直播&#xff1f;直播可以捕捉实时发生事件&#xff0c;是真真实实的one take&#xff0c;更重要的是可以记录直播画面中的实时弹幕、评论区的互动&#xff0c;无论是激动人心的体育赛事、教育课程还是互动性强的连…

C++11 14 17 20 23进化史

C11、C14、C17、C20和C23是C语言标准的不同版本&#xff0c;它们之间在功能、特性和语法上存在一些区别。以下是对这些版本主要区别的概述&#xff1a; C11 C11是C语言的一个重要标准&#xff0c;引入了大量新特性和改进&#xff0c;使C变得更加易用和强大。主要特性包括&…

Qt工程使用MQTT-C库与mqtt服务器数据通信

实现mqtt订阅与发布话题&#xff0c;与mqtt服务器进行数据通信 编译环境&#xff1a;Qt5.15.2 vs2019 需要mqttc库&#xff1a;mqttc.lib, mqttc.dll&#xff08;根据MQTT-C源码编译出来的库&#xff0c;参考cmake编译MQTT-C源码-CSDN博客&#xff09; 一、Qt pro文件编写 …

android kotlin 基础复习 继承 inherit

1、新建文件kt 2、代码&#xff1a; /**用户基类**/ open class Person1(name:String){/**次级构造函数**/constructor(name:String,age:Int):this(name){//初始化println("-------基类次级构造函数---------")println("name:${name},age:${age}")} }/**子…

信息安全工程师(1)计算机网络分类

一、按分布范围分类 广域网&#xff08;WAN&#xff09;&#xff1a; 定义&#xff1a;广域网的任务是提供长距离通信&#xff0c;运送主机所发送的数据。其覆盖范围通常是直径为几十千米到几千千米的区域&#xff0c;因此也被称为远程网。特点&#xff1a;连接广域网的各个结点…

计算机毕业设计 财会信息管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

【吊打面试官系列-Redis面试题】怎么理解 Redis 事务?

大家好&#xff0c;我是锋哥。今天分享关于【怎么理解 Redis 事务&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 怎么理解 Redis 事务&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 1&#xff09;事务是一个单独的隔离操作&#xff1…

【LabVIEW学习篇 - 22】:ActiveX

文章目录 ActiveXActiveX打开Windows颜色选择对话框ActiveX将浏览器嵌入到前面板 ActiveX ActiveX是微软推出的一个开放的技术集的统称&#xff0c;它是很早之前出现的OLE(object linking and Embedding)技术的扩展&#xff0c;它是基于COM(Component Object Model)技术而建立…

meta元素

1&#xff0c;meta元素有4个全局属性 charset 设置文档的编码类型&#xff0c;通常设置为utf-8 <meta charset"utf-8" /> content 配合name或者http-equiv属性使用&#xff0c;为其value、 name 元数据名称(name的值)说明application name当前页所属Web应用系…

进程替换篇

文章目录 目录 前言 1.进程替换概念 2.进程替换的原理 3.进程替换的接口 4.接口功能验证 ①execl接口演示 ②execlp接口演示 ③execle接口演示 ④execv接口验证 5.尝试写一个自己的shell【了解】 前言 你一定见过类似于这样的“黑框框”&#xff0c;这个“黑框框”其实就是…

js 请求api + 解析数据 2个例子

起因&#xff0c; 目的: 补补 js 基础。 例1&#xff0c; 请求天气 api&#xff0c; 天气数据api js 中的 await await 关键字只能在 async 函数内部使用。函数内部可以使用 await&#xff0c;但是在函数外部直接使用 await 是不允许的。 async function fetchWeatherData…

[mysql]最基本的SELECT...FROM结构

第0种&#xff1a;最基本的查询语句 SELECT 字段名&#xff0c;字段名 FROM 表名 SELECT 1&#xff1b; SELECT 11,3*2&#xff1b; FROM SELECT 11,3*2 FROM DUAL&#xff1b;#dual&#xff1a;伪表 我们可以用它来保持一个平衡 这里我们的值不需要在任何一个表里&#xf…

MyBaits的初理解

一.Mybaits的简介 Mybaits就是对JDBC的简化&#xff0c;就是对持久化的实现。 二.基础 需要导的dependencies <dependencies><!-- mybatis依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId>&l…

第 5 章多视图几何

本章讲解如何处理多个视图&#xff0c;以及如何利用多个视图的几何关系来恢复照相机位置信息和三维结构。通过在不同视点拍摄的图像&#xff0c;我们可以利用特征匹配来计算出三维场景点以及照相机位置。本章会介绍一些基本的方法&#xff0c;展示一个三维重建的完整例子&#…

获取多行文本内容,去掉首尾空格、去掉空字符串,解析为文本数组

核心代码 // 获取多行文本内容&#xff0c;去掉首尾空格、去掉空字符串&#xff0c;解析为文本数组 getMultiLineTexts(textareaValue) {return textareaValue.split("\n").map((v) > v.split("\t").join("").trim()).filter((v, i, ar) &g…