测试开发人员如何进行局部探索性测试?一张图告诉你
我们都知道全局探索性测试的漫游测试法,也知道局部探索性测试可以从用户输入、状态、代码路径、用户数据和执行环境测试着手点。
那么,如果我们能够获取开发代码,我们怎么从代码入手,进行具体的局部探索性测试呢?
简单回顾
在进行具体的案例讲解前,我们先简单回顾下局部探索性测试的用户输入、状态、代码路径、用户数据和执行环境测试方法。
一张图说明一切。
图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() 在代码中的使用方式&…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
Java并发编程实战 Day 11:并发设计模式
【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天,今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案,它们不仅提供了优雅的设计思路,还能显著提升系统的性能…...
从零手写Java版本的LSM Tree (一):LSM Tree 概述
🔥 推荐一个高质量的Java LSM Tree开源项目! https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree,专为高并发写入场景设计。 核心亮点: ⚡ 极致性能:写入速度超…...
CppCon 2015 学习:REFLECTION TECHNIQUES IN C++
关于 Reflection(反射) 这个概念,总结一下: Reflection(反射)是什么? 反射是对类型的自我检查能力(Introspection) 可以查看类的成员变量、成员函数等信息。反射允许枚…...