软件测试:遇到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时进行统一说明,也更加方便开发人员批量处理,防止漏改。

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

 

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取  

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C--函数指针与回调函数

文章目录 定义函数指针qsort中的回调函数自实现排序的回调函数 定义 回调函数,当一个函数执行时,中途调用其他定义好的函数来帮助实现功能,再继续执行这个函数 函数指针 类型为函数的指针,如下 void func() { } int main() {…

如何让视频流媒体平台免受网络攻击

在各国,流媒体服务已越来越受到大众的欢迎。有统计表明,目前视频流已占网络整体流量的80%以上。不过如您所见,近年来,数字威胁的不断增加,也让网络攻击逐年递增。单个视频用户受到的危险,往往会危及到整个服…

【unity】【C#】游戏音乐播放和发布

今天我们来认识一下有关 unity 音乐的一些知识 我们先创建 AudioClips 文件夹,这个文件夹通常就是 unity 中存放音乐的文件夹,然后拖进音乐文件进去 这里为大家提供了两个音乐,有需要可以自取 百度网盘:https://pan.baidu.com/s…

模型训练----apex库报错IndexError: tuple index out of range

问题描述 在训练模型的过程中遇到了apex库的报错IndexError: tuple index out of range导致无法训练。在github查询后找到了解决方法 问题解决 需要修改/apex-master/apex/amp/utils.py这个文件的代码 从93行开始修改 if x in cache:cached_x cache[x]next_functions_ava…

MySQL学习笔记(三)

1、insert插入多条数据 语法:insert into t_user(字段名1,字段名2...) values(值1,值2...),(值1,值2...),(值1,值2...)...; 2、快速创建表 原理:将一个查询结果当做一张表创建,可以完成表的快速复制。表创建出来,同时表中的数据…

计算机的发展趋势

本文 我们来说计算机的发展趋势 目前来讲 计算机是朝着 巨型化 微型化 网络化 智能化发展 巨型化 指功能巨型化 是指其高速运算、大存储容量和强功能的巨型计算机。其运算能力一般在每秒百亿次以上、内存容量在几百兆字节以上。 主要用于航空航天、军事、气象、人工智能、生…

[Kubernetes[K8S]集群:master主节点初始化]:通过Calico和Coredns网络插件方式安装

文章目录 操作流程:前置:Docker和K8S安装版本匹配查看0.1:安装指定docker版本 **[1 — 7] ** [ 配置K8S主从集群前置准备操作 ]一:主节点操作 查看主机域名->编辑域名->域名配置二:安装自动填充,虚拟…

LeetCode 909 208

题目 909. 蛇梯棋 思路 完全不会!呜呜呜,看了别人的题解。二维数组之字形遍历放在一维数组里面,然后借助队列对数组进行bfs。 代码 class Solution {int n;int[] nums;public int snakesAndLadders(int[][] board) {// 暴力遍历n board.le…

深入理解图形处理器(GPU):加速人工智能和大数据计算的引擎

文章目录 1. 什么是GPU?2. GPU的工作原理3. GPU的应用领域4. GPU与CPU的比较参考与推荐 前言: 图形处理器(GPU)不再仅仅是用于图形渲染的硬件设备。如今,GPU已经成为加速人工智能、大数据计算和科学研究的关键引擎。本…

MINI2440 开发板 给他干出来了

环境是ubuntu14.04。不要问我为什么是这个版本,因为之前的ubuntu12.04 环境干不出来,你去试试就知道了!各种资源包下载不下来。 输入启动参数: 进入MINI2440:别说心里一万个开心,启动完成,输入p…

Linux开发--进程

经典五问: 1.什么是程序?什么是进程? 从是否运行进行判断: gcc xxx -o pro,磁盘中生成的pro文件,就是程序 进程是程序一次运行活动 程序是静态的概念,进程是动态的概念。 2.如何查看系统中的进程: 在l…

LeetCode-热题100:64. 最小路径和

题目描述 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 **说明:**每次只能向下或者向右移动一步。 示例 1: 输入: grid [[1,3,1],[1,5,1],[4,2,1]]…

09 - 镜像管理之:部署单点harbor

本次准备了3台机器:harbor-01、harbor-02、harbor-db,用于测试 单点模式、高可用模式 部署 harbor。 ip主机名规格操作系统说明192.168.217.136harbor-012c4gCentos7.9harbor 服务器,测试单点harbor192.168.217.135harbor-022c4gCentos7.9ha…

初始C++之缺省参数 函数重载 引用

初始C之缺省参数 函数重载 引用& 文章目录 初始C之缺省参数 函数重载 引用&一、缺省参数1.1 缺省参数的定义1.2 缺省参数的分类1.3 注意事项 二、 函数重载2.1 函数重载的定义2.2 参数个数不同2.3 参数类型不同2.4 类型顺序不同2.5 为什么C语言不支持函数重载 三、引用…

Python中的错误处理 - 使用try、except、else和finally进行解释,并附带代码示例

最近,我的经理委派我创建一个自动报告。我设计的报告非常简单。它包括一些来自数据库的数字和一些基本的数学运算。我很兴奋最终可以向公司展示我的惊人的Python技能。 我完成并交付了产品。一切都很顺利。至少,直到大约两周后。我的报告由于除以零错误…

编程新手必看,python中条件控制语句学习(13)

介绍: Python3中的条件控制主要通过if、elif和else关键字来实现,它们用于根据条件执行特定的代码块。 if语句:这是最基本的条件控制结构。如果满足某个条件(条件为True),则执行相应的代码块。在Python中&am…

蓝牙app设计(方案二) E4A (时钟 优缺点)

例程改的! 主界面 虽然上面有搜索功能,但是本人建议先自行配对在使用,这样更好用,把要使用的设备收藏一下更好找哦(这样就是橙色的了,只需要点对应蓝牙左边) 代码修改部分 原版是不停向下滚动显示,这样个人觉得不太好看,所以加了个时钟,到对应时钟周期清空(达到刷…

Java-Web过滤器

文章目录 1.基本介绍1.为什么需要过滤器?2.基本介绍3.过滤器的基本原理 2.快速入门1.文件目录2.环境配置创建maven项目,导入依赖 3.代码实现1.login.jsp2.LoginCheck.java3.ManagerFilter.java编写过滤规则4.配置web.xml告诉tomcat5.admin.jsp 3.Filter的…

【nodejs基础学习三-浏览器偏好设置】

系列文章目录 第一章 nodejs基础学习–注释、变量、运算符、字符串、函数(一) 第二章 nodejs基础学习–循环、对象字符、模块导入出(二) 第三章 nodejs基础学习三-浏览器设置 系列文章目录一、开发者模式二、web偏好设置 一、开发…

【病毒分析】DevicData勒索病毒分析

1.背景 1.1来源 近期,Solar团队收到某医疗单位的援助请求,该公司的计算机受到了某勒索病毒的侵害,所有的文件被加密并且添加了.DevicData-P-470b1abd后缀,我司人员现场取证进行排查并提取加密器,本文是对于加密器的分析。 2.恶…