在软件开发的生命周期中,自动生成单元测试成为提高代码质量和开发效率的关键技术。
原标题:AI 驱动的智能化单元测试生成:字节跳动的实践与创新
文章来源:AI前线
内容字数:19947字
字节跳动基于LLM的单元测试用例自动生成实践
本文总结了字节跳动质量效能专家赵亮在QCon全球软件开发大会上关于基于大模型自动生成单元测试的演讲要点,该实践旨在解决单元测试编写耗时、维护困难以及现有工具效果不足等问题,提升代码质量和研发效率。
1. 现状与痛点
许多研发人员面临单元测试覆盖率低的问题,并非出于主观意愿,而是由于时间限制和精力不足。编写单元测试的时间成本高(5-15分钟/个),业务上线时间紧迫,导致存量代码单元测试缺失严重(部分仓库覆盖率低于10%)。现有工具生成的单元测试可读性低、用例多样性不稳定、编译通过率低,增加了研发人员的修正成本。
2. 目标与挑战
该实践的目标是提高单元测试生成产品的工程化分析准确性、模型生成效果(引入偏好对齐和强化学习等算法)、提升用户体验(开箱即用,轻量化)。 目标包括覆盖率、有效性(断言、mock和流量)、仓库覆盖率以及研发投入产出比。主要挑战在于数据质量(模型训练数据、提示词、数据准确性)和代码生成效果(代码风格、业务语义匹配)。
3. 数据质量提升
为了提升数据质量,采用了基于流量来源的收集和采纳(真实流量、接口自动化、测试技术服务)、流量蒸馏(数据分析、路径推导、脱敏处理)以及流量分发(存量生成、IDE、MR流水线)等方法。通过这些方法,显著提升了用例的可信度、用户的采纳率和问题的发现率。
4. 等价类提升思想
为了提升测试覆盖率,采用了等价类设计等方法,并结合模型和工程方法解决路径覆盖问题。通过对被测函数进行要素分析、逻辑分析和路径分析(利用AST和IR技术),为模型生成不同路径的单元测试提供详细信息。
5. 模型与程序分析的融合
该实践融合了模型和程序分析的优势。工程化方法保证了代码分析的准确性和稳定性,模型则提供了灵活性和泛化能力。模型生成和修复需要特定的条件数据(路径数据、函数签名、依赖结构体定义、错误信息等)。
6. 代码生成效果提升
通过模型泛化效果提升、模型提示词选择策划、无流量单测方法以及模型效果生成评价等手段,持续优化模型的代码生成能力。模型工程整体架构包含数据环节(数据收集、训练评估)、模型选用(结合思维链)、模型评测及优化(人工和机器评测相结合)等步骤。
7. 数据工程建设
数据工程建设注重数据集的可信度和纯净度,包含样本打标、样本筛选、隐私过滤、格式处理、数据简化和数据配比打乱等环节。通过代码简化(抽取关键数据,业务语义字段转译,统一不同编程语言的print函数),提升了模型训练效率和效果。
8. PE工程及模型微调
PE工程路径规划涵盖代码理解、路径识别、入参理解、mock规划等,通过路径提升、参数补全、语法修正和断言修正等步骤,持续优化模型。目前主要处于模型微调阶段,未来计划结合微调和奖励模型。
9. 评测工程建设及效果
评测工程建设包含人工评估和五个评测指标(编译通过率、覆盖率、断言成功率、运行通过率、路径提升效果)。目前仓库级平均覆盖率达到40%(部分达60%),单个方法覆盖率达83.09%。
10. 总结与规划
该实践已完成基础层(能力分析、数据构建)、生成层(单元测试框架生成、路径提升)、修正层(语法、运行、断言修正)以及统计&应用层的工作。未来的规划包括模型持续优化、用例召回分析、用例保鲜机制以及产品多元化。
联系作者
文章来源:AI前线
作者微信:
作者简介:面向AI爱好者、开发者和科学家,提供大模型最新资讯、AI技术分享干货、一线业界实践案例,助你全面拥抱AIGC。