当前位置:首页 期刊杂志

基于依赖分析的回归测试工具设计与实现

时间:2024-07-28

单雅辉, 张宝印, 张庆, 张璇, 秦英

(1.中物院高性能数值模拟软件中心,北京 100088; 2.北京应用物理与计算数学研究所,北京 100094;3.中国工程物理研究院计算机应用研究所,四川,绵阳 621900;4.四川中锐信息技术有限公司,四川,成都 610041)

0 引言

数值模拟软件指面向复杂系统的工程设计、生产制造、实验验证、效能评估等重要环节,研发和运行数值模拟软件解决其中重要科学和工程问题。这类软件依赖于更加精确的物理建模,同时需验证计算程序是否正确地表示了物理模型,因此对置信度的要求比普通应用软件更高。

近年来,数值模拟软件应用范围不断扩充,为满足复杂并行数值模拟软件的快速研发需求,其研制过程逐渐表现出如下特征:① 高性能计算共性技术发展基于共性平台研发的模式日益普及,使得软件架构趋于组件化,软件测试的复杂度随之增加;② 敏捷研发模式普及,组件版本快速更新、频繁交付,测试用例不断增多,交付时间急剧减少,对软件测试效率提出了更高的要求。

回归测试是软件开发中一种成熟的实践,近年来随着敏捷方法普及,PARSONS等[1]强调了回归测试在维护软件质量方面的核心作用。但在传统测试过程中,基于组件的软件测试存在以下问题:① 组件之间依赖关系复杂,需要人工控制测试顺序,风险高且测试效率低;② 不同组件由不同团队串行发布,单组件单次回归测试一般在1.5~2 h,整个测试过程需多个开发/测试团队协同工作,测试链路长,人力、沟通成本高;③ 软件测试过程需人工记录、汇总分析,对人力消耗高,过程难以回溯。因此,面向组件化研发需求,如何保证软件产品质量、提高回归测试效率的研究具有非常重要的意义。

本文结合高性能数值模拟软件评测过程中的实际需求,设计与实现了一种基于依赖性分析的回归测试工具。

1 应用需求及国内外现状

面向组件化软件[2]研制过程中的质量保证需求,基于依赖分析的回归测试工具的需求特征如下。

(1) 组件依赖关系管理。为避免人工控制测试顺序引入的风险,支持自动解析组件复杂的逻辑关系,生成直观、可靠的依赖关系图,便于用户快速掌握组件变更的影响范围。

(2) 并行回归测试。支持批量组件的自动化回归测试需求,有效编排测试任务,以提升测试任务并行度与测试效率。

(3) 测试报告自动生成。支持层次化测试报表生成,全面记录构建日志与测试结果,便于研发人员定位问题,同时保证测试过程可回溯。

基于以上需求,对组件依赖分析及回归测试的国内外研究现状进行了调研:STAFFORD等[3]对组件系统的体系结构和接口进行了依赖分析,基于体系结构描述语言对组件间接口和行为关系进行描述,提出了体系结构层次的依赖分析方法;VIEIRA等[4]给出了一种CBDM组件依赖模型,用于生成组件间依赖关系图,描述组件集成到新应用环境时可能对其他组件产生的影响,以便后续集成测试的实施;AMALARETHINAM等[5]提出了基于矩阵的方法来分析组件系统中的依赖关系,通过引入一组基于组件的度量,分析软件组件依赖与交互相关问题。从以上研究可以看出,由于组件系统类型不同,对组件管理方式、应用场景有所差别,因此,需结合具体需求与应用情况,为组件依赖选取适用的管理方法。

在回归测试方面:解凯[6]对构建系统回归测试模型与技术进行了研究,提出了一种基于事件机制的构建模型,实现了回归多Agent框架;刘倩[7]开展了COM组件系统依赖分析方法和回归测试研究,提出了依赖动态分析方法,实现了动态分析COM组件间依赖关系功能;王晓琳等[8]面向敏捷研发需求提出了敏捷测试用例优先排序和敏捷回归测试选择方法;陈树峰等[9]针对面向对象软件中类之间的复杂依赖问题,提出了基于UML类图的依赖分析模型及测试路径查找算法,利用此算法得到需测试的类集和测试序列;SAJEEV等[10]基于组件回归测试的 UML 模型,使用 UML 和对象约束语言根据版本信息实现了指定回归测试用例的选择;傅鹤岗等[11]提出了一种描述组件系统的层次依赖模型,通过对修改点向前切片,得到修改所影响部分,然后遍历得到所影响的测试路径,实现了测试算例的有效选择。以上研究工作多局限于特定编程语言或应用场景,不具备通用性,其实现多依赖于额外的信息输入,如内置元数据信息、设计文档等。而数值模拟组件研发所使用的编程语言(包含C、C++、Fortran等)较为广泛,不同组件的测试需求有所差别,以上方法无法直接应用于数值模拟软件测试场景,但为本文工具的设计提供了重要的参考价值。

2 基于依赖分析的回归测试框架

