【论文速读】|FuzzAug:探索模糊测试作为神经网络测试生成的数据增强

图片

本次分享论文:FuzzAug: Exploring Fuzzing as Data Augmentation for Neural Test Generation

基本信息

原文作者:Yifeng He, Jicheng Wang, Yuyang Rong, Hao Chen

作者单位:University of California, Davis

关键词:软件测试,数据增强,模糊测试,大语言模型,单元测试,测试生成

原文链接:https://arxiv.org/pdf/2406.08665

开源代码:暂未提供

论文要点

论文简介:在现代软件工程中,测试是确保程序可靠性的关键。然而,测试过程既重要又昂贵,促使自动化测试用例生成方法的兴起。传统的基于覆盖率的模糊测试和基于神经网络的测试生成各有优缺点。本文提出了一种名为FuzzAug的新型数据增强技术,结合模糊测试和大语言模型的优势,生成语法和语义上有效的多样化测试数据。实验结果表明,使用FuzzAug增强的数据集训练的模型,测试用例准确率提高了11%,分支覆盖率也显著提升。

图片

研究目的:本文旨在解决软件工程中单元测试不足的问题。单元测试是确保软件组件满足设计规范的重要手段,但编写高质量单元测试既困难又耗时。为了提高自动化测试生成的有效性和多样性,本文提出了FuzzAug技术,结合模糊测试和大语言模型,自动生成语义丰富且语法正确的测试数据。通过在现有数据集上应用FuzzAug,期望改善模型的测试生成性能,提升软件测试的覆盖率和准确性,从而助力开发人员更高效地进行软件验证。

研究贡献:

1. 提出了一种新颖的数据增强方法FuzzAug,专为神经测试生成模型设计。该数据增强方法解决了代码库中测试代码不足和被测函数精确且多样化输入缺乏的问题。据悉,FuzzAug是第一个用于神经测试生成的数据增强方法。

2. 构建并发布了一个新的Rust函数数据集,包含功能级别的代码-测试对,用于训练Rust程序的测试生成模型。在该数据集上应用了FuzzAug并发布了生成的增强数据集。

3. 通过在数据集上训练自回归语言模型验证了FuzzAug的质量。添加FuzzAug后,模型性能的提升展示了在训练语料库中添加模糊测试增强测试函数的必要性和好处。

引言

在软件工程中,测试是确保大型软件应用程序质量和稳定的重要过程。单元测试是开发人员编写和执行的自我评估测试,旨在证明软件中的组件符合设计规范中的要求。然而,尽管测试的重要性,开发人员并不总是贡献新的测试,因为很难确定要测试的代码,将其隔离为单元,以及找到相关的输入。自动化单元测试生成是解决这些问题的方法,通过将所有函数视为被测单元(焦点函数),但生成的测试在可读性和相关输入输出对的正确性方面并不令人满意。

最近,利用机器学习模型特别是大语言模型(LLMs)的强大功能来缓解这些问题的研究逐渐兴起。尽管LLMs可以生成有意义的程序,但由于训练数据中单元测试数量和多样性不足,其在生成高质量测试方面的能力受到限制。本文提出了FuzzAug,一种结合模糊测试和LLMs优势的新颖数据增强技术,以改善单元测试生成的数量和多样性,从而提升软件测试的自动化水平。

FUZZAUG设计

FuzzAug旨在通过模糊测试增强神经测试生成模型的数据集。该方法通过随机生成有效输入来提高训练数据的多样性和覆盖率。首先,模糊测试生成具有程序行为特征的随机输入,确保数据在软件测试上下文中的有效性和意义。其次,通过代码转换,将模糊测试的目标转换为语法和语义正确的单元测试模板。这些模板在执行过程中通过模糊器验证其语法正确性,并保持测试函数的语义完整性。最终,FuzzAug生成的单元测试数据不仅丰富了训练集,还增强了模型处理多样化测试场景的能力,从而提高自动化测试生成的效果和覆盖率。

图片

实验设置

数据收集:选择Rust语言进行研究,因为Rust项目结构化良好,便于构建和运行。从GitHub上收集了249个符合要求的Rust开源项目,确保这些项目活跃且包含单元测试和模糊测试目标。通过这些项目,收集了12452个函数调用和6481个单元测试对。为了增强数据,使用LLVM的libFuzzer工具对每个模糊测试目标进行模糊测试,生成了20504个增强后的测试对,最终构建了一个包含64579个测试对的综合数据集。

图片

模型训练:选用了SantaCoder作为基础模型,这是一个最先进的开源代码生成模型,具有1.1B参数。训练过程中,采用因果语言建模(CLM)技术,对焦点函数和单元测试函数的组合进行训练。训练过程设置最大序列长度为2048,批量大小为16,学习率为5e-5,使用Adam优化器。首先用基础数据集训练模型,随后用增强后的数据集进行继续训练,确保模型能够充分学习到模糊测试增强带来的数据多样性和复杂性。

研究问题:本研究主要围绕以下两个问题展开:

1. FuzzAug是否能够提高生成测试用例的准确性?通过评估生成测试用例的正确性和编译率来验证这一点。

