软件测试技术分享丨遇到bug怎么分析?
为什么定位问题如此重要?
可以明确一个问题是不是真的“bug”
很多时候,我们找到了问题的原因,结果发现这根本不是bug。原因明确,误报就会降低
多个系统交互,可以明确指出是哪个系统的缺陷,防止“踢皮球”,提高问题解决的效率
增强开发对测试的信任度,沟通更有效,配合的更好,开发修改bug时效增强
更有效的了解系统的内部逻辑、数据流处理流程,更能提高测试人员的水平,缺陷修复后,影响的测试范围评估更精准,复测更准确
可以降低缺陷率
这个可以说是最重要的。在bug系统中,会要求开发人员记录bug产生的原因。只有我们自己对bug有一个较全面的认识,才会判别出开发写的是不是真正的原因,也才能有助于我们后续对bug进行分析归类,根据bug分析,有针对性地未雨绸缪,进而提升产品质量,降低缺陷
01、定位原因之前
遇到问题时,先别急着去定位原因。
1、保存bug产生的记录:
首要做的是保存bug产生的记录,保证可以复现。
为什么要保存记录?因为如果以后不能复现,那就不能证明bug的存在。
2、排除低级问题:
然后是排除QA的低级问题,常见的低级问题:
【hosts不对】
hosts文件主要是加快某个域名或者网站的解析速度,从而达到快速访问的作用,也可以屏蔽网站。
hosts异常可能会导致部分网页无法访问,能够加载,但是网页无法正常显示。
【网络不通】:抓包、ping
工具的影响导致的,例如fiddler
以及操作姿势不正确等。
3、排除数据问题(脏数据):
有时候会遇到服务端报500错误,查看日志后,报空指针,那么很有可能就是数据库中关联表的数据被人为删掉导致的。
脏数据:从目标中取出的数据已经过期、错误或者没有意义,这种数据就叫做脏数据
脏读:读取出来脏数据就叫脏读
02、定位问题的思路
排查顺序:
用户环境层面 -> 展示层面 -> 逻辑控制层面 -> 服务层面 -> 数据库层面
1、用户环境层面
主要是指基础环境是否可以使用。比如:
网络是否ping通
ip和端口配置是否正确
jdk版本是否符合标准
有可能是由于jdk版本不兼容导致系统运行异常,这种问题根据实际情况来决定要不要兼容。
网络设了代理
弱网(如js/css未加载完全、请求超时)
浏览器不支持
系统版本不支持
数据库被删除
测试环境脏数据
项目配置开关
测试环境切了分支等
检查完成后,可以转到第二步
2、用户展示层
用户在使用过程中,通过查看等操作发现的一些问题:
页面样式(css样式问题)
交互过程中js的提示(js交互问题)
终端控制的提示信息
文本的展示(html文本问题)
3、逻辑控制层
用户操作过程中,业务的处理逻辑有没有按照前期的设计实施。或者中间环节出现异常,比如缓存服务器(如redis)、消息中间件(如rabbitMQ)、数据存取中间件等。
4、服务层
服务层往往检查服务器的配置,如可能是tomcat配置、nginx配置、jdbc配置等的问题。测试人员最好能够了解下它们的各项配置。
5、数据库层
可能出现测试环境和正式环境数据库版本不同,前后端数据格式、长度限制不同。用户操作完成后,交易流程非常顺畅,这样也不代表整个交易没有问题,还需要测试人员检查数据库登记的表和字段是否正确
如果发现登记的字段与预期的结果不一致,则可以查看日志,检查请求报文送的字段是否正确,是否与前台填写的一致
有的一个操作会登记多张表,所以要检查多张表登记或者更新的是否正确,测试人员也需要对被测系统的数据表结构熟悉
6、经验法则
有经验的测试人员对于有部分bug已经见过多次,能够很快找到根源,直奔主题,迅速报告或者解决bug
7、其他
常见的bug可能还有构建方面的原因
比如代码本身没错,但是合并代码到主干后出现了问题
比如代码存在冲突时手动解决的情况
03、定位问题的方法
1、常用的定位策略:
常用的定位策略分为三类:原始类(brute force)、回溯类(backtracking)、排除类(causeeliminations)
原始类定位方法
原始类定位方法是最常用也是最低效的方法,只有在万般无奈的情况下才使用它,主要思想是“通过计算机找错”。
回溯法
回溯法能成功地用于程序的排错
方法是从出现bug征兆处开始,人工地沿控制流程往回追踪,直至发现出错的根源,不幸的是程序变大后,可能的回溯路线显著增加,以致人工进行完全回溯到望而不可及。
排除法
基于归纳和演绎原理,采用“分治”的概念。
首先确定所有与bug出现有关的所有数据,设想一个导致bug的原因,用这些数据证明或反驳它。或者一次列出所有可能的原因,通过测试一一排除。只要某次测试结果说明某种假设已呈现倪端,则立即精化数据,乘胜追击
2、查看状态码
4xx状态码:一般表示是客户端问题(当然也有可能是服务器端配置问题),比如:
发生了401,那么要看下是否带了正确的身份验证信息
发生了403则要看下是否有权限访问
404则要看下对应的URL是否真实存在
5xx状态码:一般表示服务端出现问题。比如:
发生了500错误,则表明是服务器内部错误,这个时候要配合服务器log进行定位
发生了502错误则可能是服务器挂了导致的问题
发生503错误可能是由于网络过载导致的问题
发生504错误则可能是程序执行时间过长导致超时
3、查看服务器日志
如果发生5xx问题,或者需要检查后端接口执行的sql是否正确,我们最常见的排查方法就是去看服务器日志,比如tomcat日志。开发人员一般会打出关键信息和报错信息,从而找到问题所在,所以,测试人员也要养成看日志的习惯。
4、检查配置
很多时候,bug不是代码的问题,而是tomcat配置、nginx配置、jdbc配置等的问题。在这个层面上,测试人员最好能够了解下它们的各项配置,在发现问题后可能就会想到这方面的问题。
5、查看需求文档
有时候,前端和服务端的交互都正确,但是从测试的角度看不合理。这个时候,我们应该翻翻需求文档。如果和需求文档不符,那么就要看下改什么比较合理,是改前端,还是改服务端,或者两者都要改。
这里有一个原则,就是前端尽可能少地去承担逻辑,只负责渲染展现。当然,不要以为需求文档就全部正确,它也可能会有错误,我们也应该去发现需求文档的bug,然后再去协调PM,敦促FE或者RD进行修改。
6、向开发寻求可测性支持
有时候,涉及到开发过程的一些测试,也需要开发提供可测性支持。
比如,要查看接口给另一个接口发的请求是否正确,可以让开发打印出完整的请求log,还有一些逻辑开关、修改页面数据条数等,都属于可测性支持的范畴。
04、bug定位常用工具
Firefox——firebug、web developer、live http - headers、http fox
IE插件——httpwatch
第三方工具——fiddler
慢速网模拟工具——firefox throttle
05、如何区分前端/后端bug
为什么要区分前端/后端BUG?
如果是一个多人开发的系统,不能明确定位到这个bug是谁造成的,容易提交给错误的开发人员。
同时提交给前后端开发人员,每个人都会有依赖心理,bug会像皮球一样被开发踢来踢去,耽误开发解决bug的时间。
另外,如果团队规模较大,或者由各地的项目组拼凑而成,势必会增加沟通成本,这更需要我们在类似禅道或者Jira等项目管理软件中提交bug时,先指明是谁的bug,避免互相踢皮球的现象。
所以测试必须要自己学会区分出是前端还是后端bug,经过bug分类处理,整个团队的效率都会有所提高。
前后端BUG各有什么样的特点?
1、利用抓包工具来进行分析
一般有httpwatch,firebug,fiddler,charles等抓包(数据包)工具。
httpwatch,firebug都是浏览器的插件,需要额外下载
fiddler,charles也需要额外下载安装包另行安装
还有一个简单实用的抓包工具,那就是浏览器的F12调试器
2、定位前端的bug
前端的bug通常是功能、界面和兼容性等有关,涉及到jstl,jsp,js,css,html方面比较多。bug主要有两块:
JS相关
页面
3、定位后端的bug
后台涉及到servlet,jms,ejb,还有很多框架struts,hibernate,spring,ibatis等
bug 比较难改,但是好找,主要就是看控制台报错,然后定位错误行号。如果配置文件没有问题,那么一般的报错就是空指针,或者是数组下标越界。看附近变量,看方法的参数基本上都可以定位错误。
06、定位完问题后
在发现问题或者定位到问题原因后,一定要进行一步,就是再次确认问题。所谓确认问题,就是弄清楚问题是否每次都发生,还是概率事件,或者是工具相关的问题:
比如换个浏览器是否依然出现?如果换个浏览器不出现的话,很可能就是前端的兼容性问题。
比如翻页控件,待测的系统有很多页面都有翻页控件,那么就要看下是否每个页面都会出现这个问题,进而报bug时进行统一说明,也更加方便开发人员批量处理,防止漏改。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
软件测试面试小程序
被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!
涵盖以下这些面试题板块:
1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux
6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!
相关文章:
软件测试技术分享丨遇到bug怎么分析?
为什么定位问题如此重要? 可以明确一个问题是不是真的“bug” 很多时候,我们找到了问题的原因,结果发现这根本不是bug。原因明确,误报就会降低 多个系统交互,可以明确指出是哪个系统的缺陷,防止“踢皮球…...
LeetCode无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: s “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “…...
17.2.2 【Linux】通过systemctl观察系统上所有的服务
使用 systemctl list-unit-files 会将系统上所有的服务通通列出来~而不像 list-units 仅以 unit 分类作大致的说明。 至于 STATE 状态就是前两个小节谈到的开机是否会载入的那个状态项目。主要有 enabled / disabled / mask / static 等等。 假设我不想要知道这么多…...
Redis扩容机制与一致性哈希算法解析
在分布式系统设计中,Redis是一个备受欢迎的内存数据库,而一致性哈希算法则是分布式系统中常用的数据分片和负载均衡技术。本文将深入探讨Redis的扩容机制以及一致性哈希算法的原理,同时提供示例代码以帮助读者更好地理解这两个重要概念。 推…...
BDA初级分析——可视化基础
一、可视化的作用 数据可视化——利用各种图形方式更加直观地呈现数据的过程 可视化的作用 1、更快地理解数据,找出数据的规律和异常 2、讲出数据背后的故事,辅助做出业务决策 3、给非专业人士提供数据探索的能力 数据分析问题如何通过可视化呈现&am…...
边缘计算节点BEC典型实践:如何快速上手PC-Farm服务器?
百度智能云边缘计算节点BEC(Baidu Edge Computing)基于运营商边缘节点和网络构建,一站式提供靠近终端用户的弹性计算资源。边缘计算节点在海外覆盖五大洲,在国内覆盖全国七大区、三大运营商。BEC通过就近计算和处理,大…...
python自动把内容发表到wordpress完整示例及错误解答
要实现 Python 自动将内容发布到 WordPress,可以使用 Python 的 wordpress_xmlrpc 库,该库提供了使用 WordPress XML-RPC API 进行内容发布和管理的功能。 需要安装一下第三方库:wordpress_xmlrpc! pip install python_wordpress_xmlrpc 下面是一个简单的示例代码,可以实…...
【javaweb】学习日记Day6 - Mysql 数据库 DDL DML DQL
之前学习过的SQL语句笔记总结戳这里→【数据库原理与应用 - 第六章】T-SQL 在SQL Server的使用_Roye_ack的博客-CSDN博客 目录 一、概述 1、如何安装及配置路径Mysql? 2、SQL分类 二、DDL 数据定义 1、数据库操作 2、IDEA内置数据库使用 (1&…...
如何利用SFTP如何实现更安全的远程文件传输 ——【内网穿透】
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《高效编程技巧》《cpolar》 ⛺️生活的理想,就是为了理想的生活! 文章目录 1. 安装openSSH1.1 安装SSH1.2 启动ssh 2. 安装cpolar2.1 配置termux服务 3. 远程SFTP连接配置3.1 查看生成的随机公…...
枚举和反射
枚举 枚举 枚举是一种特殊的类,它可以有自己的属性、方法和构造方法。 两种枚举的方法 自定义枚举 a.将构造器私有化,防止外部直接new b.去掉set方法,防止属性被修改 c.在内部直接创建固定的对象 通过类名直接去访问 关键字枚举 用…...
MinIO【部署 01】MinIO安装及SpringBoot集成简单测试
MinIO安装及SpringBoot集成测试 1.下载安装1.1 Install the MinIO Server1.2 Launch the MinIO Server1.3 Connect Your Browser to the MinIO Server 2.SpringBoot集成2.1 依赖及配置2.2 代码2.3 测试结果 1.下载安装 下载 https://min.io/download#/linux; 安装文…...
问道管理:证券代码是什么?有什么用?
交流炒股经历时,有些股民一时忘了股票发行公司的全称,会直接报一串数字来代替,这串数字的内容是证券代码,那么,证券代码是什么?它又起什么作用?关于这些,为大家准备了以下参考内容。…...
中文医学知识语言模型:BenTsao
介绍 BenTsao:[原名:华驼(HuaTuo)]: 基于中文医学知识的大语言模型指令微调 本项目开源了经过中文医学指令精调/指令微调(Instruction-tuning) 的大语言模型集,包括LLaMA、Alpaca-Chinese、Bloom、活字模型等。 我们基于医学知识图谱以及医…...
Java基础十四(字符串)
1. 判断邮箱 输入一个电子邮箱,判断是否是正确电子邮箱地址。 正确的邮箱地址: 必须包含 字符,不能是开头或结尾必须以 .com结尾和.com之间必须有其他字符 public class Mailbox {/*** 判断邮箱* param str* return boolean*/public stat…...
vue3 基础知识 (动态组件 keep-alive 等) 04
嘿,happy 文章目录 一、动态组件二、keep-alive 一、动态组件 动态组件是使用 component 组件,通过一个特殊的属性 is 来实现 一定是注册好的组件我们需要将属性和监听事件放到 component 上来使用 <template><div><button v-for"t…...
【C# Programming】编程入门:数组、操作符、控制流
目录 一、数组 1、数组的声明 1.1 一维数组声明: 1.2 多维数组声明: 2、数组的实例化和赋值 2.1 数组在声明时通过在花括号中使用以逗号分隔的数据项对数组赋值, 例如: 2.2 如果在声明后赋值,则需…...
线上问诊:业务数据采集
系列文章目录 线上问诊:业务数据采集 文章目录 系列文章目录前言一、环境准备1.Hadoop2.Zookeeper3.Kafka4.Flume5.Mysql6.Maxwell 二、业务数据采集1.数据模拟2.采集通道 总结 前言 暑假躺了两个月,也没咋写博客,准备在开学前再做个项目找…...
2023 CCPC 华为云计算挑战赛 hdu7399 博弈,启动!(图上博弈/枚举+逆向有向图sg函数)
题目 给定t(t<200)组样例, 每次给定一个n(n<300)个左边的点m(m<300)个右边的点的二分图,图无重边 所有边总量不超过5e5 初始时棋子可以被放置在任意一个点上, 若被放置在左边,则Alice先走;被放置在右边&a…...
Unity之 Vector3 的详细介绍以及方法的介绍
文章目录 总的介绍小试牛刀相关的描述的参数看个小例子 总的介绍 当涉及到Unity中的Vector3类时,以下是一些常用的方法和操作: magnitude 方法:返回向量的长度。 float length vector.magnitude;sqrMagnitude 方法:返回向量的平…...
Postgresql部署及简单操作
目录 1、介绍 2、什么是PostgreSQL 3、PostgreSQL 的特点 4、数据库定为 5、环境准备 6、编译安装 6.1 安装依赖包 6.2 下载安装包 6.3 创建用户 6.4 创建 postgresql数据目录并授权 6.5 上传压缩包并解压 6.6 编译postgresql源码 6.7 配置环境变量 6.8 初始化数…...
rabbitmq集群搭建
升级步骤 1.升级包上传 1.1上传erlang、rabbitmq安装包 创建对应升级目录 将安装包otp_src_22.1.7.tar.gz上传到新创建的目录下 将安装包rabbitmq-server-generic-unix-3.8.9.tar.xz上传到新创建的目录下 1.2 执行解压命令tar -zxvf otp_src_22.1.7.tar.gz xz -d rabbitmq-s…...
C++ 二叉搜索树的概念特性
1. 二叉搜索树 1.1 二叉搜索树概念 二叉搜索树又称二叉排序树,它或者是一棵空树 ,或者是具有以下性质的二叉树 : 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大…...
7、Spring_AOP
一、Spring AOP 简介 1.概述 对于spring来说,有三大组件,IOC,ID,AOP aop概述:AOP(Aspect Oriented Programming)面向切面编程。 作用:不改变原有代码设计的基础上实现功能增强 例子 传统打印日志 使用…...
QChart:数据可视化(用图像形式显示数据内容)
1、数据可视化的图形有:柱状/线状/条形/面积/饼/点图、仪表盘、走势图,弦图、金字塔、预测曲线图、关系图、数学公式图、行政地图、GIS地图等。 2、在QT Creator的主页面,点击 欢迎》示例》右侧输入框 输入Chart,即可查看到QChar…...
【python】Leetcode(primer-set)
文章目录 78. 子集(集合的所有子集)90. 子集 II(集合的所有子集) 更多 leetcode 题解可参考:【Programming】 78. 子集(集合的所有子集) 给定一组不含重复元素的整数数组 nums,返回…...
【LVS集群】
目录 一、集群概述 1.负载均衡技术类型 2.负载均衡实现方式 二、LVS结构 1.三层结构 2.架构对象 三、LVS工作模式 四、LVS负载均衡算法 1.静态负载均衡 2.动态负载均衡 五、ipvsadm命令详解 1. -A 2. -D 3. -L 4. -a 5. -d 6. -l 7. -t 8. -s 9. -r 10. -…...
软考高级系统架构设计师系列之:论文题目类型、论文考试大纲、历年考试论文真题汇总、论文写作原则、论文写作常见问题、论文评分标准
软考高级系统架构设计师系列之:论文题目类型、论文考试大纲、历年考试论文真题汇总、论文写作原则、论文写作常见问题、论文评分标准 一、论文写作概述二、论文题目类型三、论文考试大纲1.系统建模2.软件架构设计3.系统设计4.分布式系统设计5.系统的可靠性分析与设计6.系统的安…...
完整的application.xml
<!-- 资源文件配置 --><beans profile"dev"><bean class"com.ningpai.util.CustomPropertyPlaceholderConfigurer"><property name"locations"><list><value>classpath:/com/ningpai/web/config/dev/jdbc.p…...
C语言:运算符优先级
一、优先级(常使用的运算符) 见表格 二、注意 总体原则:算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符 同一级别下的运算符的运算次序由表达式的结合方向决定 运算符注释级别( )圆括号1[ ]数组下标1后置后置2后置--后置--2前置…...
Android GreenDao数据库升级(附Demo)
前言 大家好久不见,一转眼马上八月份下旬了,最近由于工作比较忙,没时间给大家更新博文。百忙之中抽出时间,给大家来更新一篇关于GreenDao3数据库的升级。 关于GreenDao的详细介绍以及一些逻辑性的增、删、改、查等,可以…...
北京医疗网站建设/企业站seo外包
【前言】 python刷leetcode题解答目录索引:https://blog.csdn.net/weixin_40449300/article/details/89470836 github链接:https://github.com/Teingi/test 【正文】 给定 n 个非负整数 a1,a2,...,an,每…...
写网站建设需求/贵州seo技术培训
http://poj.org/problem?id1190 又有好久没做搜索的题了,没想到做一个卡了我那么久,想哭啊。 一个中文题,思路呢也就是搜索呗,一层一层往上面搜,不过这里有两个比较重要的地方的剪枝。 一、每一次搜索可以达到的最小的…...
吉林省做网站公司/域名注册服务商
环境 RedHat Linux 6.1 MySQL 5.1.7 问题 RedHat Linux 6.1 安装 MySQL 安装前准备 1. 下载资源: MySQL-server-5.1.7-0.i386.rpm,点此下载。 MySQL-client-5.1.7-0.i386.rpm,点此下载。 2. 登录系统检查是否已经安装了 MySQL 3. 将两个安装文…...
网站数据库5g/优化网站标题名词解释
目录一 当前文件路径二 python路径拼接os.path.join()函数的用法三 print格式化输出四 将 print 输出到文件五 log模块1 配置文件2 全局log3 使用4 运行程序5 结果六 删除文件七 判断文件/文件夹是否存在八 文本文件操作九 pandas读文件(不把第一行作列属性)十 图片显示1 openc…...
wordpress "menu-item-9/长沙百度搜索排名优化
1.随机存取文件流:RandomAccessFile 2.使用说明: 1.RandomAccessFile直接继承于java.lang.Object类,实现了DataInput和DataOutput接口 2.RandomAccessFile既可以作为一个输入流,又可以作为一个输出流 3.如果RandomAccessFile作为输出流时,写出到的文件如果不存在,则在执…...
浪起网站建设/seo排名赚app靠谱吗
#include "stdafx.h" #include <iostream> #include <string>using namespace std; void other() {static int a2;//静态局部变量,具有全局寿命,局部作用域,只在第一次进入函数时被初始化int c10;//局部变量࿰…...