面向组件变更评估与批量组件验证测试需求,设计了基于依赖分析的回归测试框架(图1),将测试过程分为变更组件依赖分析、批量测试任务调度、回归测试任务执行、多维度测试报告生成4部分。变更组件依赖分析基于组件依赖树分析变更组件可能引起的变更范围,确定受变更影响、需重新测试的组件范围,形成待测组件列表,以降低回归测试成本。批量测试任务调度对批量组件间的依赖关系进行分析,确定任务执行顺序,保证测试链路正确可行。回归测试任务执行是将各上层组件提供的测试算例集,与基准结果进行比对,验证变更后组件的正确性。待批量组件回归测试完成后,面向测试过程与测试结果,自动生成多维度测试报告。

图1 基于依赖分析的回归测试框架

整个过程涉及3个关键问题,下面将分别阐述。

(1) 针对多组件多版本复杂依赖关系的管理需求,如何获取并准确地表示依赖关系,使依赖拓扑可视可感知?

(2) 针对不同数值模拟组件的差异性测试需求,如何满足各类组件定制化测试需求,提升回归测试的自动化程度?

(3) 面向各关联组件批量测试场景,如何自动控制测试任务的先后顺序,保证测试逻辑正确性?

2.1 层次化组件依赖拓扑表示方法

要有效管理复杂的组件依赖关系,满足不同组件版本依赖的差异性需求,适应研发过程中组件依赖变更,实现组件之间依赖拓扑的可视可感知,关键要提供一种组件依赖关系描述与解析方法。具体如下。

(1) 单一组件建立依赖描述文件,保证依赖可变可维护。每个组件维护一份依赖描述文件,用于描述组件编译/运行时的依赖关系(见图2),对组件E来说,其编译时依赖于组件A~D,但运行时依赖于组件B~D。需要注意的是,当组件B、D同时依赖于C时,需按照版本管理规则,查找组件C可用版本,避免版本冲突。

(a) 组件依赖示例

通过解析依赖描述文件,基于正则表达式的版本匹配规则,分析处理其依赖组件信息,完成组件的编译打包。基于这种方法,明确单一组件的依赖组件名称及版本要求,保证组件具备可维护性。

(2) 解析形成依赖索引文件,标识运行环境信息。对于高性能数值模拟组件来说,其应用需求、运行环境不同,依赖描述也会存在一定差别。因此,需按照不同的编译/运行环境及依赖管理规则,对依赖描述文件进行解析,形成依赖关系索引文件。该文件汇总了多环境多组件依赖关系,为依赖关系查询提供统一入口,保证依赖关系的准确获取。

(3) 依赖关系树标准化,实现依赖拓扑可视。基于各依赖关系索引文件,按照组件管理与版本比较规则,查询、解析变更组件名称及版本号,实现变更组件的影响分析,形成标准化依赖关系树。该文件对依赖关系的表示形式进行了标准化,明确了关联组件的节点信息、有向边关联关系。基于可视化图表库对标准化文件进行界面渲染,支持变更组件依赖关系树的自动生成,实现组件依赖拓扑可视化。

2.2 基于模板的自动化回归测试机制

要满足各类数值模拟组件的不同测试需求,关键是提供一套合理的自动化回归测试机制。考虑到依赖分析的回归测试过程经常会涉及多个组件的测试,为避免不同组件之间测试过程的相互干扰,将每个组件通过一个独立测试任务来管理。但对于不同组件源码目录、测试算例目录及安装目录结构并不统一,其运行时依赖环境不尽相同,因此要面向不同组件的评测需求实现任务定制化。

(1) 集成通用组件测试方法,形成测试模板。通过分析组件测试过程,以质量评测方法和指标为依据,实现了通用测试流程(包含测试环境、代码检出、静态审查、回归测试、覆盖率检测等),集成结果可视化方法,形成了共性测试模板。该模板将测试方法与业务解耦,以快速适应组件与环境变化。

(2) 松耦合管理产品特征与测试模板,自动创建测试任务。通过参数化形式集中管理产品个性化特征,包括仓库路径、版本号、测试算例等信息。基于持续集成模板,创建并触发组件测试任务[12],将个性化组件信息填入自动化测试脚本,以快速适应各组件间差异,满足不同组件的定制化需求。

2.3 基于偏序的关联任务调度算法

基于依赖分析的回归测试通常涉及多个组件,组件之间依赖关系复杂,要实现关联任务先后顺序的自动编排,关键要实现一种有效的测试任务调度算法。

假设待测试的若干测试任务相互关联,本文所采用的偏序算法[13]以一组测试任务(v1,v2,…,vn)为输入,以一组按照执行顺序排列的任务序列为输出,算法原理如下。

(1) 建立起点任务vs和终点任务ve,基于依赖关系树搜索vs的紧后任务,若不存在则退出。将找到的测试任务建立vs→vi关系,分别设置这些任务的度为Di=1。

(2) 将查找到的测试任务作为起始任务,依次查找其紧后任务:

