测试开发人员如何进行局部探索性测试?一张图告诉你
我们都知道全局探索性测试的漫游测试法,也知道局部探索性测试可以从用户输入、状态、代码路径、用户数据和执行环境测试着手点。
那么,如果我们能够获取开发代码,我们怎么从代码入手,进行具体的局部探索性测试呢?

简单回顾
在进行具体的案例讲解前,我们先简单回顾下局部探索性测试的用户输入、状态、代码路径、用户数据和执行环境测试方法。
一张图说明一切。

图1局部探索性测试测试要点总结
具体案例讲解
本文从代码层入手,分享如何进行局部探索性测试。值得注意的是,接下来的叙述没有优先级和重要性排序,单纯是某些测试要点的启发。
比对代码改动,寻找测试要点!
随着功能的改进或者故障的修复,总会伴随代码的改动。因此,我们可以从代码改动点出发寻找测试要点。
在此,需要大家问自己几个问题:开发人员为什么要这样改?这样改有什么意义?

图2 elasticsearch开源代码提交记录:修改远程集群设置的authorization为credentials
由上图2所示,为elasticsearch开源代码某次提交记录(修改远程集群设置的authorization为credentials)。如果我们获取到这样一份代码,我们要怎么寻找测试要点呢?!
对于代码修改的原因和意义,开发人员在代码提交记录中已经声明:credentials名字更精确。而且从提交记录中,我们还可以看到有许多地方涉及的authorization被修改。因此,我们很容易就能想到一个测试要点:authorization名字修改是否覆盖完全?!
我们再来看一个样例。如下图所示,为elasticsearch的PreviewTransformAction.java某次代码变动。
从提交记录说明可以看到变动原因:目前我们按顺序序列化转换预览文档。
然而,当我们在另一端读取它们时,我们将其反序列化为散列映射,失去顺序。因此,排序时序列化毫无意义。但是在集成测试时,writeMapWithConsistentOrder的使用总使得集成测试失败,因此将其改为无功能影响的writeGenericMap。
由此我们一眼可以得出最重要的一个信息:功能不影响。
所以,对此次变更,我们应首要进行功能回归测试,确保已有功能正常。那还有没有其它测试要点呢?试试writeGenericMap是否真的是无顺序转换?

图3 elasticsearch开源代码提交记录:修改writeMapWithConsistentOrder方法调用为为writeGenericMap调用
注意覆盖代码中的分支!
开发代码中经常会有if…else、switch…case等分支,可是当我们从外部进行场景测试或功能测试时很少能覆盖完全代码中的分支,从而可能忽视某些故障。因此,可以从代码层面出发,寻找或构造能够触发代码某个分支的场景。

图4 elasticsearch的ElasticsearchException.java某部分代码1
如上图4所示,为ElasticsearchException.java某部分代码。该代码使用了if…else分支结构,面对这样的代码,我们是不是首先就会想:如何进入不同分支?进入不同分支后会有什么样的效果?
如上图所示,试试elasticsearchException不为null呢?再试试id!=127呢?更或者,试试传入的id为null呢?

图5 elasticsearch的ElasticsearchException.java某部分代码2
如图5所示,switch…case分支,想想:测试场景中覆盖完了所有case分支吗?如果没有,如何构造场景走到这些分支,尤其是default分支?
3)异常都捕获到没?
我们在测试过程中,经常由于环境或其他原因的影响造成一些异常的产生。而针对异常的捕获往往是代码中预先定义好的,但如果异常不在期望中呢?是否能够正常打印异常和捕获异常?

图6 elasticsearch的ExceptionsHelper。。java某部分代码
如图6所示,是try…catch…finally结构,但没有catch分支。假如formatStackTrace功能异常呢?能够捕获异常吗?试试。又或者ExceptionsHelper。maybeError(throwable)不存在呢?会是什么样的效果,试试。
4)不同的return返回值尝试过没?
如题所述,试试不同的返回值对调用者的影响。看看是否调用方都能够正确处理或响应。如下图7所示,试试不同case分支下的返回值,尤其是不常见用的返回值,如PARTIAL、INCOMPATIBLE等。

图7elasticsearch的SnapshotState。java某部分代码
5)如果变量不在定义的集合范围内呢?
代码中我们难免会定义一些列表或集合,会声明列表或集合元素的类型。那么,如果某个变量不在定义的类型范围内呢,要使用列表或集合的功能处理这个变量,会怎么样?

