华人澳洲中文论坛

热图推荐

    流量回放测试在学而思1对1的最好理论

    [复制链接]

    2022-11-8 06:40:30 18 0

    配景
    跟着互联网竞争愈来愈剧烈,产品的变卦迭代也愈来愈频繁,回归测试任务就变得沉重且紧迫,这对测试团队的测试品质和效力带来很大的压力。面对愈来愈多的回归测试工作,以及对回归测试提出的更高的要求,而传统的接口自动化测试的保护本钱过高、公司自动化测试单薄的现状缓缓成为测试团队十分为难的存在。团队迫切需求一套牢靠、低保护本钱的测试计划,目前最火确当属流量回放测试。
    目前学而思1对1团队采取的是单办事Mock计划,底层采取的是滴滴的开源计划,团队在开源的根底上结合团队本身的特征,在准(基于代码掩盖挑拣流量)、快(散布式履行)、稳(经过引入参照系讲演)、易用性(平台化)等多个方面做了进一步的开发任务。
    技术计划
    总体计划
    PHP 部份采取的是RDebug[1] Golang 部份采取的是sharingan[2]
    由于咱们需求使用线上的实在流量来进行线下的回放测试,所以咱们需求将线上的实在流量保留上去,而后将保留的实在流量在线下环境进行回放一遍。全部中心技术计划就是流量录制和流量回放
    流量录制进程
    流量录制是甚么?
    即录制线上办事实现一次业务调用,接纳到的申请、调用上游办事及其前往、业务终究响应的整个网络信息。
    全部录制进程是怎么样的?


    前端或其余运用发送 get 或 post 申请,抵达 nginx 办事器,转为 fastcgi 协定,交给 php-fpm 的 worker 过程处置。代码运转本人的逻辑、按照需求对外发动申请,如 mysql、redis、其余运用的 http 或 rpc 申请并承受这些内部调用的响应。运用前往业务的响应数据。以上网络数据,构成为了一次残缺的业务逻辑波及的一切网络调用。
    全部进程发生的网络数据都会在申请和前往的时分,复制一份发送给recorder。recorder 整合记载后,会将一条残缺的申请响应记载保留为一条流量用例(session),存储在 es 中。
    流量回放进程
    流量回放是甚么?
    即用线上录制的流量,经过流量婚配 mock 掉上游网络调用申请,实现对线下测试代码进行回放测试。
    全部回放进程是怎么样的?


    “system under test”是被测试的办事,“inbond server”用来摹拟客户端发动申请,“outbond server”用来摹拟 php 业务代码对内查用的其余办事,如 redis。“inbond server”作为客户端,经过 http,将要回放接口申请信息,发送给被测试的办事,也就是咱们的 php 办事。被测试办事,接纳到申请,履行本人的业务逻辑。当被测试办事需求调用内部接口或存储的时分,发动对外网络调用,此时申请会被转发到 outbound server,经过婚配机制,按照线上记载前往这一条网络申请的响应数据,实现对内查用的 mock。被测试办事实现业务逻辑,前往后果,与线上响应进行比较。录制和回放对代码有侵入性和机能影响吗?
    由于滴滴 RDebug 计划,采取的是传输层录制计划,所以对业务代码零侵入。以后,上线 php 录制名目 66 个,在容器环境下,经过采取旁路 recorder 异步汇总、发送流量信息的形式,对业务的响应时间没有影响,但内存损耗同比增大 2 倍。
    流量回放平台(Pandora)
    目前滴滴的开源组件曾经很好地完成了录制和回放功用。然而,对单条流量的回放,是无奈保障名目的总体品质的。基于契约测试的实践,咱们的流量回放,是需求掩盖被测试办事线上一切被调用的逻辑,能力包管测试品质。
    所以,咱们研发了 Pandora,完成了下列几点功用:
    1.关于掩盖接口逻辑方面,完成了基于代码掩盖去重的流量筛选。2.关于履行速度方面,采取了 k8s 散布式 Job 并发履行。3.关于回放接口选择方面,经过剖析修正函数,仅回放本次修正被影响到的接口。4.关于修正接口和新接口,经过引入测试流量来完成对其的回归。5.关于后果确认方面,采取流量校准反馈的形式造成闭环。6.关于易用性方面,开发了一个 web 平台便于查看讲演以及剖析。
    而要完成基于消费者契约的 API 测试,咱们首先要对代码逻辑的充沛掩盖,那末如何用更少的流量来保障充沛的掩盖呢?
    基于代码掩盖去重的流量筛选
    在录制阶段,咱们会将这个办事接纳的一切的申请整个录制。而为了包管测试品质,需求掩盖整个线上逻辑,显然,咱们不成能将线上的一切流量整个回放一遍。
    为此,咱们的研发基于代码掩盖去重的功用。其详细完成如下:
    1.咱们经过修正 RDebug 源码,添加了流量的代码版本信息及所属的接口。
    2.咱们经过天天早晨的按时工作,对前一天这个名目、每个版本(一天屡次更新)、每个接口一切的流量进行回放,这里会按照流量发生的代码版本,使用对应的代码进行回放。
    3.关于一个名目的一个接口,剖析他的代码掩盖度状况,并与相反版本的流量进行比较,假如掩盖的代码彻底相反,则履行去重操作。


    由此,咱们就获取了这个名目,线上被拜候一切逻辑的聚拢。
    k8s 散布式 Job 并发还放
    通过对测试用例的过滤,咱们极大的增加了每个名目,履行流量回放进行回归,需求使用的测试用例数量。然而为了掩盖一切逻辑,依然需求履行数百乃至上千的流量用例。假如程序履行,需求耗时数小时,时效性难以承受。为此,咱们借助了 K8s 的散布式履行才能,并发履行上百个子工作进行回放,履行时间缩短为以前的百分之一。


    革新优化后能够在 6-20 分钟摆布,实现一个名目的回归测试。
    引入精准回放


    在回放的过程当中,有一部份误报,是由于其余迭代的修正引入的,那末如何打消这部份误报,使失败的接口都来自于本次代码变卦。
    关于 php 名目,咱们在掩盖度剖析的回放中,还会获得这条流量的 trace 剖析数据,包罗了本次申请,所调用的函数、函数的参数和响应等。保留在数据库中待查。
    当开发 push 或 merge 代码到 master 分支,咱们会自动剖析,本次代码修正,影响了哪些函数,而后,从流量-调用函数库中,获得到本次修正影响的流量,使用这些流量对修正的接口进行精准回放。
    同时,咱们还采集了回放时对新代码的掩盖状况。


    下列图为例,本次新增的 addCo妹妹onClue 函数,咱们只回放了 add_co妹妹on_clue 一个接口,在两个版本的 6 个流量,就对本次代码的修正进行了精准的掩盖。
    引入测试流量
    在咱们的初期落地阶段,由于能够使用最贵重的线下流量,所以始终使用的线上出产流量对新代码进行回归,能够对未修正的接口进行很好的回归掩盖。但若一个接口修正了,那末此时的线下流量回归失败,实际上是一种误报。同时,咱们无奈掩盖本次迭代新增的接口。
    而咱们的解决计划是,引入凝固了测试教师智慧的测试流量。
    这样,关于一个接口,采取了最新版本的出产流量、最新 3 个版本的测试流量来进行回放。
    从后果上剖析:
    线上和测试都胜利:未修正的旧接口线上失败、测试胜利:修正的接口、且测实验证胜利、自动化回归胜利3线上失败、测试也失败:修正的接口、测试存在漏测或非预期的代码提交,需求测试进一步判别或补测无线下流量,测试胜利:新增的接口经过引入测试流量,咱们完成了对不同接口类型的回归掩盖,打消了特定的误报。


    以本接口回放为例,线上最新版本的流量回放失败,然而下方 feature 的最新测试版本流量回放胜利,据此能够判别这是一个修正接口,且测试曾经验证,回归阶段无异样,不需求增补测试。
    引入后果校准反馈
    当咱们又准又快的实现了流量回放之后,还需求开发和测试来确认回放后果。当存在失败的回放时,更需求开发判别,是由于这次更新的新功用致使的失败,仍是由于更新影响到了不应变化的逻辑,引入 BUG。


    目前关于失败的测试,咱们提供了 5 种失莠民型用于反馈:
    BUG:新的代码,存在 bug
    回放过错:婚配战略,有可能失败,致使回放失败
    预期新功用:新的代码逻辑,致使的预期的回放失败
    非预期新功用:新的代码逻辑,影响了非预期的接口和逻辑
    验证缺点修复:线上代码是 bug,线下测试代码在进行修复
    经过平台化来升高使用门坎
    为了便利测试和开发使用,咱们还提供了下列功用
    提测自动回放经过提测 CI 流水线自动触发工作履行
    当开发和测试进行提测或合入 master 代码筹备上线时,都会触发自动对相干的名目和分支进行回放,约 6-20 分钟后履行终了,经过钉钉将后果发送到相干群组。


    左边能够查看接口、回放的版本失败状况,右边展现了失败的扼要信息。
    点击流量测试的 id,右边展现测试回放讲演和参考回放讲演详情。


    当咱们需求详细的剖析失败缘故时,能够经过剖析对外网络调用的 mock 状况以及日志来查看和剖析。


    当开发和测试剖析完失败缘故之后,则需求进行人工校准,关于同一个接口-版本,咱们也反对批量校准。


    平台技术架构
    为了完成上述功用,咱们的平台次要包罗下列三个模块:流量 case 保举模块、工作履行模块、剖析标志模块。


    以后的落地成果
    目前 Pandora 掩盖 1v1 一切 php 名目,近 3 个月反对迭代 246 个,日均回听任务 10 个。


    基于录制流量的二次开发-影响规模评价
    为了反对开发和测试教师更好地在测试前,评价对上上游、数据库的影响规模,潘多拉平台提供了影响规模评价功用。
    能够检索下列三种状况的影响规模:
    1.修正名目内某个函数后,会影响以后名目哪些接口
    2.修正以后名目某个接口,有哪些名目的接口会调用以后接口
    3.修正以后名目某个 mysql 数据库,有哪些名目的接口,也用到了此数据库
    完成原理
    咱们经过录制线下流量,采集到这个接口对外的网络调用、数据库调用。经过对线下流量进行回放,采集到这个接口会调用的函数信息。
    基于以上数据,当研发修正了某个接口、修正某个数据库的时分,咱们能够评价其影响规模,将本来耗时数小时且可能存在脱漏的评价进程,优化为只需几秒钟就能获得片面、残缺的影响规模。
    函数修正评价
    好比在评价或者开发阶段,筹备修正某个函数的时分,能够经过检索,肯定会影响哪些接口,防止评价的疏漏。


    咱们能够看到,关于getAfterPoint这个函数


    实际上有两个同名函数,属于不同的namespace和类。包罗:
    TimeHelper::getAfterPointUtil::getAfterPoint关于影响名目的接口,以 tms 为例


    点击能够看到详细的接口称号,接口最初的拜候时间(默许只统计了近30天有拜候的接口数据),录制次数,则表现了这个接口的繁杂水平。
    接口修正
    当一个名目修正了某个接口,能够经过平台来评价有哪些名目会调用这个接口。这里以 cc-v2 的 rpc 接口 getCidByStudentUid 为例:


    经过影响规模评价能够发现,这个接口被 plan 的 getinfo 和 Ims-api名目的 student_info 两个接口调用。测试火伴就能有针对性地对这两个接口发展测试任务了。
    数据库表修正
    当开发需求调剂 mysql 数据库的表构造,进行更改等操作时,假如但愿知道,还有哪些名目,也用到了这个表。能够经过数据库表类型进行检索,以后只反对对表名进行检索。这里以迭代中对 student_follow 表进行修正。查问之后能够看到,一共有 5 个名目,60 个接口会调用这个表。测试火伴能够有针对性的对这些库表进行测试了。


    将来可期
    以后基于流量回放的回归测试,重点是经过线上和线上流量保障未修正接口、修正接口、新接口的修正合乎预期,实现自动化的回归测试。将来的致力标的目的是但愿借助 AI 机器学习的才能,自动实现后果剖析、用例保举等功用,赋能业务测试教师,让业务测试教师将更多的时间投入到更有价值的任务中。
    [1] RDebug: http://github.com/didi/rdebug
    [2] sharingan: http://github.com/didi/sharingan
    作者:品质效力团队
    出处:http://mp.weixin.qq.com/s/KbkounhaoynY5DAoxaNA7w

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    返回列表 本版积分规则

    :
    注册会员
    :
    论坛短信
    :
    未填写
    :
    未填写
    :
    未填写

    主题26

    帖子30

    积分132

    图文推荐