① 若本次所有的紧后任务都为ve,跳转到(3);

② 逐个计算vi,vi+ 1,…紧后网络作业vj,vj+ 1,…的度Dj=Di+ 1,Dj+ 1=Di+ 1+ 1,…如果新计算的度小于计算前的度,不保存此结果; 建立关系vi→vj;

③ 排列本次搜索到的所有紧后任务;

④ 将此次得到的任务作为起始任务,重新执行(2)。

(3) 按照执行序号将测试任务重新排队编号,执行序号越小编号越小,度相等则随机编号,编号完成后退出。

以图3中的测试任务依赖关系为例,该算法通过计算组件测试任务的度,可输出顺序测试列表。

图3 测试任务依赖关系示例图

此外,考虑到实际测试规模与资源,在偏序算法基础上增加了并行测试节点数量限制。将优化偏序算法应用于关联测试任务调度,一方面,可快速识别关联测试任务的先后顺序,实现任务自动编排,保证测试逻辑的正确性;另一方面,支持多任务同时触发,实现无关任务的并行执行,提高测试效率。

3 模块设计

基于依赖分析的回归测试工具架构如图4所示。工具以变更组件信息为输入,通过依赖分析、测试任务调度与执行、测试状态监控、测试报告生成等过程,最终输出层次化回归测试报表。

图4 基于依赖分析的回归测试工具架构图

测试工具采用“界面层—业务层—数据层”分离技术,界面层(前端)采用Vue.js技术,专注于页面的样式与动态数据的解析和渲染,业务层(后端)实现采用Java语言及SpringBoot框架,专注于业务逻辑,前后端通过约定的交互接口实现同步开发[14]。整体采用高内聚低耦合的研发模式,以降低后期代码维护成本。

(1) 业务层

业务层的实现逻辑如图5所示,主要包括依赖分析、测试任务管理、任务调度和测试报告生成模块。

图5 基于依赖分析的回归测试工具业务逻辑图

依赖分析模块实现依赖关系读取与解析,以变更组件名称、版本信息为输入,以影响组件信息为输出。测试任务管理模块实现任务创建、状态监控与更新、任务清理等功能,以任务实时状态为输出。任务调度模块实现优化后偏序算法,以排序后的任务列表为输出。测试报告生成模块实现测试任务数据解析、统计与分析,以层次化测试报告为输出。

(2) 界面层

界面层展现了变更软件依赖关系查询、影响组件选取、测试任务配置、测试监控、测试结果报表等主要功能界面,通过调用前后端交互接口实现了数据渲染与显示。

(3) 数据层

数据层使用MySQL 数据库存储业务数据,设计与实现50 余张数据表和视图,包括组件信息表、依赖关系表、测试任务状态表等。组件信息表用于存储组件信息,测试任务表用于存储测试任务信息,以任务编号、组件编号作为外键与其他数据表相关联。

4 应用效果

基于依赖分析的回归测试工具已应用于Linux 系统环境下高性能数值模拟组件的变更评估工作中,完成了20余款组件的依赖分析测试。该工具支持依赖关系自动化解析,用户只需明确变更产品名称及版本号,即可自动解析、展示相应的依赖关系树(见图6),实现依赖拓扑的可视可感知。通过选取待测软件、配置参数化信息(见图7),即可一键式提交测试任务,按照依赖关系自动编排关联组件测试任务的先后顺序,极大地减少了人工成本,提升了任务并行度与测试效率。

图6 依赖关系解析界面

图7 测试信息配置界面

基于依赖分析的回归测试工具提供了多维度测试报告自动生成及全面的测试日志反馈机制,不仅实时收集任务执行状态,形成测试过程报告,而且提供层次化评测结果报告,含整体测试结果与单组件测试结果。图8 是回归测试任务进度监控界面,该界面实时地反馈了各组件测试任务的执行状态,并且通过图形化标识为测试整体进度提供了直观反馈。图9 是单组件测试结果,包含测试环境、静态审查结果、回归测试结果、覆盖率检测结果等信息。对于执行失败的任务,直接反馈错误日志,帮助研发人员快速定位问题。

图8 回归测试任务进度监控界面

经多次测试分析发现,与人工相比,其测试效率随组件数量增多呈增长趋势,组件规模在5个以上时,回归测试效率提升达2.1倍以上。

5 总结

本文面向高性能数值模拟组件的变更评估需求,设计与实现了基于依赖分析的回归测试工具,支持自动解析组件之间复杂的逻辑关系,实现了组件变更的影响范围快速评估;支持多组件批量回归测试需求,实现了任务顺序的自动编排,大幅提高组件化任务并行度与测试效率;提供多维度回归测试报表,实时反馈组件依赖关系、整体执行情况及单组件详细测试报告,帮助用户快速定位缺陷,保证测试数据可回溯。

该工具目前已支撑二十余款高性能数值模拟软件的依赖分析测试,有效降低了回归测试复杂度。但处理大规模问题时需要较长处理时间,下一步计划深入开展性能调优工作,持续提升用户体验。

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!