APP下载

基于在线流量的自动回归测试平台

2022-07-23杨玉环圣文顺刘进芬

电子设计工程 2022年14期
关键词:测试用例用例重构

杨玉环,圣文顺,刘进芬

(南京工业大学浦江学院,江苏南京 211200)

信息系统上线后通常需要迭代升级或者重构,并进一步保证被修改后系统中原有业务的正确性。简单的业务系统可以通过常规的自动化测试工具及人工测试来保证,但对于业务复杂的系统,回归测试是一项浩大的工程。比如各种网购软件需要时刻为用户提供查看、购买、退订等服务,其稳定性非常重要。为了吸引更多的用户,增加用户粘性,这些流行的软件都要进行频繁的优化升级。

软件测试是软件质量保证的重要手段,软件测试从执行方式上分为手动测试和自动化测试。快速迭代和快速交付迫使人们希望通过自动化测试来提高效率[1]。回归测试是指修改了原有代码后重新进行测试,以确定修改没有引入新的错误或导致其他代码产生错误[2]。相对于手动回归测试,自动回归测试可以大幅降低软件研发过程中的升级与重构成本。每次全面升级,都要进行回归测试,其工作量及困难程度之大可想而知。常规的自动化测试工具需要准备测试数据,编写脚本,加上覆盖率不高,因此无法满足重构后的回归验证要求。虽然可以通过计算回归测试路径优先级,选择性的执行优先级高的测试用例,但商用的软件不能放过任何一个功能测试点,要做到测试全覆盖[3]。近几年流行基于mock 技术实现接口的自动化测试,丰富了自动化测试分层的框架,提高了接口程序自动化守护的质量[4]。或对传统软件开发中的mock 测试技术进行改进,并提出Web 应用下mock 自动化测试工具的系统架构[5-6]。或将测试系统架构进行重构,以自动生成测试用例并处理高并发的请求[7-10]。或开发出软件测试框架需要支持自动生成内含各测试用例细节描述及对应结果等信息的测试结果文件,支持以Web 页面形式对测试结果进行个性化展示与浏览[11]。但如上都只能解决局部的问题,所设计的Dack 导流测试平台实现了自动收集用户请求,并将请求自动转化为测试用例,解决了测试覆盖率低,测试执行效率低的问题,通过复制线上真实流量进行自动回归测试。在该平台的使用过程中发现了很多重构带来的bug,从而提高了重构软件的质量并加快了重构项目的上线进程。

1 平台实现原理

Dack 平台为了应对复杂的业务需求,使用微服务架构来实现[15-18]。其主要功能是收集线上真实用户的流量,将这些流量中的请求和响应存入数据库,并在回归测试时将这部分流量进行回放,以验证更新后系统的功能。所谓线上流量是指软件系统发布并商用后,真实的用户使用该软件所产生的请求响应消息。其原理图如图1 所示。

图1 Dack平台原理图

线上的用户请求中不可避免地携带真实用户的信息,所以需要在复制流量时进行脱敏[12-13],对敏感信息进行分组和匿名化处理。为防止侵犯用户的隐私,该系统对用户的账号、地址等敏感信息进行掩码处理。

对于每日上亿条的Web 请求和响应的写入和读取,需要数据库支持较高的吞吐量以及灵活的可扩展性,系统使用mongoDB 数据库,其中数据以json 文档存放,来保证整个项目的数据使用统一的模型,避免数据转换,提高了在回放过程中比对工作的效率。Dack 平台借鉴了文献[14]中的索引和查询优化的方法,使得在上亿条数据记录中的查询每秒可以完成8 000~9 000 次。

通过将在线流量直接转化为测试用例,大量的真实流量保证了接口高覆盖率的同时,减少了测试设计的工作,使测试人员有更多的时间去分析测试结果从而发现并上报更多的bug。对于测试用例的执行,可以手动触发,也可以定时触发,保证了用例执行的灵活性。对于Web 应用的测试,一般通过发起http 请求的方式来完成,从线上获取的真实请求被回放到测试环境中,即向测试环境发起同样的请求,然后对线上的响应消息和测试环境的响应消息进行全量对比,发现其中的差别,从而识别系统的问题。默认情况下,完全相同即认为用例通过,而对于无需比对的条目或者确定要删除或增加的条目,可以在用例配置模块中进行配置,忽略该条目,不影响用例执行结果。