2. FuzzAug是否能够提高生成单元测试的实用性?通过评估生成的单元测试函数的分支覆盖率和通过率来验证这一点。此外,还考察了FuzzAug对不同模型的泛化能力,评估其在其他代码生成模型中的效果。

评估设置

HumanEval-X被选择作为评估基准,这是一套手工制作的多语言代码生成基准,包含164个不同的问题。根据每个问题的描述提示模型生成相应的单元测试函数。为了确保评估的公平性,所有实验中使用相同的提示方法和基本的后处理步骤,仅对生成的测试函数进行必要的语法修正。记录了生成测试用例的准确性、编译率、通过率和分支覆盖率,综合评估FuzzAug对测试生成性能的提升。

研究结果

实验结果显示,FuzzAug显著提升了生成测试用例的准确性和单元测试的实用性。与基线模型相比,使用FuzzAug训练的模型在测试用例准确率上提高了11%。此外,FuzzCoder在生成的单元测试函数中达到了更高的分支覆盖率,是未使用FuzzAug训练模型的两倍。FuzzAug对不同的代码生成模型同样有效,在其他模型(如CodeLlama)上也表现出色,进一步验证了其泛化能力和实用性。综合来看,FuzzAug通过增强训练数据的多样性和复杂性,显著提升了自动化测试生成的性能,为提高软件测试的覆盖率和准确性提供了有效的方法。

研究讨论

FuzzAug显著提升了神经测试生成模型的性能,通过引入多样化且有效的测试数据,改善了测试用例的准确性和单元测试的覆盖率。尽管如此,FuzzAug的实现依赖于预定义的模糊测试目标,这可能限制其在某些项目中的应用。此外,在生成长输入时,模型有时会消耗所有令牌限制,导致生成的测试函数无法编译。未来的研究可以进一步优化FuzzAug的方法,减少对预定义模糊目标的依赖,并改进模型在处理长输入时的效率。总体而言,FuzzAug在提升自动化测试生成的质量和实用性方面展现了巨大的潜力。

相关工作

模糊测试和神经测试生成是自动化软件测试的两个重要领域。模糊测试通过随机生成输入,探索程序的新路径,发现潜在漏洞。AFL++和libFuzzer是其中最著名的工具。神经测试生成利用大语言模型(如SantaCoder和CodeLlama)生成语义丰富的测试用例。此前的研究如UniTSyn和CAT-LM,通过收集和对齐代码和测试对,改进了测试生成模型的性能。然而,现有方法在处理测试数据不足和多样性方面仍存在局限性。FuzzAug结合了模糊测试和语言模型的优势,提出了一种新颖的数据增强方法,显著提升了测试生成的效果。

论文结论

本文提出的FuzzAug方法,通过结合模糊测试和大语言模型,有效解决了测试数据不足和多样性缺乏的问题。实验结果表明,使用FuzzAug增强的数据集训练的模型在测试用例准确性和单元测试覆盖率方面显著优于基线模型。FuzzAug不仅提高了神经测试生成的性能,还展示了良好的泛化能力,适用于不同的代码生成模型。未来的研究可以进一步优化此方法,扩大其应用范围。总体而言,FuzzAug为自动化软件测试生成提供了一种高效且实用的解决方案,具有重要的应用价值。

原作者:论文解读智能体

校对:小椰风

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/771084.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Dungeonborne联机失败、延迟高、卡顿的解决方法

Dungeonborne将第一人称动作的即时性与经典的西幻RPG职业设计巧妙融合,为玩家带来了一场前所未有的游戏体验。在这款沉浸式第一人称PvPvE地下城探险游戏中,我们可以独自深入探索,也可以与值得信赖的伙伴并肩作战,共同揭开地下城的…

汽车电子工程师入门系列——AUTOSAR通信服务框架(下)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

使用微信开发者工具连接gitee

编写代码 打开微信开发者工具 编写小程序代码 提交代码 在微信开发者工具提交代码到gitee仓库的步骤: 1.在gitee创建仓库,得到仓库url 2.微信开发者工具设置远程仓库 点击版本管理-->点击设置-->网络和认证-->认证方式选择 使用用户名和…

【重磅】“一招”解决智能算法中不满足“预期”的问题【以微电网优化调度为例】

1主要内容 之前完整复现了微电网优化调度的模型,具体链接为:【完全复现】基于改进粒子群算法的微电网多目标优化调度,这是一个并不复杂的模型,甚至不借助智能算法,我们也能大致分析出电网、柴油发电机、微型燃气轮机等…

英国皇家物理学会(IOP)数据库简介及个人获取IOP文献的方法

一、英国皇家物理学会(IOP)简介 英国皇家物理学会(IOP)成立于1873年,IOP现有科技期刊75种,具有较高的科研水平,还与多个世界知名的学协会合作出版,包括:中国物理学会、欧洲物理学会、德国物理学会、日本应用物理学会、欧洲光学学会、国际计量…

论文学习笔记1:Federated Graph Neural Networks: Overview, Techniques, and Challenges

