前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >浅谈质量保障手段之巡检技术

浅谈质量保障手段之巡检技术

作者头像
互联网金融打杂
发布2022-08-01 14:24:35
5330
发布2022-08-01 14:24:35
举报

引言

又到周末了,思前想后不知道写点什么,那就从以前经历的一个线上缺陷说起,聊一下软件质量保障的巡检技术。

我认为质量保障的手段有主动发现与被动发现之分。通常,大家所听到的测试左移,例如测试参与的code review、每日运行的接口自动化用例以及软件测试异常注入等,可以划分为主动发现缺陷的手段,可以理解为对缺陷发起主动“进攻”。而项目上线后,主动缺陷发现手段则不便在生产环境继续使用,当然根据测试右移的思想,我们可以通过生产环境服务监控、错误日志发现等被动方式监测到线上的抛错问题,可以将此手段归类为被动发现手段。主动和被动手段没有哪种更好之分,都是质量保障的一部分,二者结合方可提升业务测试质量。

大家都知道,软件测试是无法穷举测试的,即测试只能证明软件存在缺陷,不能证明软件没有缺陷。主动手段不能保障产品发布后就不会有缺陷产生,因而可以使用被动手段弥补,监控风险较高的功能or服务。

        此外,做过接口自动化的小伙伴都知道,自动化用例是否有效,可以将发现的缺陷数作为一个衡量指标,这样测试人就必须尽可能丰富用例的断言内容,例如接口断言、DB断言等。纵然如此,断言在某些场景下仍然存在不足。因为有时候即便不合理的业务输入也可能存在正确的输出结果。今天介绍的案例就是这样的一个case。

案例

业务场景是这样的,存在一个服务A,可以根据输入内容,将内容中存在的MP3信息解析出来,然后转存到我们自己的服务器上,生成一个MP3的链接地址,并在前端页面(用户端)渲染出来(允许用户点击播放MP3内容)。

起初测试同学测试这个服务的时候,没有考虑MP3本身的可播放性,只是通过页面展示的MP3图标作为预期结果(当然测试在真实测试过程也会主动去点击播放,但是问题是mp3太多,所以不能全部都点击播放一遍)。接口测试也是只对接口返回的MP3标签内容进行check,没有对其可用性进行断言。

代码语言:javascript
复制
<audio src="mp3 url" id="yourid"   controls="controls" loop="loop"> </audio>

突然有天就接到了来自业务方的反馈,说C端用户投诉APP端展示的MP3内容无法播放,影响了用户体验。我们这边开发通过排查发现,确实在转存服务器的过程有些MP3文件本身损坏,导致无法播放。开发意识到服务器上仍然存在损坏的mp3文件,需要对服务器上的Mp3文件进行一次全量的扫描。因为数量之大,肯定不可能考虑人工check,只能使用自动化手段,而我通过研究MP3自身属性发现,损坏的MP3属性相比可播放的Mp3是不完整的,可以通过自动化的手段在线扫描MP3自身属性,如果发现MP3某属性缺失可判定为文件损坏。

TIP 通过FFMpeg可以查看MP3属性,具体操作详见 https://ffmpeg.org/ffmpeg.html

有效的MP3会有Metadata,而无效的MP3则无,可以肯定的是损坏的MP3属性是不完整的。

代码语言:javascript
复制
 Metadata:
    comment         : 5023415_499131
    genre           : 5023415_499131
    encoder         : Lavf56.4.101
    disc            : 
    track           : 
    artist          : Dan Gibson
    title           : The Canon Stirs
    album           : Pachelbel: Forever by the Sea
  Duration: :04:25.95, start: 0.025056, bitrate:  kb/s
  Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 320 kb/s
  Stream #0:1: Video: png, rgba(pc), 500x500, 90k tbr, 90k tbn (attached pic)
    Metadata:
      comment         : Other

解决方案

为了解决这个问题,针对存量MP3,我们通过脚本进行一次全量扫描,发现损坏MP3即下架;针对增量MP3,将脚本部署到服务器作为巡检脚本,通过Jenkins调度此任务,每日定时对当天产生的MP3文件进行扫描,发现损坏MP3,告知相关同学进行重传或下架。

第一时间想到的使用Python的eyeD3库进行MP3属性信息获取,可以使用如下代码查看MP3标签信息。

代码语言:javascript
复制
import eyed3
audiofile = eyed3.load('Valid-TheCanonStirs.mp3')
# audiofile = eyed3.load('invalid-test.mp3')
print(audiofile.tag.title)
print(audiofile.tag.artist)
print(audiofile.tag.album)
print(audiofile.tag.track_num)

如果有效MP3,则输出,否则则会报错。

所以有时候自动化并不一定需要多高深的技术来实现,简简单单代码就能实现自动化(当然上述代码不是用来巡检的脚本,因为量比较大,需要多进程并行检测)。改进后通过巡检技术方案检测损坏MP3的流程图如下:

因为是离线巡检问题数据,这个方案仍然存在一定的延时性,但是我们当时的业务对实效性要求不高,只要当天能把入库的MP3巡检完毕即可,这样也可以解决问题了。

思考

巡检技术其实不是什么高深的技术,可以理解为接口自动化的补充,去做一些直接通过断言无法做(抑或断言成本高)的事情。对于实效性要求不高的业务,可以借助异步手段实现数据准确性校验。对于实效性高的业务,建议让开发对服务多打日志,通过检测错误日志(当然错误日志也是有等级的,这个可以根据基于业务自身定义,级别较高的需要立刻响应)实现第一时间发现问题并报警。

此外,为何借助于Jenkins实现任务调度,难道使用Linux服务器自身的Crontab实现定时任务不行吗?答案是可以的,但是Jenkins更易于巡检任务的管理,特别是当巡检任务比较多的时候,可以将Jenkins理解为一个简单的巡检任务管理平台,在Jenkins服务器上部署巡检脚本、报警等配置,算是一整套的解决方案(部署->调度->报警)。当然了,Jenkins管理巡检任务也有缺陷,例如巡检发现的问题统计,如果想做的更好建议开发简单的巡检平台,考虑从 脚本开发->部署->调度->报警->数据统计 全流程覆盖。实现也简单,工作量更多在于前端管理系统开发,调度/部署层 可以基于Jenkins Open API实现(以后有机会详细介绍Jenkins),直接调用接口即可。其他的可以额外开发接口即可。

好了,就到这了,最后给大家抛一个问题:评判接口自动化用例是否有效的指标有哪些?

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-07-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 案例
  • 解决方案
  • 思考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档