图8 elasticsearch的SnapshotsInProgress。java某部分代码
如上图8所示,定义返回类型为List<String>,如果返回值的类型不是list或者列表中的值不是String呢?想想。
6)正则表达式呢?
正则表达式是很多测试人员头疼的一点,因为人工解析不太顺畅。在此可以给大家推荐一个很好的解析器网址https://regexper.com/#%5Ba-zA-Z_0-9%5D%7B3%2C%7D。如下图所示,将正则表达式输入,就可以解析。

图9 regexper。com正则表达式解析网站
假如针对[a-zA-Z_0-9]{3,}这样的正则表达式,试试输入变量为345呢?会有什么样的效果?
7)代码中有没有写死的变量?
比如常见的引用ip、port等,是否被固定了?比如有没有用到sleep?被写死的变量会导致代码更改时容易忽略,而产生异常。而sleep 10s这样的写法会导致性能下降。试试有没有这样的问题?
8)每一条路径走完没有?
在这里可以给大家推荐一个好用的工具visustin(www.aivosto.com),可以解析代码路径,可视化输出。支持java,jsp,python等多种语言。

图10 visustin软件解析代码路径样例图
如上图所示,在visustin的帮助下,我们可以方便地看出每条路径。试试遍历所有路径?
3.总结
探索性测试的核心在于启发性思维。本文结合具体样例,简单讲述了如何从代码层面入手,开始局部探索性测试。并简单介绍了两个有用的工具regexper.com网站和visustin软件,它们可以帮助我们解析正则表达式和可视化代码路径。工欲善其事必先利其器,希望这两个软件也能帮助到你。
探索性测试是一门值得研究和探讨的课题,尤其是对于测试人员来说,对于专业能力的提升和个人职业的发展都有帮助。希望能有更多的同行加入探讨和研究。
最后:
可以到我的个人号:atstudy-js,可以免费领取一份10G软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!其中包括了有基础知识、Linux必备、Mysql数据库、抓包工具、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试持续集成、测试架构开发测试框架、性能测试等。
这些测试资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!
相关文章:
测试开发人员如何进行局部探索性测试?一张图告诉你
我们都知道全局探索性测试的漫游测试法,也知道局部探索性测试可以从用户输入、状态、代码路径、用户数据和执行环境测试着手点。 那么,如果我们能够获取开发代码,我们怎么从代码入手,进行具体的局部探索性测试呢? 简单…...
CentOS 8 上安装 Nginx
Nginx是一款高性能的开源Web服务器和反向代理服务器,以其轻量级和高效能而广受欢迎。在本教程中,我们将学习在 CentOS 8 操作系统上安装和配置 Nginx。 步骤 1:更新系统 在安装任何软件之前,让我们先更新系统的软件包列表和已安…...
【c语言进阶】字符函数和字符串函数知识总结
字符函数和字符串函数 前期背景求字符串长度函数strlen函数strlen函数三种模拟实现 长度不受限制的字符串函数strcpy函数strcpy函数模拟实现strcat函数strcat函数模拟实现strcmp函数strcmp函数模拟实现 长度受限制的字符串函数strncpy函数strncpy函数模拟实现strncat函数strnca…...
DB2实现正则表达式
DB2实现正则表达式 功能描述 db2 11.1 及以上版本支持正则表达式,但是db2 10.5及以下版本不支持正则表达式,需要手工创建正则表达式函数。 安装与卸载步骤 README.txt2010-07-30IBM IMTE - Project AvalancheAuthor: Alexandre GrancherThis file des…...
CASS数据带属性转GIS的shp数据教程
一、数据:DWG文件中含有JZD(宗地层),JZP(界址点层),其中JZP中含有界址点号,实现JZD层转成ZD的shp数据;JZP转成JZD点的shp数据,并带出界址点号。 二、实现原理…...
Jenkins配置自动化构建的几个问题
在创建构建任务时,填写git远程仓库地址时,出现以下报错 解决此报错先排查一下linux机器上的git版本 git --version 如果git 版本过低,可能会导致拉取失败,此时需要下载更高的git版本。 参考 Git安装 第二个解决办法报错信息中…...
ubuntu 命令调节显示器亮度
1.显示器名字 xrandr -q | grep " connected" HDMI-0 connected primary 1920x108000 (normal left inverted right x axis y axis) 527mm x 297mm DP-4 connected 1920x108019200 (normal left inverted right x axis y axis) 527mm x 297mm 2.调节亮度 xrandr --ou…...
打卡力扣题目七
#左耳听风 ARST 打卡活动重启# 目录 一、题目 二、解题方法一 三、解题方法二 关于 ARTS 的释义 —— 每周完成一个 ARTS: ● Algorithm: 每周至少做一个 LeetCode 的算法题 ● Review: 阅读并点评至少一篇英文技术文章 ● Tips: 学习至少一个技术技巧 ● Share:…...
【EI/SCOPUS会议征稿】第三届检测技术与自动化工程国际学术会议 (TTAE 2023)
第三届检测技术与自动化工程国际学术会议 (TTAE 2023)原定将于2023年9月15-17日在中国西安召开。 检测技术与自动化工程国际学术会议将每年举行一次,旨在将“检测技术”和“自动化工程”等学术领域的学者、专家、研发者、技术人员聚集到一个学术交流的平台…...
时序预测 | Python实现NARX-DNN空气质量预测
时序预测 | Python实现NARX-DNN空气质量预测 目录 时序预测 | Python实现NARX-DNN空气质量预测效果一览基本介绍研究内容程序设计参考资料效果一览 基本介绍 时序预测 | Python实现NARX-DNN空气质量预测 研究内容 Python实现NARX-DNN空气质量预测,使用深度神经网络对比利时空气…...
华为数字化转型之道-读书笔记1
第一章 数字化转型,华为的战略选择 1. 数字化转型是企业的必答题 1.1 解决时代难题:“鲍莫尔成本病” “体验变流量,流量变收入”是其常见的商业模式。数字化平台通过“作业即记录、记录及数据”的方式,能给企业带来很多好处&a…...
环形链表 II(JS)
环形链表 II 题目 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,…...
【字节三面】41. 缺失的第一个正数
41. 缺失的第一个正数 解题思路 在原数组上进行操作 如果数字是2 将其放在索引为1的位置上数字x 放在索引为x - 1的位置上对于长度为n的数组 其中没有出现的最小正整数只能在[1,n 1]引入如果1 - n 这些数都出现了 那么答案就是n 1如果都没有出现完全 那么答案就在[1,n]中没…...
Linux echo命令与反引号、重定向符号以及管道符
echo echo命令echo结合反引号echo结合重定向符echo结合管道符 echo命令 Linux中的echo命令用于在终端输出指定的文本内容或变量值。 基本语法如下: echo [选项] [字符串]常用选项包括: -e:启用特殊字符的解析,例如\n表示换行符…...
HTML基础知识点总结
目录 1.HTML简介 2.HTML基础结构 主要字符: 3.基础知识 (一)p标签 (二)hr标签 (三)尖角号 (四)版权号 (五)div和span div span (六)列表 (1&…...
VS附加到进程调试
操作: 要附加到进程中调试外部可执行文件,您需要使用Visual Studio的“调试附加”功能。以下是附加到进程中调试外部可执行文件的步骤: 打开您要调试的源代码文件或可执行文件。打开Visual Studio。选择“调试”菜单,然后选择“…...
基于深度学习的高精度狗狗检测识别系统(PyTorch+Pyside6+YOLOv5模型)
摘要:基于深度学习的高精度狗狗检测识别系统可用于日常生活中检测与定位120类狗狗目标,利用深度学习算法可实现图片、视频、摄像头等方式的狗狗目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型训练…...
从互联网到云时代,Apache RocketMQ 是如何演进的?
作者:隆基 2022 年,RocketMQ 5.0 的正式版发布。相对于 4.0 版本而言,架构走向云原生化,并且覆盖了更多业务场景。 消息队列演进史 操作系统、数据库、中间件是基础软件的三驾马车,而消息队列属于最经典的中间件之一…...
XML (可扩展标记语言)
目录 一、概念 二. 使用: 1. 基本语法: 2. 组成部分: (1)文档声明 (2) 指令(了解):结合css (3) 标签:标签名称自定义 (4)…...
socket()、bind()、listen()、htons()
socket() socket() 是一个系统调用函数,用于创建一个套接字(socket),通过该套接字进行网络通信。在这段代码中,socket() 函数被用于创建一个本地套接字。 具体来说,这是 socket() 在代码中的使用方式&…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
