测试开发人员如何进行局部探索性测试?一张图告诉你

news2024/10/6 10:40:12

我们都知道全局探索性测试的漫游测试法,也知道局部探索性测试可以从用户输入、状态、代码路径、用户数据和执行环境测试着手点。

那么,如果我们能够获取开发代码,我们怎么从代码入手,进行具体的局部探索性测试呢?

简单回顾

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

一张图说明一切。

图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自动化测试、接口自动化测试、测试持续集成、测试架构开发测试框架、性能测试等。

这些测试资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

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

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

相关文章

1227. 分巧克力(简单,易懂)

输入样例&#xff1a; 2 10 6 5 5 6输出样例&#xff1a; 2 这个题就是基础的二分问题&#xff0c;做题思路&#xff1a; 找到一个数&#xff0c;让其满足&#xff0c;所有小块的边值&#xff0c;且最终的总和要大于等于我们的K 第一次做错了&#xff01;&#xff01; #in…

使用Canvas制作画板

使用Canvas制作画板 在本篇技术博客中&#xff0c;我们将使用JavaScript和Canvas技术来创建一个简单的画板应用程序。这个画板将允许用户在一个画布上绘制线条&#xff0c;使用橡皮擦擦除绘制的内容&#xff0c;更改线条的颜色和宽度&#xff0c;并支持撤销和重做功能。 准备…

Html5播放器按钮在移动端变小的问题解决方法

Html5播放器按钮在移动端变小的问题解决方法 用手机浏览器打开酷播云视频&#xff0c;有时会出现播放器按钮太小的情况&#xff0c;此时只需在<head>中加入下面这段代码即可解决&#xff1a; <meta name"viewport" content"widthdevice-width, initia…

矩阵中的路径(JS)

矩阵中的路径 题目 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是…

CopyTranslator-复制即翻译 文献翻译神器 支持多接口翻译

一、软件起源 科研人员总少不了阅读大量文献&#xff0c;理解文献内容就成了科研生活常态&#xff0c;而我们平时复制PDF内容黏贴到网页翻译的时候可能会出现多余换行而导致翻译乱码&#xff0c;译文与中文阅读习惯不符的情况&#xff0c;翻译结果很差&#xff0c;需要手动删除…

2.4 传统经验光照模型详解

一、光照模型 光照模型&#xff08;illumination model&#xff09;&#xff0c;也称为明暗模型&#xff0c;用于计算物体某点处的光强&#xff08;颜色值&#xff09;。从算法理论基础而言&#xff0c;光照模型分为两类&#xff1a;一种是基于物理理论的&#xff0c;另一种是…

《深入浅出Java虚拟机》AIC松鼠活动第五期

1、JAVA虚拟机 1.1什么是java虚拟机 Java虚拟机&#xff08;Java Virtual Machine&#xff0c;JVM&#xff09;是一种用于执行Java字节码的虚拟机。它可以将Java源代码编译为字节码&#xff0c;然后在不同的操作系统和硬件平台上运行。作为Java语言的核心组成部分&#xff0…

MySQL和Oracle区别

由于SQL Server不常用&#xff0c;所以这里只针对MySQL数据库和Oracle数据库的区别 (1) 对事务的提交 MySQL默认是自动提交&#xff0c;而Oracle默认不自动提交&#xff0c;需要用户手动提交&#xff0c;需要在写commit;指令或者点击commit按钮 (2) 分页查询 MySQL是直接在SQL…

挖了个漏洞,挣了¥12000!

今天给大家分享一个挖漏洞致富的事情。 0x01 前言 本人&#xff0c;一个热爱生活&#xff0c;热爱网络安全的小青年。在此记录自己日常学习以及漏洞挖掘中的奇思妙想&#xff0c;希望能与热爱网络安全的人士一起交流共勉。 0x02 漏洞背景 一个app&#xff0c;开局一个登录框…

模拟面试题

面试题一 C# 1. 装箱和拆箱是什么&#xff1f; 装箱是把栈空间的数据转移到堆空间上去&#xff0c;值类型传引用类型上去 int i 2; object o i; 拆箱是把堆空间的数据转移到栈空间上去&#xff0c;引用类型传到值类型上去 i (int) o 2. 值和引用类型在变量赋值时的区别是…

