嵌入式软件单元自动化测试工具的研究
2021-10-08王斌赵连杰王宏愿
王斌 赵连杰 王宏愿
摘要:随着软件的广泛应用,在追求满足越来越复杂的逻辑功能的同时也在追求高安全、高可靠的软件。传统的软件单元测试,测试工作量巨大,需要耗费大量的人力、物力,发现缺陷的严重等级与数量与测试投入不成正比。故本文,研究并设计嵌入式软件单元的自动化测试工具,解决源码解析、静态分析、控制流分析的自动化执行与测试,并进行缺陷追溯与信息统计,形成软件单元测试的闭环。
最后针对此工具进行外部接口的开发,可实现与Jenkins等主流工具的持续集成,真正实现源代码上传即可触发软件单元测试的自动化流程。
关键词:嵌入式;自动化;单元测试;jenkins
1研究背景
本研究主要是基于当前轨道交通装备技术的高速发展,软件发展的规模不断增大,软件迭代研发周期要求越来越短,测试压力越来越大;软件单元测试在软件测试周期中的所占用的测试时间,测试人员,拥有非常大的比重;几乎每个项目的软件单元测试的测试需求一致,导致产生大量的重复性工作量,严重延长项目的研发生产周期。故基于现状进行深化研究,计划开发嵌入式软件单元自动化测试工具,以实现自源代码上传之后可以自动化执行软件单元测试的愿景。
2核心技术设计方案
2.1软件单元自动化测试工具架构设计
此软件单元自动化测试工具的架构设计如图1架构设计图所示
2.2源码解析
此工具首先解析用户上传的源码库、编译依赖库。在仿真环境下,将源代码和编译依赖进行打包,统一进行编译链接。若编译失败,则需要不断补充编译依赖库,使得源码本身对编译环境依赖的头文件等都导入到系统中。这样,源码可不依赖于原有的编译器和编译环境,可实现直接可在工具内编译执行。
2.3静态分析
此工具对源码进行解析后,先对待测单元进行度量分析。从三个方向进行度量分析,分别:圈复杂度分析、注释率分析、扇入扇出分析。首先对待测单元进行控制流的分析,通过控制流图的程序流程进行圈复杂度的分析及统计。其次对待测单元的总行数、代码行数、注释行数进行统计,并计算注释率。最后对待测单元的调用情况进行数据统计,计算统计出待測单元的扇入扇出数。
工具设计需具备高效易用的编码规则检查功能模块,集成了包括MISRA C/C++2012、GJB8114等规则集中的重要规则,同时支持自定义规则集导入。源代码进入规则集检查器,规则集检查器运行每条规则的算法,对代码进行遍历检查。通过的代码,进行代码递增和规则递增;未通过的规则进行缺陷统计和定位。
2.4控制流测试
控制流测试用例自动生成。本工具设计通过符号执行技术对函数路径的遍历,让机器理解代码。用户将目标程序提供给系统编译器前端,在编译解析产生中间文件后,符号执行工具对中间代码进行符号执行,即对目标程序路径空间进行逐路径探索,从而自动化地对应生成较高覆盖率的测试用例集。
符号执行以符号值作为程序的输入,符号化地执行程序,程序的输出也为变量的表达式。使用约束求解器来判定程序的路径是否可行。符号执行技术能够遍历程序的路径空间,检查程序是否满足特定的性质。
2.5功能测试
进行自动化的控制流测试之后,仅能验证每个软件单的语句、分支、修正的条件组合覆盖,无法验证每个软件单元的功能。故开发功能测试模块,解析罗列出每个软件单元的全局输入变量,并对调用的软件单元进行打桩。用户通过图形化的界面,结合软件详细设计规范中,每个软件单元的功能逻辑,对每个软件单元的全局输入变量进行赋值,对桩单元进行返回值设置。
2.6缺陷追溯
工具在高覆盖率分析函数路径的同时,还具备能实现程序中缺陷的精准查找,结合系统自动化生成测试框架的能力,工具在测试过程中发现的缺陷,是在特定的参数条件下,根据函数路径执行求解中确定。所以,所有的缺陷都需要能够准确定位到代码具体位置,并展示该缺陷发生的具体条件。
2.7信息统计
工具对软件测试信息进行信息统计,提供统计信息界面和项目看板界面。统计信息界面用数字和图形方式展示当前用户全部测试工程统计信息,包括工程数量、总函数数量、总代码量、测试用例数量、已分析/未分析函数数量、工程类型分布、各工程函数平均覆盖率以及不同类型工程中函数覆盖率分布。
2.8持续集成
当前软件行业的测试多趋向于自动化、智能化。在此工具中,对关键的功能点进行了后端调用接口的开发,实现了通过命令行的形式进行自动化调用。分别实现源码解析、静态分析、控制流测试、数据导出的脚本驱动操作。通过与jenkins进行插件式集成,实现了源码上传即可触发自动拉取代码,传输至工具,触发测试的机制。
3总结
随着功能日益强大的嵌入式系统不断发展并投入广泛应用,如何保证软件质量成为了工程技术人员必须要解决的难题。软件单元测试是嵌入式软件开发过程中早期进行软件功能验证,可靠性确认的重要手段,对后续阶段软件测试与保证软件质量具有重要意义。
本文针对嵌入式软件单元测试,设计了一款源码解析、静态分析、控制流测试的自动化执行工具必将在提升嵌入式软件质量方面发挥愈加重要的作用。