Page 106 - 《软件学报》2021年第9期
P. 106
2730 Journal of Software 软件学报 Vol.32, No.9, September 2021
微服务架构(microservices) [2−5] 是一种高度模块化的架构模式,它提倡将应用系统根据业务种类和关系划
分成一组服务,每个服务能够被独立部署到生产环境、运行在独立的进程中,服务间采用轻量级通信机制交换
信息.与单块架构相比,微服务架构具有业务内聚、易扩展、高容错、平滑升级等特点,更能适应 Web 应用系统
的业务快速扩展和迭代的现实场景.
微服务系统通过不断迭代来扩展功能.每轮迭代都会改变服务本身及其依赖关系,可能引入新的故障,需要
[6]
通过回归测试来保证系统质量 .回归测试最直接的策略就是重复执行原有全部测试用例,但这种策略会造成
不必要的资源浪费.为此,很多关于回归测试技术的研究提出:可以针对特定目标(例如保持覆盖性、降低成本、
[7]
关注变更等)进行有选择性的测试,提高有限资源的使用效率 .其中,测试用例集选择、排序和缩减是 3 种主要
[6]
的回归测试技术 .
测试用例集缩减是一个 NP 完全问题,旨在获得原测试用例集的一个子集,该子集能够保持原测试用例集
[6]
的覆盖能力 .其典型技术有启发式方法、基于模型的方法和测试数据聚类的方法等,这些技术大都需要完整一
致的系统规约和架构描述作为输入才能实施.而在工程实践中,测试人员很难获得微服务系统的规约与架构信
[8]
息 ,这涉及管理和技术两个层面的因素:在管理层面,各个服务独立开发运维、高度自治,难以统一维护所有服
务及其版本演化过程的文档;在技术层面,受延迟绑定、请求转发等机制的影响,特别是智能化网关的引入,使得
服务之间调用关系变得不可预测,难以获得确定的服务调用关系描述.这导致在微服务系统的回归测试中难以
应用现有技术.另一方面,现有测试用例集缩减技术大都关注软件自身实现的正确性,很少考虑用户使用场景,
这可能造成测试场景和使用场景发生偏离,测试用例集不能聚焦用户关注的服务,导致测试效率降低.例如:为
特定用户群体定制的迭代版本只依赖部分服务,强调对所有服务的覆盖可能会造成不必要的测试.
值得注意的是:在微服务系统持续交付过程中,可以采集到大量的 API 网关层日志.API 网关层是用于集中
分发服务请求的关键组件,其日志记录了微服务系统运行过程中的每一次 API 请求,内容包括调用者 IP、被请
[9]
求的 URL 和状态码等信息,主要用于监控服务运行状况.借鉴 Web 日志挖掘技术 ,能够从 API 网关层日志中生
成反映用户使用场景的服务调用路径信息,进而关联到测试用例中,作为缩减测试用例集的依据.
本文提出了一种基于 API 网关层日志挖掘的微服务回归测试用例集缩减技术,主要包括日志挖掘、测试用
例关联和缩减这 3 个环节.首先,在日志挖掘环节,从 API 网关层日志中提取数据集,进而设计频繁模式挖掘算法,
从数据集中挖掘用户使用频繁的服务及其调用关系,即服务调用频繁路径;其次,在测试用例关联环节,将服务
调用频繁路径匹配到对应测试用例上,以赋予测试用例关于用户使用场景的信息——支持度;最后,在缩减环
节,基于支持度对测试用例进行启发式搜索,找到符合覆盖准则的测试用例缩减集.为验证方法的有效性,基于
实际项目数据对该方法进行了实验和分析,结果表明:该方法既易于实现,也能提高测试效率.
本文第 1 节概要介绍微服务回归测试和 Web 日志挖掘的相关研究.第 2 节详细阐述本文所提测试用例集
缩减技术的各个环节.第 3 节简要叙述实验验证及分析.第 4 节进行总结.
1 相关研究
1.1 微服务回归测试
对于微服务系统,回归测试在其每一轮迭代都有发生,单元测试、服务测试和端到端测试都需要进行回归
以保证系统质量.微服务单元测试主要用于发现服务内部代码实现存在的缺陷,可以通过单元测试工具完成,例
如 xUnit [10] 、Mockito [11] 等,其回归测试技术与单块架构软件基本一致.服务测试和端到端测试关注服务之间的
连通性,涉及多个服务及其之间的调用关系.由于服务自治、动态绑定、访问限制带来的挑战 [12] ,服务测试与端
到端测试的回归测试技术与单块架构软件差别较大,是研究和实践关注的重点 [13] .
[6]
在测试用例选择方面,主要是基于系统迭代时发生的变化来筛选相关联的测试用例 .由于传统黑盒测试
技术也适用于单个服务回归测试,大部分研究工作都关注服务之间组合关系的变化,包括接口变化 [14,15] 、业务
流程变化 [14−17] 和动态绑定关系变化 [15,16] 等方面.其中,文献[14,16]采用路径分析方法,该方法比较迭代前后服务
之间的调用路径变化,进而选择包含这些路径变化的测试用例;文献[17]提出一种图遍历技术,该方法与路径分