在OK3588板卡上部署模型实现人工智能OCR应用

一、主机模型转换 我们依旧采用FastDeploy来部署应用深度学习模型到OK3588板卡上 进入主机Ubuntu的虚拟环境 conda activate ok3588 安装rknn-toolkit2&#xff08;该工具不能在OK3588板卡上完成模型转换&#xff09; git clone https://github.com/rockchip-linux/rknn-to…

气象名词解释

文章目录 SAMPSAAMO SAM SAM(Southern Annualr Mode) 南半球环状模&#xff0c;是南半球大气环流和气候变异的一种重要现象。具有如下特点&#xff1a; 主要特点&#xff1a; 赤道附近环流&#xff1a;在 SAM 正相位期间&#xff0c;赤道附近的环流增强&#xff0c;称为正 SA…

Java源码规则引擎:jvs-rules决策流的自定义权限控制

规则引擎用于管理和执行业务规则。它提供了一个中央化的机制来定义、管理和执行业务规则&#xff0c;以便根据特定条件自动化决策和行为。规则引擎的核心概念是规则。规则由条件和动作组成。条件定义了规则适用的特定情况或规则触发的条件&#xff0c;而动作定义了规则满足时要…

IO进程线程day3(2023.7.31)

一、Xmind整理&#xff1a; 文件描述符概念&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;用fread和fwrite实现文件拷贝 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <head.h> int main(int argc, const char…

12-3_Qt 5.9 C++开发指南_创建和使用静态链接库

第12章中的静态链接库和动态链接库介绍&#xff0c;都是以UI操作的方式进行&#xff0c;真正在实践中&#xff0c;可以参考UI操作产生的代码来实现同样的功能。 文章目录 1. 创建静态链接库1.1 创建静态链接库过程1.2 静态链接库代码1.2.1 静态链接库可视化UI设计框架1.2.2 qw…

八大排序算法--快速排序(动图理解)

快速排序 概念 快速排序是对冒泡排序的一种改进。其基本原理是通过选取一个基准元素&#xff0c;将数组划分为两个子数组&#xff0c;分别对子数组进行排序&#xff0c;最终实现整个数组的有序排列。快速排序的时间复杂度最好为O(nlogn)&#xff0c;最坏为O(n^2)&#xff0c;…

5个值得收藏的AI绘画网站,还有国产!

随着科技的发展&#xff0c;设计领域也迎来了科技创新&#xff0c;AI绘画网站便是其中的一个代表&#xff0c;本文精选了4个好用的AI绘画网站与大家分享&#xff0c;一起来看看吧&#xff01; 1、即时灵感 作为一个国产的AI绘画网站&#xff0c;即时灵感支持设计师使用中文语…

Spring | Bean 作用域和生命周期

一、通过一个案例来看 Bean 作用域的问题 Spring 是用来读取和存储 Bean&#xff0c;因此在 Spring 中 Bean 是最核心的操作资源&#xff0c;所以接下来我们深入学习⼀下 Bean 对象 假设现在有⼀个公共的 Bean&#xff0c;提供给 A 用户和 B 用户使用&#xff0c;然而在使用的…

IO流简述

IO流IO流使用场景 什么是IO流常用的IO流字节流字符流缓冲流 BIO、NIO、AIO的区别 IO流 IO流使用场景 如果操作的是纯文本文件&#xff0c;优先使用字符流如果操作的是图片、视频、音频等二进制文件。优先使用字节流如果不确定文件类型&#xff0c;优先使用字节流。字节流是万能…

【LLM系列之指令微调】长话短说大模型指令微调的“Prompt”

1 指令微调数据集形式“花样”太多 大家有没有分析过 prompt对模型训练或者推理的影响&#xff1f;之前推理的时候&#xff0c;发现不加训练的时候prompt&#xff0c;直接输入模型性能会变差的&#xff0c;这个倒是可以理解。假如不加prompt直接训练&#xff0c;是不是测试的时…