基于LLM的单元测试生成,你在第几级?

C

L1 玩玩的

选定一个被测方法(focal method),将方法体的源码传给大模型,要求生成单元测试用例。这是不少所谓的可以赋能开发单测的大模型的方案。在某些厂商的demo中,求解一个Hello级别的用例生成还是OK的,一旦换到实际项目,就只能呵呵了。

L2 一锤子买卖

但凡想认真一点,写过几个单测用例,就会知道被测方法会对外部类/二方包中的方法有依赖,而不仅仅依赖JDK/三方包。因此,在使用LLM进行单测生成时,除了提供被测方法(focal method)的代码之外,还需要提供了被测类(focal class)的签名、变量、依赖等额外的关键信息,让LLM能更好地理解代码和生成测试用例。但是即使是这样,目前来说Pass@1的成功率还是一般。通常论文中提到的成功率也就是40-50%左右,而且是基于开源项目。公司的实际项目要更加复杂(也可能是某些专家说的代码质量更差一些),导致LLM一次生成的效果更差。

L3基于G-V-R 生成-验证-修复模型的多轮对话

于是,如何提高LLM生成用例的通过率就是研究的方向。

生成、验证、修复,通过多轮对话来提高生成成功率。(浙大、复旦论文)

以下是浙大论文【1】给出的方案总览。

在这里插入图片描述

这一套方案比之前一锤子买卖的优势在哪里呢?来看一下浙大论文中给出的效果示例。

在这里插入图片描述

从上图可以看出,大致上,基于开源的代码库,论文团队的方案生成的测试用例,“一条过”的大概是16000个,而经过了一轮修复才通过的用例大致有8000个,而3-6轮修复后通过的用例累计在7000个左右。也就是说,通过G-V-R这样的一条龙,比单纯的“一锤子买卖”大约新增了1倍的通过用例。

当然,从笔者的实践来看,大模型的生成能力,也就是第一轮生成环节产生的用例的质量是具有决定性的。这也很好理解,先天不足的话,后天再补,也是补不上来的。

L4 G-V-R-S 生成-验证-修复-筛选模型

在G-V-R模型的基础上,通过覆盖率指标来遴选测试用例(Meta、南大论文)

在这里插入图片描述

在Meta发表的一篇论文【2】中,在原先只选择编译通过且执行通过的单测用例的基础上,叠加了”Improves coverage”这个环节,对于被测方法(focal method)来说,大模型生成的用例只有增加了覆盖率(代码行、分支等),才会被保留下来。

论文中给出了如下的桑基图,

在这里插入图片描述

在57%的测试用例可以执行通过的基础上,只有大约一半的用例,也就是总数的25%可以增加测试覆盖率,因而被作为有效用例可以被保留下来作为新增用例。

类似的,南大团队也发表了一篇文章【3】,也提出了类似的套路,他们叫做Testing Feedback,也是利用覆盖率数据来判断新生成的用例是否可以保留。

在这里插入图片描述

当然,这篇文章主要的创新点还是在于测试用例的修复环节,提出了几个非常有意思的失败用例的修复方式。感兴趣的读者可以拉到文章的底部来查看这个论文。

L5 天下武功,唯快不破

上面的论文中普遍采用了多轮对话的方式和LLM进行交互。目前来讲,随着模型尺寸越来越大,对话窗口size越开越大,LLM返回的内容越多,整个对话过程的耗时也越长。方案中的测试用例编译、执行、覆盖率分析等也需要时间。即使单个环节的耗时一般,整体叠加起来也是非常惊人的。

而笔者在推广过程中发现,其实在IDE的场景中“LLM生成单测用例”其实是一个时间敏感型的任务,开发人员点一下“生成用例”之后,如果几十秒、一分钟以上还没有生成用例,开发人员就开始焦躁起来了。而且如果还占用了IDE资源,造成了卡顿,就会被开发人员吐槽。

因此,如何解决耗时问题就成了后续需要解决的问题。