2 平台使用场景

Dack 平台通过在网络层录制流量,获取的内容包括:1)用户请求的url 以及参数名字和参数值,参数支持key=value 的格式,以及json 格式。2)系统返回的响应消息,其中包含return code,响应消息体,然后进行请求回放。其应用场景如图2 所示。

图2 Dack平台应用场景

该平台可以在日常的自动化接口测试时使用,也可以在开发人员每日提交了持续集成的代码后触发,还可以在系统重构后手动触发,适合多种测试场景,又因测试用例都是自动化用例,相比较于手动用例,执行效率要高很多。在日常开发过程中,当需要确定新增加的代码对其他模块功能没有影响时,可以手动一键触发自动化测试任务,批量执行选定的测试用例。在自动化接口测试阶段,被测系统的接口功能需要进行测试,它可以通过执行测试人员编写的测试用例或Dack 平台提供的测试用例来完成。对于重构测试,使用在线流量录制请求的回放,更容易发现重构代码中的bug。

3 平台回归测试过程

测试执行都是从测试用例开始的,Dack 平台采用复制流量的思想,基于服务器也就是在应用层对请求进行复制,相对于在IP 层复制流量后的诸多修改以及后期复杂的运维,其优势在于实现简单,它的测试结果也更真实。Dack 平台复制的http 在线流量会被存储到mongoDB 数据库中,一个http 请求报文可以由请求行、请求头、空行和请求体4 个部分组成,其中请求行由三部分组成:请求方式、请求资源的路径、http 协议的版本。Dack 平台主要处理GET方式的请求和POST 方式的请求,其中GET 方式的请求只有请求行、请求头、空行,没有请求体,因为它只是从服务器获取信息,而POST 方式的请求包含如上所说的http 请求报文的4 个部分。

Dack 平台根据url 信息,对于GET 请求,首先分离出方法名作为用例名称,把请求行中以&连接的key=value 形式的参数分离出来,作为测试用例的输入数据,json 格式的响应结果作为测试结果直接存储在mongoDB 中;对于POST 请求,用例名称和测试结果的分离方式与GET 请求相同,但请求行中的参数同时支持key=value 的parameter 格式和json 格式,这对于Dack 自动生成的测试用例没有影响,但对于需要手动添加的用例,需要指明是parameter 格式还是json 格式。

触发单条或多条用例时,Dack 平台从mongoDB中拉取一条预先存放的在线请求及响应结果,并向测试环境中的服务器回放该请求,然后将测试结果与在线的响应结果做全量比对,得出执行成功或失败的测试结果。以查看某一应用为例,回放的过程如下:

DServiceImpl.execute(realBody)//测试用例触发回放

expectResult.setR(realBody)//确定期望结果

detailService.get(realParam)//设定请求参数

detailDaoImpl.search(realParam)//执行查询操作

DServiceImpl.execute(expectResult,testBody)//执行比对操作,得到用例执行结果

以查询应用详情接口为例,将用户查询应用详情过程中的参数保存下来,在回放时把参数添加到请求消息中,然后发送请求到测试环境中的Web 服务器,获取查询请求的响应结果,收集及回放流量过程如图3 所示。

图3 收集及回放流量过程

在线请求的录制根据url 和参数来区分不同的请求,当用户查看一个应用详情时,会产生5 个请求,它们的url 和参数相同。所以在测试环境中可以直接回放。在线请求通过测试用例触发来回放,测试用例中url 和参数项是固定的,参数值在mongoDB中获取,同样对应用详情的查询请求,可以有千万个不同的用户产生千万条不同的具体请求,在进行一键回放时,mongoDB 随机选取一条来回放,以实现用例的多样性。

4 平台实现

对于测试人员,Dack 平台属于B/S 结构,用户只需要通过浏览器的网页进行项目添加、用例管理、参数配置、结果对比等操作;但对于平台的服务端而言,它属于C/S 结构,Client 端包含流量复制插件的路径、缓存管理、数据库管理等功能,Server 端包含任务管理、客户端运行管理,通过消息队列执行流量的获取和回放、对比管理等,其架构图如图4 所示。