文章目录 一、introduction二、FedGNN术语与分类2.1主要分类法2.2辅助分类法 三、GNN-ASSISTED FL3.1Centralized FedGNNs3.2Decentralized FedGNNs 四、FL-ASSISTED GNNS4.1horizontal FedGNNs4.1.1Clients Without Missing Edges4.1.1.1Non-i.i.d. problem4.1.1.2Graph embed…

小白福音:teamOS系统,一键部署企业网盘,实现在线预览功能

在传统的办公模式中,当我们需要查看一份文件时,往往需要下载、打开、编辑等一系列繁琐的步骤,如果是PDF、CAD、Markdown等特殊格式,还需要安装各种软件才能打开。 但最近get到了一个好用的东西,如果同事发来的文件格式…

轮廓检测(python和c++实现)

利用轮廓检测,我们可以检测物体的边界,并在图像中轻松定位。这通常是许多有趣应用的第一步,如图像前景提取、简单图像分割、检测和识别。 无人看管物体检测:公共场所的任何无人看管物体一般都被视为可疑物体。一种有效而安全的解…

一文搞懂MySsql的Buffer Pool

Buffer Pool是什么 Buffer Pool是MySQL数据库中一个非常关键的组件。数据库中的数据最终都是存放在磁盘文件上的。但是在对数据库执行增删改查操作时,不可能直接更新磁盘上的数据。因为如果直接对磁盘进行随机读写操作,那速度是相当的慢的。随便一个大磁…

联系表单提交后,自动发送邮件的实现方法?

联系表单自动邮件回执功能怎么样?如何设置邮件回执? 联系表单是用户与网站所有者沟通的重要渠道。为了提升用户体验,许多网站会在联系表单提交后自动发送确认邮件给用户。AokSend将探讨如何实现这一功能,介绍不同的方法和步骤&am…

如何在 Selenium Python 中解决验证码 | 2024 完整指南

由于在进行网络自动化时遇到验证码是让许多人感到不知所措的问题。这些验证码专为区分人类用户和自动化脚本而设计,对于使用Selenium进行网络爬虫或自动化任务而言,无疑是一个巨大的挑战。2024年的完全指南将为您提供全面的解决方案,帮助您高…

LabVIEW新能源汽车电池性能测试系统

新能源汽车的核心部件之一是电池,其性能直接关系到整车的续航里程、安全性和寿命。为了确保电池的性能和可靠性,测试是必不可少的环节。本文介绍了一种基于LabVIEW的新能源汽车电池性能测试系统,通过LabVIEW与数据采集设备的无缝集成&#xf…

【Spring Boot 源码学习】初识 ConfigurableEnvironment

《Spring Boot 源码学习系列》 初识 ConfigurableEnvironment 一、引言二、主要内容2.1 Environment2.1.1 配置文件(profiles)2.1.2 属性(properties) 2.2 ConfigurablePropertyResolver2.2.1 属性类型转换配置2.2.2 占位符配置2.…

docker容器技术、k8s的原理和常见命令、用k8s部署应用步骤

容器技术 容器借鉴了集装箱的概念,集装箱解决了什么问题呢?无论形状各异的货物,都可以装入集装箱,集装箱与集装箱之间不会互相影响。由于集装箱是标准化的,就可以把集装箱整齐摆放起来,装在一艘大船把他们…

C++基础(五):类和对象(上)

从今天开始,我们正式进入面向对象编程,这是C与C语言的重要区别,编程思想发生变化,那到底什么是面向对象编程呢?接下来,我们慢慢的深入学习。 目录 一、面向过程和面向对象初步认识 1.1 面向过程 1.2 面…

【Python】变量与基本数据类型

个人主页:【😊个人主页】 系列专栏:【❤️Python】 文章目录 前言变量声明变量变量的命名规则 变量赋值多个变量赋值 标准数据类型变量的使用方式存储和访问数据:参与逻辑运算和数学运算在函数间传递数据构建复杂的数据结构 NameE…

腾讯混元文生图开源模型推出小显存版本,6G显存即可运行,并开源caption模型

7月4日,腾讯混元文生图大模型(混元DiT)宣布开源小显存版本,仅需6G显存即可运行,对使用个人电脑本地部署的开发者十分友好,该版本与LoRA、ControlNet等插件,都已适配至Diffusers库;并…

达梦数据库 页大小与数据库字段长度的关系

对于达梦数据库实例而言,页大小 (page_size)、簇大小 (extent_size)、大小写敏感 (case_sensitive)、字符集 (charset) 这四个参数,一旦确定无法修改;如果过程中发现这些数据设置的不对,只能是重新新建数据库实例,而不…

脑启发设计:人工智能的进化之路

编者按:你可以用左手(不常用的那只手)的小指与食指拿起一件物品么? 试完你是不是发现自己竟然可以毫不费力地用自己不常用的手中,两根使用频率相对较低的手指,做一个不常做的动作。这就是人类大脑不可思议…

14-5 小语言模型SLM 百科全书

想象一下这样一个世界:智能助手不再驻留在云端,而是驻留在你的手机上,无缝理解你的需求并以闪电般的速度做出响应。这不是科幻小说;这是小型语言模型 (SLM) 的前景,这是一个快速发展的领域,有可能改变我们与…