自动化测试之流量录制回放

1829 篇文章 51 订阅
603 篇文章 1 订阅

 自动化驱动模式

相信大家对“关键字驱动”和“数据驱动”这两个名词都已经很熟悉了,但是还有一些小伙伴其实对怎么定义它们还有些误解。比如前面讲的,我们把测试脚本中的数据参数化出来,放在一个文件里,是否就代表它是数据驱动了?并不是。

我们说“X 驱动”,就是以“X”作为输入,控制测试流的走向,获得对应输出的意思。比如一台播放机,放入不同的 CD,就会播放不同歌曲,那么我们就称这个播放机是“CD”驱动的。再比如我们做定格动画,把不同的物体状态拍摄下来,连在一起成为影片,就称这个动画是“物态”驱动的。

以上两个例子分别对应数据驱动和关键字驱动的概念,CD 就是播放机的数据,物态就是动画的关键字。如果把播放机的 CD 读取模块改成一块不可替换的独立存储芯片(类比数据参数化到文件),这时播放机的输入和输出是固定的,那么我们就不能说它是芯片“驱动”的,即便它是提取出来的一个单独模块。

严格上说数据驱动的方式会更早一点(关键字驱动模式从 QTP 之后才被明确化),早期的测试脚本都比较简单,也比较分散,在进行自动化测试的时候,往被测试脚本中注入不同的数据即可。注意重点是通过“不同”的数据测试“相同”的脚本,数据放在什么位置并不重要,并不是一定要用 Excel 之类的工具,哪怕内置在代码中也行。

随着软件架构的复杂化,单个脚本的代码量越来越多,给自动化维护工作带来了很大的麻烦。于是关键字驱动模式应运而生,将不同的行为封装成“动作”,再通过各种“动作”组装形成测试。这里也要注意,重点是“动作”的封装和调用,粒度上是可大可小的,比如往大可以是一个模块的流程,往小可以是一个点击的动作。

不论是数据驱动还是关键字驱动,本质上就是为了代码复用,只不过复用的对象不同而已。所以重新理解上面说的:数据驱动即是使用不同的数据集,复用相同的测试过程;关键字驱动即是使用不同的关键字组合,复用相同的测试动作。

实际上,现在一般都是采用混合驱动的模式。比如我们的测试过程由“登录->查看->下单->评价”组成,登录部分可以是普通账号或会员账号,查看下单的可以是折扣商品或非折扣商品,评价可以是一星或五星,混合驱动模式即可提供“关键字 x 数据”的全用例组合测试。

流量回放技术

开篇的时候有提到,流量回放技术是自动化测试领域一项重要进步。传统的自动化测试方法一直有着“覆盖率”的问题:即我们的自动化测试需要覆盖到什么程度才算足够?并且生产环境的用户数据格式很难预估,导致有很多缺陷是由于对某些特定数据形式的不兼容引起。

流量回放技术很好地解决了这个问题,它基于生产环境的真实流量和请求参数(用户数据),来验证测试(或预发)环境的待发布代码,在真实性、准确度和覆盖率方面都有着极为优秀的保证。流量回放技术本身并不复杂,总的来说可以分成:采集->记录->回放这三个过程

流量采集的位置一般有两种:网络层和应用层。网络层的采集通过数据包的复制来实现(无代码侵入),应用层的采集通过类似 AOP 的方式来实现(少量代码侵入)。网络层更适用于性能方面的验证(限制或放大流量),应用层更适用于功能方面的验证(真实用户请求)。因此基于本文自动化测试的主题,我们主要来说下应用层。

应用层的采集点通常位于控制器层(Controller),通过拦截器(Intercepter)记录请求地址、请求头,请求参数、返回结果等信息,经过脱敏后写入 DB (或者中间加个 MQ 做二次处理后再写入)做持久化处理。在录制的时候,可以以适当的比率截取,以减轻录制侧的压力,对线上访问的性能表现也不会产生过多干扰。

上面过程有一个问题是:对于写入型的流量要怎么处理。因为很多时候回放环境和录制环境用的是同一个数据库,如果在回放环境调用写接口,会导致生产环境脏数据的产生,这是不可接受的。即便是使用不同的数据库,也会有需要重复写的情况,来保证测试的幂等性。因此,写入处理是录制回放技术必定会面临的一个难点。

为了解决这个问题,我们同样可以将一些中间件的请求和返回做录制和回放。比如 DB,可以对 DAO 层的结果进行拦截和记录,作为请求的上下文一并持久化。这样在回放的时候,就不用去 DB 里操作,只要从存储的上下文中读取即可。这个方法其实也是在做 Mock,只不过对业务代码的侵入较少。

录制回放的过程可以是实时的,也可以是离线的。实时指的是一边录制一边回放,中间不一定要经过 DB,通过 MQ 来传递即可。离线指的是录制和回放过程是独立的,因此中间需要有个持久化的步骤,录制下来的流量,可以在任意时候进行单次或多次回放,灵活度较实时回放更高。

前面提到的流程回放技术,大多用于接口层的测试,利用类似的思路,我们其实可以在其他层面复用这套逻辑,比如代码层测试和界面层测试。它们的技术原理与接口层相差不大,只不过录制和回放点有所区别。

代码测试(这里特指单元测试)的采集点位于方法层,采集的是方法的入参和返回值,可以利用反射机制做统一处理。界面测试的采集点位于前端层,采集的是用户的操作,可以使用埋点上报的方式处理。其它诸如 Mock 之类的机制,与接口层的处理是类似的,直接复用就行。

通过这种方式,我们就能够将流量回放技术用于单元测试和 UI 层自动化测试,给自动化测试带来更多的可能性。由此可见,当我们在了解一项技术的原理之后,不妨做一些发散性的思考,或许就能获得一些创新的方法。

最后:下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

全部资料获取

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用中提到了一种利用日常功能测试来进行流量回放的方法,通过代理获取到API的请求与响应信息,并将这些请求信息进行回放或生成测试用例。在该方法中,可以通过人工进行修改参数化提取、变量引用、断言等来形成API自动化测试用例。这个方法可以在项目地址中找到相关的代码和流程图,可以根据具体需求选择不同的方式进行流量回放。其中,方式1通过指定文件或目录进行回放,方式2则通过将用例入库后执行测试。中的项目地址可以获取更详细的信息和具体代码实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [自动化测试流量回放技术](https://blog.csdn.net/AI_Green/article/details/121308776)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [python接口自动化13-流量回放](https://blog.csdn.net/qq_42675140/article/details/127376880)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值