目前来讲,还没有完美的解决方案。主要的着力点还是在提升第一个环节,也就是首次生成单测用例的时候,能否尽可能通过各种套路(参考上图浙大方案【1】)提供LLM理解被测代码和生成测试用例所需的各种信息和数据。通过一次生成通过率来减少后续轮次,以减少整体的耗时。另外一个思路是,不再等待开发人员在IDE中点击“生成用例”才触发这个流程,而是通过预生成等套路,既然解决不了问题,就消灭问题本身。

  【推荐自动化测试教程】:

【软件测试教程】从零开始学自动化测试(2024实用版)自动化测试2024最全面教程!!!_哔哩哔哩_bilibili

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

<think> 我们正在讨论单元测试生成的大模型算法。根据引用内容,特别是引用[1]提到大语言模型(LLMs)已被应用于单元测试生成,引用[3]提到AutoGenTestCase通过集成DeepSeek和通义千问等AI大模型实现测试用例的自动化生成,引用[4]则提到利用LangChain与大模型自动化生成测试用例。因此,我们可以总结出单元测试生成的大模型算法通常是指利用现有的大语言模型(如DeepSeek、通义千问等)来自动生成测试用例的方法。 根据这些引用,我们可以将单元测试生成的大模型算法归纳为以下几个关键点: 1. **模型选择**:使用现有的大语言模型,如DeepSeek、通义千问等。 2. **框架集成**:通过自动化框架(如AutoGenTestCase)或LangChain等工具将大模型集成到测试生成流程中。 3. **输入处理**:通常输入是被测代码或需求文档,然后通过大模型生成测试用例。 4. **挑战与优化**:引用[4]提到在处理大量内容时可能遇到token限制和超时问题,因此需要优化,比如通过文本切割和向量搜索等方式分批次处理。 因此,我们可以这样回答用户:单元测试生成的大模型算法主要是利用大语言模型(如DeepSeek、通义千问等),通过自动化框架(如AutoGenTestCase或基于LangChain的自研框架)来生成测试用例。具体过程包括:将代码或需求文档作为输入,通过大模型生成测试用例代码,并处理可能出现的token限制等问题。 同时,我们也可以生成相关问题,以帮助用户进一步了解该主题。 注意:回答中需要引用引用[1]、[3]、[4]的内容,并在引用处添加引用标识。 </think>### 单元测试生成的大模型算法分析 基于您提供的引用资料,单元测试生成的大模型算法主要通过以下核心技术实现: #### 1. **大语言模型核心架构** - 采用Transformer架构的LLM(如DeepSeek、通义千问)作为基础引擎 - 输入:源代码/需求文档 → 输出:符合规范的测试用例 - 关键技术公式: $$ P(test|code) = \prod_{t=1}^T P(w_t | w_{<t}, code) $$ 其中$w_t$表示测试用例中的第$t$个token #### 2. **分层生成机制(引用[1][3][4])** ```mermaid graph TD A[原始代码] --> B(向量嵌入层) C[需求文档] --> B B --> D[Attention机制分析] D --> E{测试点生成} E --> F[单元测试模板] F --> G[具体断言生成] ``` - **特征提取**:通过嵌入层将代码语义向量化 - **测试点抽象**:识别边界条件、异常路径等关键测试要素 - **模板填充**:结合项目规范生成具体测试代码 #### 3. **优化关键技术(引用[4])** - **文本切割技术**:解决大模型token限制问题 $$ \text{chunk}(D) = \{seg_i | \sum_{w \in seg_i} \text{len}(w) \leq \tau\} $$ 其中$\tau$为token窗口阈值 - **向量搜索加速**:通过FAISS等工具实现需求文档的快速检索 - **提示工程优化**:固化高质量提示模板提升生成准确率 #### 4. **质量评估指标(引用[1][5])** 1. 代码覆盖率:$ \text{Coverage} = \frac{\text{覆盖分支数}}{\text{总分支数}} $ 2. 熵值检测:$ H(X) = -\sum p(x)\log p(x) $ 用于评估测试噪声 3. 缺陷检出率:实测缺陷/潜在缺陷比 > 典型应用案:AutoGenTestCase系统通过集成多个大模型API,实现5分钟内完成测试生成,比人工效率提升10倍以上[^3][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值