BUG分析以及BUG定位
一般来说bug大多数存在于3个模块:
1、前台界面,包括界面的显示,兼容性,数据提交的判断,页面的跳转等等,这些bug基本都是一眼可见的,不太需要定位,当然也不排除一些特殊情况,本身数据传过来的时候就有问题,所以显示会出问题的情况(这个后面会说到)。
2、后台程序,包括前台调用的接口,中间层缓存和转发数据,定时任务脚本异步处理数据,程序之间的相互调用等等,而这些bug往往都是不可见的,有可能在功能上体现,也有可能隐藏的深处不易发现,这时候就要通过一些辅助工具以及人工的判断去定位了。
3、数据库,包括表中缺少字段,字段定义错误,字段长度限制,数据重复等等,这些bug需要通过数据库工具以及一些基本的数据库查询语句来定位,当然前提是要对每个表,每个字段甚至每一个值代表什么意思有一定的了解(一些常用的重要的表,字段,值就可以了)。
排除一些显而易见以及可以直接判断的bug,很多不容易判断的bug该如何定位呢?
这就需要借助一些工具来一个个排除了,也许还是会觉得雨里雾里,那么就举一个常见的例子来讲解:
比如在提交正常的表单发生了错误导致提交失败,那么如何从定位呢?
1、首先要打开抓包工具,然后提交正常的表单,看是调用后台接口的时候传的参数是否和之前填写的一致,比如表单填的是数字,而接口需要传的是字符串,那么就是前台传的问题,如果一致说明不是前台问题,继续往下查。
2、需要一方面继续看抓包的数据,接口返回的错误是什么,如果能明确看到错误原因的消息,也就定位到问题,如果不能看到则要继续连接测试服务器查看日志,看是程序处理到哪一步有问题,
3、如果从程序的角度发现没问题,那继续往下查,看是否连接的数据库不对,亦或是超过数据库字段限制的长度等等。就这样追寻着程序执行的轨迹一步一步去排查,最终基本都能定位到问题。
1、web前端
- Web前端就是通常说的网页。互联网公司的前端一般包含如下内容:JavaScript、ActionScript、CSS、HTML(..ML)、Flash、交互式设计、视觉设计
- web前端测试可能发现的问题——版面设计、交互设计、文字、性能、功能
- bug定位通用思路:现象-->原因-->验证手段-->结论-->现象
- 测试bug定位原因归类:
- 测试环境相关
- 是否安装了flash及flash的版本——可能导致部分页面显示出问题,目前常用的版本诶flash10
- 是否开启了浏览器插件——插件可能导致浏览器行为的变化,除非测试要求,否则一律禁用插件
- 是否开启了安全软件——可能会截包、弹窗拦截、防钓鱼等
- 浏览器相关
- 不同浏览器的支持标准——不同内核的浏览器对js及各种标准的支持不同,因此页面解析出来的效果可能不同。IE:trident;Firefox:gecko;Chrome:webkit;Safari:webkit。
- 浏览器的设置——禁用js;禁用弹窗;禁用cookie等
- 浏览器cache策略——js,css,图片等都有可能被cache住。ctrl+F5强制刷新请求
- cookie——跨域,过期
- 网络相关
- 是否发出了正确的请求——请求url、参数变量。content数据
- 是否得到了正确的应答——http的返回值:200-正确;302-对象已移动;304-对象未修改;404-没有找到页面。返回的数据体
- 是否性能问题——异步请求的数量过多;网速过慢
- 字符编码相关
- 页面乱码——百度后端存储基本是使用的GBK编码,前端提交可能是UTF-8编码,后端对于非GBK编码一般采用实体存储。可能出现编码没有转换。转换的时候没有判断半个汉字(转掉了半个汉字导致雪崩)。
- url错误——url路径中汉字编码使用的是utf-8编码,参数中使用系统默认编码,flash脚本中使用的都是uft-8编码。
- 安全相关
- Xss漏洞——输入一些特定字符页面出现错乱或有恶意代码被执行,RD未对特殊字符转义完整
- 性能相关
- 图片数量——页面中同一个域的图片的数量控制在16个以下,IE会控制同一个域下图片并行的下载数量
- 页面抖动——异步请求的数量过多
- 加载失败——限速情况下,超时
- 测试环境相关
- bug定位常用工具
- Firefox——firebug、web developer、live http headers、http fox
- IE插件——httpwatch
- 第三方工具——fiddler
- 慢速网模拟工具——firefox throttle
2、web后端
- 后端包含运行在服务器上的程序,脚本和服务。比如:各种各样的逻辑处理系统,数据存储系统等。
- 后端可能发现的问题——逻辑的,数据的,策略的,接口的,性能的等
- 测试bug定位原因归类:
- 数据流相关
- 上下游模块是否连接正常——模块的ip和端口的配置,白名单黑名单配置,session授权
- 模块的数据发送接收是否正常——日志是否有滚动,是否显示发送了数据或接收到数据,数据是否完整,跨机房,负载均衡算法(从哪些机器获取到的数据)
- 非socket的数据传输——共享内存(是否分配,key的配置等),cache(是否创建,脏数据等),数据库(配置,连接,表,触发器,存储过程),文件(大小,访问权限)
- 模块之间的接口——协议的一致性(mcpack1,mcpack2等),字段的一致性(一个按signed解析,一个按unsigned解析),字段复用
- 处理逻辑相关
- 程序的各种配置——功能是否开启/关闭,词表是否加载,各种阈值的配置,超时配置
- 程序日志——日志级别,交互的流程,处理的流程
- 各种边界——数据边界(int,long),文件边界(空文件,分文件的边界),时间边界
- 各种资源癿使用——Cache是否遗留脏数据,并发和死锁
- 系统和环境相关
- 系统资源——Cpu,io,句柄,内存,网络状态,数据库状态,数据库连接数
- 环境资源——程序版本,内核版本,网络(外网)访问权限,系统动态库不一致
- 程序和代码相关(常用验证手段)
- 确认问题出现的位置——日志中的代码行,gdb中的代码行,抛出异常显示的代码行
- 获取当时的运行时信息——Gdb core文件,gdb attach到进程,查看堆栈,查看寄存器,设置breakpoint,watchpoint,查看内部数据
- 获取程序和系统信息——Strace查看系统调用,系统状态获取(ps,top,/proc/pid/*,vmstat,netstat)
- 更深入的手段——反汇编,查看寄存器,gdb高级应用
- 数据流相关
- 后端测试bug定位
- 日志查看命令
- 查看压力——tail -f as.log | grep '^NOTICE' | awk '{print $3}' | uniq -c
- 排除日志中的特定内容——grep -v 'pattern' as.log
- 只输出感兴趣的内容——grep -o 'proctime:toal:\d+' as.log;grep -o 'proctime:toal:\d+' as.log | grep -o '\d+ ';grep -o 'proctime:toal:\d+' as.log | grep -o '\d+ ' | sort -n | uniq -c
- 将wf日志归类——grep -o '\w+\.(cpp|h):\d+' as.log.wf | sort | uniq -c
- gdb常用命令
- bt——查看堆栈信息
- print——打印某变量值
- break——设置断点
- x/i——翻译当前指令为汇编
- info thread——查看所有线程,星号*标记的是当前线程
- thread num——切换到线程号为num的线程
- set scheduler -locking on——锁定在线程:输入continue命令以后,当前线程继续执行,其它线程不执行
- set scheduler-locking off——这是默认设置,输入continue命令以后,所有线程都继续执行
- 日志查看命令
3、性能测试
- 旨在获取系统在特定一种或多种环境下,在不同的外部输入压力(包含极限)的条件下的系统各项指标的测试
- 常用命令
- 进程相关——ps,top,/proc/pid/*
- 系统相关——vmstat,top,iostat,sar,df,lsof
- 网络相关——netstat
- bug定位原因归类
- 压力工具相关
- 工具的功能和性能——能否达到预期压力,启劢压力的机器性能,压力工具是否有异常连接关闭,压力工具如何处理异常,长连接短连接,并发的个数
- 工具运行环境——压力机器的带宽,是否跨机房
- 被测系统相关
- 机器性能——系统所在机器性能,机器网络带宽,机器的内存,sd卡,硬盘
- 系统本身——系统的下游模块的性能,系统的配置,系统的数据量,系统的特点状态(充cache,dump,merge),系统的部署,程序的bug
- 环境相关
- 操作系统相关—— 是否和线上一致,内核版本,刷脏页时间,有没有调用directIO
- 查看系统状态——Ps,top,/proc/pid/*, vmstat,netstat
- 压力工具相关
正确的思路+丰富的业务知识+丰富的技术背景知识+较好的调试和开发能力= 强大的bug定位能力Bug定位的过程是能力提升的过程
Bug定位的过程也是境界提升的过程
B站最牛的Python接口自动化测试进阶教程合集(真实企业项目实战)
相关文章:
BUG分析以及BUG定位
一般来说bug大多数存在于3个模块: 1、前台界面,包括界面的显示,兼容性,数据提交的判断,页面的跳转等等,这些bug基本都是一眼可见的,不太需要定位,当然也不排除一些特殊情况…...
Day46 算法记录| 动态规划 13(子序列)
这里写目录标题 300.最长递增子序列 674. 最长连续递增序列718. 最长重复子数组 300.最长递增子序列 视频解析: 第一层for循环遍历每一个元素, ------- 第二层for循环找到当前元素前面有几个小于该值的元素 结尾需要统计最多的个数 class Solution {pu…...
结构型-桥接模式(Bridge Pattern)
概述 桥接模式(Bridge Pattern)是一种结构型设计模式,将抽象部分和实现部分分离,使它们可以独立地变化。桥接模式通过将继承关系转化为关联关系,将抽象部分和实现部分分离开来,从而使它们可以独立地变化。…...
基于小波哈尔法(WHM)的一维非线性IVP测试问题的求解(Matlab代码实现)
目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 💥1 概述 小波哈尔法(WHM)是一种求解一维非线性初值问题(IVP)的数值方法。它基于小波分析的思想…...
前端(Electron Nodejs)如何读取本地配置文件
使用electron封装了前端界面之后,最终打包为一个客户端(exe)。但是,最近项目组内做CS(c开发)的,想把所有的配置都放进安装目录的配置文件中(比如config.json)。这做法&am…...
没有 telnet 不能测试端口?容器化部署最佳的端口测试方式
写在前面 生产中遇到,整理笔记在容器中没有 telnet ,如何测试远程端口理解不足小伙伴帮忙指正 他的一生告诉我们,不能自爱就不能爱人,憎恨自己也必憎恨他人,最后也会像可恶的自私一样,使人变得极度孤独和悲…...
漏洞发现-BurpSuite插件-Fiora+Fastjson+Shiro
BurpSuite插件安装 插件:Fiora Fiora是LoL中的无双剑姬的名字,她善于发现对手防守弱点,实现精准打击。该项目为PoC框架nuclei提供图形界面,实现快速搜索、一键运行等功能,提升nuclei的使用体验。 该程序即可作为burp插…...
Elasticsearch-倒排索引
Elasticsearch和Lucene的关系 Lucene 是一个开源、免费、高性能、纯 Java 编写的全文检索引擎,可以算作是开源领域最好的全文检索工具包。ElasticSearch 是基于Lucene实现的一个分布式、可扩展、近实时性的高性能搜索与数据分析引擎。 Lucene索引层次结构 Lucene的…...
pagehelper与mybatis-plus冲突的解决办法
背景: springcloud项目开发新功能时因想使用mybatis-plus,原有功能只使用了mybatis,但在开发时发现某个公共模块使用了com.github.pagehelper,且很多模块都集成了该模块依赖(为了保证原有功能不发生问题,…...
解决使用Timer时出现Task already scheduled or cancelled异常的问题
在使用java.util.Timer和java.util.TimerTask执行定时任务时,如果在调用Timer的schedule或scheduleAtFixedRate方法时,报错如下: java.lang.IllegalStateException: Task already scheduled or cancelled 说明当前Timer对象已经执行结束或被取…...
P1175 后缀表达式
题意 传送门 P1175 表达式的转换 题解 编码运算符的优先级,线性复杂度将中缀表达式转换为后缀表达式。为了方便输出,可以用类似对顶栈的结构,初始时右侧栈为后缀表达式;对于每一步计算,右侧栈不断弹出数字到左侧栈&…...
【HashMap】49. 字母异位词分组
49. 字母异位词分组 解题思路 创建一个哈希容器 key是每一个字母异位词 排序之后的词 List是所有的字母异位词因为所有的字母异位词排序之后的结果都是一样的增强for循环遍历字符串数组将每一个字符串转换为字符数组因为字母异位词排序之后 都是一样的将排序之后的字符数组 转…...
golang实现多态
Go 通过接口来实现多态。在 Go 语言中,我们是隐式地实现接口。一个类型如果定义了接口所声明的全部方法,那它就实现了该接口。现在我们来看看,利用接口,Go 是如何实现多态的。 package mainimport "fmt"type Income in…...
formatter的用法,深拷贝, Object.assign 方法实战。
1. :formatter的用法 :formatter 接受一个函数作为参数,这个函数有三个参数:row,column 和 cellValue。row 是当前行的数据,column 是当前列的数据,cellValue 是当前单元格的值。 <el-table-column prop"SYS…...
Windows上安装和使用git到gitoschina和github上_亲测
Windows上安装和使用git到gitoschina和github上_亲测 git介绍与在windows上安装创建SSHkey在gitoschina使用 【git介绍与在windows上安装】 Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 相关介绍可以参考 <百度百科>…...
MATLAB算法实战应用案例精讲-【深度学习】预训练模型GPTXLNet
目录 GPT 1. 介绍 1.1 GPT的动机 2. 模型结构 3. GPT训练过程 3.1 无监督的预训练...
Spring data JPA常用命令
简介 Spring Data JPA是Spring框架的一部分,它提供了一个简化的方式来与关系型数据库进行交互。JPA代表Java持久化API,它是Java EE规范中定义的一种对象关系映射(ORM)标准。Spring Data JPA在JPA的基础上提供了更高级的抽象&…...
Excel的使用
1.EXCEL诞生的意义 1.1 找到想要的数据 1.2 提升输入速度 2.数据分析与可视化操作 目的是提升数据的价值和意义 3.EXCEL使用的内在意义和外在形式 4.EXCEL的价值 4.1 解读及挖掘数据价值 4.2 协作板块 4.3 展示专业度 4.4 共享文档内容 5.人的需求》》软件功能...
大数据课程D4——hadoop的MapReduce
文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解MapReduce的作用和特点; ⚪ 掌握MapReduce的组件; ⚪ 掌握MapReduce的Shuffle; ⚪ 掌握MapReduce的小文件问题; ⚪ 掌握MapReduce的压缩机制; ⚪ 掌握MapReduce的推测执行机制…...
java策略模式
在Java中,策略模式(Strategy Design Pattern)用于定义一系列算法,并将每个算法封装成单独的类,使得它们可以互相替换,让客户端在使用算法时不需要知道具体的实现细节。策略模式是一种行为型设计模式&#x…...
VisualCppRedist AIO:解决Windows运行库管理难题的一站式方案
VisualCppRedist AIO:解决Windows运行库管理难题的一站式方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 一、直面运行库困境:三大场…...
从情感分析到舆情洞察:手把手教你用Stanford NLP搭建一个简易的评论分析系统
从情感分析到舆情洞察:手把手教你用Stanford NLP搭建评论分析系统 在电商平台或社交媒体上,用户评论是洞察消费者情绪的黄金矿脉。一条简单的"物流超快!"或"包装太差"背后,隐藏着产品改进的关键线索。传统人工…...
3分钟上手PCL2-CE:打造专属Minecraft启动环境的完整指南
3分钟上手PCL2-CE:打造专属Minecraft启动环境的完整指南 PCL2-CE社区版是一款开源游戏配置工具,致力于为Minecraft玩家提供高效、灵活的游戏环境管理方案。通过智能化配置和模块化设计,让玩家告别繁琐设置,轻松掌控游戏入口&…...
手把手教你用HuggingFace+BGE模型搭建本地向量检索系统(附FAISS实战代码)
从零构建基于BGE模型的本地语义搜索系统:代码级实践指南 在信息爆炸的时代,如何快速从海量文本中精准找到相关内容?语义搜索技术正成为解决这一痛点的利器。不同于传统的关键词匹配,语义搜索能理解查询背后的意图,找到…...
为什么92%的车载Java应用在-40℃环境崩溃?:嵌入式JRE热稳定性加固实战手册
第一章:车载Java应用低温崩溃现象全景透视在-20℃至-30℃的严寒环境下,车载信息娱乐系统(IVI)中基于Android Framework构建的Java应用频繁出现ANR、SIGSEGV及ClassLoader初始化失败等非预期终止行为。此类崩溃并非由业务逻辑缺陷直…...
Cursor + Claude 3.7:解锁高效编程新范式
1. 为什么开发者需要CursorClaude 3.7组合 最近在重构一个遗留的电商系统时,我遇到了所有程序员都头疼的问题:面对20万行混杂着jQuery和Vue的祖传代码,光是理清支付模块的业务逻辑就花了三天。直到同事推荐了CursorClaude 3.7这个组合&#x…...
Claude Code平替方案实战:如何用第三方API(如DeepSeek、Kimi)低成本玩转AI编程助手
Claude Code平替方案实战:如何用第三方API低成本玩转AI编程助手 在AI编程助手领域,Claude Code凭借其出色的代码理解和生成能力赢得了不少开发者的青睐。然而,官方API的高昂成本和访问限制让许多预算有限的个人开发者和小团队望而却步。本文将…...
提升openclaw开发效率:用快马一键生成算法调试与可视化工具
最近在优化openclaw机械爪控制算法时,发现调试过程特别耗时。每次修改参数后,都要重新编译代码、运行测试,还要手动记录数据。为了提升效率,我用InsCode(快马)平台快速搭建了一个可视化调试工具,效果出乎意料的好。分享…...
马上深挖!!!三段逆置如何实现数组轮转?!用最简单的话让你秒懂
一、目的给定一个数组和一个整数k,让数组向右轮转k个数。如令[1,2,3,4,5,6]向右轮转3个数,结果为[4,5,6,1,2,3]。二、代码#include <iostream> using namespace std;void swap(int* a,int* b) {int tmp*a;*a*b;*btmp;return; }void reverse(int* a…...
Claude Code源码阅读分享
Claude Code 源码阅读分享 链接: https://pan.baidu.com/s/1oSUWD11Yjrn5_pVVfK8Y9g?pwdv4ta Quick Start Option 1: Use with Claude Code (Recommended) # Copy agents to your Claude Code directory cp -r agency-agents/* ~/.claude/agents/# Now activate any agent in …...
