• 0
  • 0
分享
  • 拯救测试人的秘密武器!从根源解析Bug不可复现问题——软件测试圈
  • 曼倩诙谐 2024-02-22 10:54:04 字数 2783 阅读 378 收藏 0

  作为软件测试工程师,相信一定经常遇到很多棘手的问题,而其中很大的一个类型就是,客户方或现场问题的复现。要么是怎么都无法复现前方的问题,要么就是概率性重复且没有任何规律。这些飘忽不定甚至被戏称为“鬼影“的问题,往往让测试工程师大为头疼。

  如何对这些问题进行精准定位,提高重现概率甚至100%重现,就成为了所有人关注的焦点。千千万万个测试工程师,殚精竭虑,废寝忘食,几乎从技术到玄学的法子都用到,但都无法完全解决,那么就有必要从根本原因上剖析一下问题和做法。

  重现,这是一个和机械还原论非常有纠葛的概念。简单来说,就是将一个相对复杂的场景或系统,可以分解为若干个小部分的组合,并且按照既有顺序合成后,可以实现和原场景或系统的功能。

  那么,在软件测试工作中,根据机械还原论,将所有因素条件都复刻回来,理论上是可以重现任何场景问题的。

  然而事实并非完全如此,那么我们要问一下,到底是哪里出了问题?

  在思考这个问题之前,有一则非常有启发意义的案例:福特汽车客服中心曾接到一个车主投诉电话,说他买的福特汽车对香草冰淇淋过敏。因为每次去超市买香草冰淇淋后回到车上就启动不起来,但是买芒果和巧克力冰淇淋就没问题。

  客服中心认为这个车主在捣乱,就没理会。但是在车主同样问题第五次投诉后,福特汽车公司开始重视起来。但是这个场景离奇到让人无法下手——车辆打不着火和车主吃什么口味的冰淇淋有什么关系?经过多次讨论分析也没有结论,但拿到修理车也没发现问题。

  于是技术工程师自告奋勇陪车主去买冰淇淋,并要求重现整个过程。

  经过尝试后发现,事实果真如此,为什么呢?经过多次测试后,技术工程师终于发现:这个车确实有故障,动力系统一旦熄火,散热不好,就需要5分钟后才能着车。

  但超市的芒果和巧克力冰淇淋很畅销,需要排队5分钟以上才能买到,这个时间足以让车辆完成散热。但是香草冰淇淋不畅销,而且位置就在货架靠外的位置,所以3分钟就买好了,等车主走回来这个时间,不足以让车辆完成散热,所以启动不起来。

  测试工程师经常遇到的情况就是,售后或者客户在传递信息时,往往会忽略掉自己认为不重要的因素,而将重点聚焦在和产品本身相关的信息上。根据测试理论,我们知道,软件的失效和测试周境息息相关,也就是说,任何参与到这个项目或者产品使用环境中的因素,都足以诱发软件产品的失效。而客户或者售后人员的信息转达,往往会忽略掉一部分测试周境的信息。

  像福特汽车这个例子中,客户的反馈显然缺少了“时间“这个重要因素,那么对整个事件的处理,就产生了一定的误导,导致整个事情的反馈听上去像一个闹剧,然而这却是真实发生的。最后,是通过对用户操作步骤和行为的完全再现,才重现了整个问题,进而为问题的定位和解决打下了基础。

  这就提醒所有的测试工程师,在还原现场问题的时候,也需要考虑到其余非技术层面的因素。一般情况下,现场的人员会关注在操作步骤上,测试工程师会更多关心一下软件的版本,以及系统平台是否配套等等问题。有些会忽略软件的选项设置,涉及硬件的,则容易忽略型号配套问题。

  除此之外是否还有其他因素需要关注呢?

  对于纯软件,需要关注的还有系统软件冲突问题,例如输入法的冲突,同类型功能软件冲突,甚至软件快捷键的冲突,更有甚者,还需要关注现场系统中是否缺失了系统运行库,如.NET Framework, 或编程语言运行库依赖(这大都是软件本身的缺陷)。

  如果是浏览器,那么还需要考虑使用调试器,先清空缓存,以及不同浏览器间的兼容问题,例如Chrome和IE以及Edge,这些不同内核的适配就不完全相同,也需要在现场一一甄别。

  还有软件的误报误处理问题,就需要考虑软件本身是否有直接读写内存单元的行为,或者有未经UAC机制判断,意图绕开系统进行最高权限操作。

  纯软件的项目中,会经常遇到UI检查的时候,会出现各种各样的显示问题,即使是在开发声明修复了问题之后,似乎也会出现“”诈尸“一样的问题。遇到这样的情况,一般是要先清空浏览器缓存,通过浏览器菜单清空有时候都不一定能解决问题,需要进入调试模式,在“应用程序”的“存储”页内,选择清除所有数据,包括“第三方cookie”,这样才能将一些预读入的设置和配置清除干净。同样的,在客户反馈类似的问题时,也要提醒客户清空浏览器缓存,当怀疑客户无法在调试模式进行复杂操作的时候,建议可以使用“Ctrl+F5”强制刷新。

  另外,当遇到客户反馈浏览器显示问题时,不但需要询问浏览器型号、版本、64/32位,还需要获知操作系统的版本,这些平时微不足道的细节,往往都是诱发问题的关键点。还需要注意的就是,在类似的项目立项时,浏览器和操作系统兼容性列表,就需要预先确认好支持的范围,这样对于客户反馈的范围外的问题,可以告知不在支持列表内,需要进行调整。

  对于涉及硬件,需要考虑的周境因素则会增多,包括但不限于硬件产品型号的配套和支持,现场布线环境的电磁兼容,电压电流标准等等,这里就需要用排除法进行一一验证。甚至一些配件物料设备的兼容性,也会诱发软件失效报错,这也就是为什么我们购买一些硬件产品时,都会有建议的配套硬件列表或原装配件提醒。

  涉及硬件的问题中,需要将软件问题和硬件问题分开排查。在硬件方面,电源质量是一个需要关注的点,例如电压、电流的质量,是否存在电压不稳、飘忽,此时需要加装稳压器或更换稳压电源,这些电源本身带有整流功能,所以电流质量也会有所提高。特别是很多涉及集成电路和PCB板卡之类的项目,对于电压是非常敏感的,电压的波动会导致芯片的损坏,从而诱发失效场景。

  另外多个硬件设备的组合安装中,是否有接地保护,接地电阻是否符合要求,综合布线是否符合电磁兼容要求,有关EMC的标准是否都达到和满足,EMC方面是涉及硬件方面中非常容易出错误的一个领域。这个就需要在现场安装的时候,提前预见到可能出问题的地方。

  多年前,某通信实验室在调试一款信号处理系统时,全向天线接收的波形在某一特定角度解析时,总是会出现一个突出的信号波峰,研究人员认为是软件算法有误,但始终无法定位软件问题,最后发现是放在办公区用来热午饭的微波炉的磁控管发生了泄露,导致了天线接收到的波形异常。这就是一个典型的和系统本身无关,但因为测试周境影响而误判的问题。倘若在测试之前进行EMC的检查,是完全可以避免这个问题的。

  总之,软件失效的排查和现场问题复现,是一个日常看上去非常简单的活动,却往往在这里会出现各种各样的问题,这就需要作为测试工程师,要做到对现场信息事无巨细地收集,对事务流的细节要不厌其烦地确认,才能够降低无效复现的概率,尽快将问题定位。


