在软件开发过程中,单元测试是确保代码质量的关键环节。通过单元测试,开发人员能够验证每个函数单元是否按预期执行。然而,编写高质量的单元测试用例并非易事。开发人员往往需要投入大量时间和精力手动编写测试用例,以确保代码的各个逻辑路径都得到充分测试。特别是在面对复杂的代码结构时,编写全面、有效的测试用例更是充满挑战。如果测试用例编写不完整,可能会导致代码中的隐藏问题未被及时发现,影响软件的整体质量和稳定性。因此,如何高效的生成高质量的单元测试用例,成为了当前单元测试过程中的一大痛点。
目前,各行业均对单元测试提出了合规性要求,例如:
01 汽车行业:在汽车行业规范ISO-26262中,对软件开发过程中的安全要求进行了描述,涉及对单元测试的环境、目标、覆盖率、测试用例等层面。
02 商业航空:在商业航空业规范DO-178C中,对机载系统和设备要求软件工程“过程保证的方法”来保证软件安全性,软件测试应当满足低级需求,不应出现逻辑错误。该要求可通过单元测试来实现。
03 金融行业:在证券期货业软件测试规范JR/T0175—2019中,明确提出对单元测试的覆盖率要求。
为了满足各个行业对单元测试的需求,解决单元测试用例编写的困难,现有的解决方案主要分为基于框架的手动编写用例和基于工具的自动化用例生成。手动编写一般基于gTest、Boost等框架来编写测试用例,编写灵活但存在效率低下且容易遗漏重要测试场景的问题。通过自动化工具来生成用例,可以在一定程度上减轻开发人员的负担,但这些工具以追求代码高覆盖为目标,依托于代码解析和符号执行等技术,生成的用例普遍存在代码可读性差、断言质量差、支持的编程语言单一等问题。
近几年,大语言模型的发展迅速,模型的应用范围也从自然语言处理的各项任务扩展到了代码补全、用例生成等代码领域,极大的提高了生产力工具的智能化水平。在最初,GPT-3模型已经能够生成较为自然的文本,但在理解复杂指令和生成高质量代码方面仍有不足。随着时间的推移,更多的研究机构和公司加入了大语言模型的开发行列,推出了如Codex、LaMDA、Chinchilla等新模型,进一步提高了模型在特定领域的表现。
大语言模型发展历程及其重要里程碑
图片来源 中国人民大学赵鑫教授团队
基于大语言模型的单元测试用例生成方案
安般科技以当代智能模糊测试技术和程序分析技术为核心、以软件全流程负面测试为研发方向,是国际首批、国内首家从事商业化智能模糊测试技术的科技公司。作为软件负面测试行业的领跑者,针对C/C++程序的单元测试场景推出了易测单元智能模糊测试系统,采用先进的测试驱动生成和模糊引擎技术,有效提升代码覆盖率,并挖掘潜在的缺陷及漏洞。
针对单元测试用例生成的技术架构由函数分析引擎、大模型生成、验证与优化三个关键模块组成。
技术架构示意图
函数分析引擎模块负责对目标工程进行预处理,提取函数依赖关系,为后续生成单元测试用例奠定基础。大模型模块通过提示词调优和自动化生成,结合代码上下文信息,确保生成的测试用例全面覆盖代码的主要功能和逻辑结构。验证与优化模块则通过编译和运行生成的测试用例进行验证,自动修复错误并优化提示词,确保测试用例的高效性和全面性。
易测单元模糊测试系统——面对不同场景的单元测试能力
易测单元智能模糊测试系统主要功能
01 gTest用例自动生成与转化:利用大模型自动生成gTest格式的单元测试用例,并自动转化为模糊测试驱动,大幅节省人力成本,提升项目开发效率。
02 代码缺陷检测:针对单元测试场景进行智能模糊测试,实现函数级的缺陷挖掘和代码行级的缺陷定位。
03 覆盖率展示与管理:支持展示函数覆盖率、行覆盖率详情,支持查看套件和用例层级的覆盖率提升效果。
04 缺陷管理和修复:支持对缺陷类型、位置及原因进行定位,并支持对缺陷进行复现,提供修复方案建议,辅助对缺陷进行修复。
05 测试结果管理:支持导出测试报告、下载触发缺陷代码的用例集信息。
易测单元智能模糊测试系统产品特点
01 充分的代码覆盖:自研面向单元测试的智能模糊测试引擎技术,有效提升低频函数的模糊概率,进行更充分的负面测试。
02 强大的缺陷检测能力:支持C/C++内存泄露、缓冲区溢出等5大类30多小类的缺陷检测,有效保障代码质量。
03 自动化的测试流程:通过自动生成gTest用例并转化成模糊测试驱动,并支持一键执行测试,自动生成测试报告,实现测试流程的自动化。
04 更高的测试效率:强大的并发能力,可实现全负荷并行测试,将测试时间从“天”缩减为“小时”级别。
未来展望
随着软件开发的不断发展和软件工程复杂性的增加,自动化测试工具的重要性愈发凸显。基于大语言模型的单元测试用例生成可以为开发人员提供了一种高效、智能的解决方案,大幅提升了单元测试的质量和覆盖率。“没有大语言模型是不行的,只有大语言模型也是不行的”,尽管大语言模型已经展示出其强大的能力,但仍有一些复杂函数的用例无法有效生成,需要不断探索新的技术手段,或者与其它软件分析技术相结合,实现对特殊场景的处理。通过采集众长,为开发和测试人员提供更加完善的单元测试解决方案,为软件开发的高效性和质量保驾护航。