图4 Dack平台架构图

4.1 B/S中的前端设计

Dack 平台的前端提供友好且易操作的处理流程,从流量录制后自动生成的测试用例到各种参数配置、流量回放操作以及对比的设置,结果展示简洁明了。

流量录制功能:主要完成录制任务,内容包含录制的服务器IP 地址、接口范围、录制的时间等。

对比设置功能:可设置特殊化对比规则,正常情况下,升级或重构后的系统,对于固定的一个接口,同样的请求应该返回同样的响应结果,但对于响应结果有改变的接口,就不能采用全对比的方式,而要做一些设置使升级前后的结果对比达到部分相同即可让测试用例通过。

敏感信息配置功能:1)掩码的方式,将保密性的信息使用如“*”、“#”等掩盖起来;2)编码或密文的方式,将认证信息改变后进行存储。

回放IP 配置:支持将流量回放到不同的测试服务器上,支持设置代理等功能。

参数类型设置:Dack 平台支持被测系统中,包含的http 请求及响应的参数有application/json,text/xml,并针对两种类型做相应的解析处理。

针对使用Token 进行多用户验证的软件系统,Dack 平台提供“Token 获取设置”,该功能为测试用例中的Token 部分提供实时获取功能,以便用例能正常执行。基于Token 的身份验证过程如下:1)用户使用账号和密码登录服务器;2)服务器验证通过;3)服务器返回一个带签名的Token 到客户端;4)客户端存储Token,并且后续每次访问服务端都是用该Token 作为身份信息;5)服务器验证Token,并返回相应的结果。Dack 平台的“Token 获取设置”就是测试人员通过对服务器身份验证接口的调用来获取当前用户的Token,然后存储在自定义的变量中,以便在测试用例中使用。

任务控制功能:提供创建定时任务/一次性任务,还可以进行一键触发任务的操作;展示任务列表中各任务的状态等。

运行统计和结果报告功能:展示任务中的总用例数、成功和失败的用例数、任务的执行IP、执行持续时间等。

在对比分析中,展示在线请求及响应和在回放时的请求及响应,对于不同的地方进行高亮显示,以方便测试人员分析定位问题。执行的成功或失败的结果也以高亮展示。这里的对比设置,不同前面的对比规则设置,这里只做临时性的忽略或删除某个对比项,以改变测试用例执行结果,从而影响整个任务的测试用例的通过率。

4.2 B/S中的后端设计

流量录制模块作为一个插件安装在在线服务器上,通过Java Invoke 和http Invoke 功能,以Java 切片的编程方式进行在线流量录制,从而不仅支持外部接口的验证,还可以对内部接口进行验证,如访问数据库的入参和返回结果等,这些流量存放在配置文件中指定的测试数据库mongoDB 上。对于一些在线流量超大的接口,如每天过亿的请求,可以选择设置百分比录制来减小服务器的压力。

Dack 平台还通过IP 隔离和数据库隔离功能,将在线环境和测试环境进行连接的同时保证它们互不干扰。回放模块使用高吞吐量的发布订阅消息系统kafka,完成从mongoDB 获取待发送的请求并在测试系统回放的过程。回放模块在mongoDB 前增加redis缓存,以提升查询效率。

5 结束语

文中设计的自动回归测试平台基于在线流量自动生成测试用例,通过单个或批量测试用例的执行将在线流量回放到测试环境,平台利用mongoDB、redis、kafka 等工具搭建了一个高吞吐量、易用的测试平台。平台通过全流量复制保证回归测试的覆盖率,同时一键回放功能提高了测试执行的便捷性。目前该平台仅仅支持接口测试,对于界面的测试还需进一步研讨开发。

猜你喜欢

测试用例用例重构
“双减”能否重构教育生态?
长城叙事的重构
基于干扰重构和盲源分离的混合极化抗SMSP干扰
资费拨测系统的研究与应用
用四维的理念重构当代诗歌
用例规约在课程成绩管理系统需求分析中的应用研究
使用用例建模进行软件需求分析研究
测试用例集的优化技术分析与改进