作者:苗条小胖    

来源:http://www.51testing.com/html/90/n-7799690.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • Selenium是一款基于Web页面的UI自动化测试框架支持多浏览器操作:Chrome、IE、Firefox、Safaria等;支持夸平台,Windows、Linux、Mac等;持多语言,Python、Java、Ruby、C#等。1、Selenium webdriver 原理:Webdriver是按照Client/Server模式设计的Client:编程语言客户端Server:浏览器驱动程序。用来接收客户端的请求并驱动浏览器执行操作然后返回结果Selenium代码与浏览器驱动程序之间是通过http协议进行数据交互的。这种方式,不在乎客户端是什么样的形式,只要数据的格式和协议是服务端能够解析的就...
            0 0 733
            分享
          •   日前,叮咚买菜(DDL.NYSE)公布了2022年第四季度财报。报告显示,2022年第四季度,叮咚买菜该季度实现营收62.0亿人民币,同比增长13.1%;非美国通用会计准则下的净利润为1.16亿元,2021年同期则为净亏损10.96亿元;美国通用会计准则下的净利润4990万元,是公司首次实现了单季GAAP净利润转正,实现全面盈利。  叮咚买菜之所以能够实现盈利,首先是2022年四季度的毛利率达到了32.9%,比上一年同期提升了5.2个百分点,毛利额为20.4亿元,同比上一年同期增长34.2%。  其次,叮咚买菜2022年四季度的履单费用率为24.1%,比2021年同期优化了8.5个百分点,...
            0 0 881
            分享
          •   前言  在自动化测试中,自动化测试用例设计原则就是执行过程时不能存在依赖顺序,那么如果测试用例需要按照指定顺序执行,这个时候应该怎么做呢?目前单元测试框架中unittest没有办法改变测试用例的执行顺序,但是另一个单元测试框架pytest可以做到,辅助测试人员更改测试用例的执行顺序,今天小编简单的介绍几种,如何通过pytest进行更改自动化测试用例的执行顺序  pytest  pytest的执行顺序想必大家都清楚,是通过ascii码进行收集的,然后通过文件中从上往下的执行顺序进行运行,我们只需要将我们的测试用例在编写时,按照从上往下的顺序进行编写。  # coding:utf-8...
            0 0 508
            分享
          • 背景最近在研究如何做接口测试,自己所在的项目,恰好使用的是 HTTP 协议,且内网通信可以直接用 Charles 抓包,能看到明文,自己试着用 Python 的 requests 库进行了收发包,发现可以正常通信,就自然而然的想到了,接口测试落地。之前的项目里,客户端源码也看过一些,网络通信部分也能看懂,但多多少少会有一些问题:序列化/反序列化、加密解密怎么处理?如果用现成代码,C#/Lua 得学;如果用 python 重写,成本太高。抱着侥幸心理,尝试寻找另一种解决方案:从 Python 里调用 C#/Lua 的东西,后来尝试未果。。项目解散,也就没能继续。过程经过探索,编写一条用例流程:构...
            0 0 549
            分享
          •   面试一直是跳槽时期非常热门的话题,虽然现在已经过了跳槽的旺季,下一轮跳槽季需要到年底才会出现,但是当跳槽季的时候你再看这篇文章可能已经晚了,过冬的粮食永远不是冬天准备的,而是秋收的时候。  一、简历准备  简历是你进入面试的敲门砖,也是留给意向公司的第一印象,所以这个很重要,必须在这上面做足了文章,一份优秀的面试简历是整个面试成败的重中之重,我们会详细分析如何准备简历才能保证简历不被刷掉。  简历通常有这几部分构成:  ·基本资料  · 专业技能  · 工作经历  · 项目经历  · 教育背景  我们会逐一进行分析。  二、准备简历模板  万事开头难...
            0 0 704
            分享
      • 51testing软件测试圈微信