摘要:本文围绕LIBRO技术的主要步骤进行介绍。

本文分享自华为云社区《【LLM for SE】顶会ICSE-2023发布LIBRO技术,利用大模型技术进行缺陷重现,自动重现率(33%)实现业界突破》,作者: 华为云软件分析Lab 。

随着大模型(Large Language Model, LLM)技术的发展,LLM在许多软件工程任务上表现出良好的效果,比如代码生成、搜索、对话等任务。近期,许多研究工作结合LLM技术和软件分析技术来解决软件工程领域的问题。软件工程顶级会议ICSE2023文章《Large Language Models are Few-shot Testers: Exploring LLM-based General Bug Reproduction》(来自韩国科学技术院大学的Shin Yoo团队)发布了LIBRO技术,是首个面向通用缺陷的自动重现工作。该技术有效利用大模型技术提升了缺陷重现技术的有效性,实现业界突破。实验结果表明,在主流数据集Defects4J中,LIBRO技术可根据缺陷报告自动生成测试用例并重现出251个缺陷(共750个缺陷),自动重现率达33%。LIBRO借助LLM技术在NLP领域的突出进展,在SE领域中的缺陷重现问题中实现重大突破。利用LLM的技术优势来提升SE领域的技术能力有望成为行业趋势,吸引越来越多的研究者和业界从业人员。

论文链接详见:https://arxiv.org/abs/2209.11515

以下围绕LIBRO技术的主要步骤进行介绍。如图1所示,LIBRO框架主要包括四个步骤,分别是:(A) 提示工程、(B) LLM查询、(C) 后处理、(D) 选择&排序。

步骤A(提示工程):在LLM技术中,如何构造有效的提示进行查询是一个关键问题。LIBRO基于缺陷报告构建提示信息,利用的信息包括缺陷报告的标题和描述信息。此外,LIBRO还在提示信息中加入测试用例实例引导大模型生成测试用例。下图给出了一个缺陷报告的实例和对应的提示信息。

步骤B (LLM查询):将之前构造的提示信息输入大模型,大模型将输出一个测试用例生成的结果。具体来说,LIBRO使用的大模型是基于GPT-3的CodeX模型。LIBRO构造的提示信息末尾是“public void test”,这会引导大模型生成一段测试用例代码。此外,LIBRO通过加权随机采样(weighted random sampling)来提升大模型查询效果,并生成多个测试用例作为备选测试用例。下图是基于之前例子里的提示信息生成的一段测试用例代码。

步骤C (后处理):LIBRO对大模型生成的测试用例的后处理指将测试用例函数放入对应测试类中,并解决执行该测试用例所需的依赖。具体来说,LIBRO首先根据测试类与测试用例函数的文本相似度来计算测试类和测试函数的映射关系。该策略在业界主流数据集中能够成功匹配89%的测试类与测试函数的关系,是一种有效的匹配策略。为了解决测试用例函数的依赖问题,LIBRO首先解析生成的测试用例函数,并识别变量类型以及引用的类名/构造函数/异常。然后,LIBRO通过在测试类中与现有import语句进行词法匹配,并过滤掉已经导入的类名。

步骤D (选择&排序):一个能够重现缺陷的测试用例指当且仅当测试用例因为缺陷报告中说明的缺陷而执行失败。换而言之,LIBRO生成能够重现缺陷的必要条件是:该测试用例在被测程序的错误版本中编译成功但是执行失败。该研究工作将这类测试用例称为FIB(Fail In the Buggy program)。LIBRO对大模型生成的若干测试用例进行选择和排序,从而优先推荐质量更高的生成结果。

LIBRO的选择和排序算法主要包括三种启发式策略:(1)如果测试用例执行失败信息和/或显示了在缺陷报告中提到的行为(比如异常或输出值),那么该测试用例可能是重现缺陷的测试用例。(2)LIBRO根据选择测试用例的集合大小来观察大模型生成的测试用例之间的一致性。直觉上,如果大模型生成大量相似的测试用例,那么说明大模型认为这类测试用例具有更高的可信度。即,这类测试用例是大模型达成的共识。(3)LIBRO根据测试用例的长度来决定它们的优先级,原因是短的测试用例更便于用户理解。

缺陷重现实例介绍:

以下是一个LIBRO重现AssertJ-Core项目中编号为2666的缺陷报告的真实案例介绍。如下截图Table VIII是实际缺陷报告,如下截图Listing 4是利用LIBRO生成的测试用例。缺陷报告中提到在特定条件下比较i和I会失败。LIBRO根据缺陷报告的描述自动生成了能够重现该缺陷的测试用例。

文章来自:PaaS技术创新Lab;PaaS技术创新Lab隶属于华为云,致力于综合利用软件分析、数据挖掘、机器学习等技术,为软件研发人员提供下一代智能研发工具服务的核心引擎和智慧大脑。我们将聚焦软件工程领域硬核能力,不断构筑研发利器,持续交付高价值商业特性!加入我们,一起开创研发新“境界”!

PaaS技术创新Lab主页链接:https://www.huaweicloud.com/lab/paas/home.html

点击关注,第一时间了解华为云新鲜技术~

顶会ICSE-2023发布LIBRO技术,利用大模型技术进行缺陷重现,自动重现率达33%的更多相关文章

  1. 利用大数据技术处理海量GPS数据

    我秀中国物联网地图服务平台目前接入的监控车辆近百万辆,每天采集GPS数据7亿多条,产生日志文件70GB,使用传统的数据处理方式非常耗时. 比如,仅仅对GPS做一些简单的统计分析,程序就需要几个小时才能 ...

  2. 【学习笔记】大数据技术原理与应用(MOOC视频、厦门大学林子雨)

    1 大数据概述 大数据特性:4v volume velocity variety value 即大量化.快速化.多样化.价值密度低 数据量大:大数据摩尔定律 快速化:从数据的生成到消耗,时间窗口小,可 ...

  3. 大数据技术人年度盛事! BDTC 2016将于12月8-10日在京举行

    2016年12月8日-10日,由中国计算机学会(CCF)主办,CCF大数据专家委员会承办,中国科学院计算技术研究所和CSDN共同协办的2016中国大数据技术大会(Big Data Technology ...

  4. 跟我一起学WCF(2)——利用.NET Remoting技术开发分布式应用

    一.引言 上一篇博文分享了消息队列(MSMQ)技术来实现分布式应用,在这篇博文继续分享下.NET平台下另一种分布式技术——.NET Remoting. 二..NET Remoting 介绍 2.1 . ...

  5. TOP100summit:【分享实录-WalmartLabs】利用开源大数据技术构建WMX广告效益分析平台

    本篇文章内容来自2016年TOP100summitWalmartLabs实验室广告平台首席工程师.架构师粟迪夫的案例分享. 编辑:Cynthia 粟迪夫:WalmartLabs实验室广告平台首席工程师 ...

  6. 利用Spring.Net技术打造可切换的分布式缓存读写类

    利用Spring.Net技术打造可切换的Memcached分布式缓存读写类 Memcached是一个高性能的分布式内存对象缓存系统,因为工作在内存,读写速率比数据库高的不是一般的多,和Radis一样具 ...

  7. 利用过采样技术提高ADC测量微弱信号时的分辨率

    1. 引言 随着科学技术的发展,人们对宏观和微观世界逐步了解,越来越多领域(物理学.化学.天文学.军事雷达.地震学.生物医学等)的微弱信号需要被检测,例如:弱磁.弱光.微震动.小位移.心电.脑电等[1 ...

  8. 利用JSP编程技术实现一个简单的购物车程序

    实验二   JSP编程 一.实验目的1. 掌握JSP指令的使用方法:2. 掌握JSP动作的使用方法:3. 掌握JSP内置对象的使用方法:4. 掌握JavaBean的编程技术及使用方法:5. 掌握JSP ...

  9. 利用apache伪静态技术防止盗链

    (在我们制作网站的过程中,可能会遇到这样的问题,就是其他的网站直接盗用了我们网站的图片或css或js,这样可能会大大增加我们自己网站的负载. 所以,我们应该考虑一下怎样防止这样的事情发生.) 下面我们 ...

  10. 利用内存锁定技术防止CE修改

    利用内存锁定技术防止CE修改 通过这种在R3环利用的技术,我们可以来达到保护内存的目的,像VirtualProtect等函数来修改页属性根本无法修改. 而CE修改器推测应该使用VirtualProte ...

随机推荐

  1. 基于Quartz.Net通过反射进行任务调度

    通过反射加载任务调度 需求: 因为有些任务需要进行各种定时操作,因此将 Quartz.Net 简单封装了一下使用: 希望通过上传 dll 来进行每个任务的调度,所以写了个反射调度示例: Program ...

  2. Static详细讲解

    Static详细讲解 package com.andy.base.oop.demo01.demo07; import sun.dc.path.PathError; public class Perso ...

  3. 重构SeleniumeDownloader底层浏览器驱动

    一.解决bug:Selenium with PhantomJS,重构SeleniumeDownloader底层浏览器驱动 0.小背景: 想爬取外网steam的数据,但是steam官网在海外,加上ste ...

  4. Javaweb学习笔记第六弹

    本章节的存在意义是:学到PreparedStatement反应较慢,理解不透彻,来做个比较,加深印象 详细讲述PrepareStatement 与 Statement 连接数据库的部分区别 在我学习的 ...

  5. 快速构造Python爬虫请求,有这个网站就够了!

    引言 大家好,我是蜡笔小曦. 我们在通过程序向某个网页发起请求时,实际上是模拟浏览器进行http(超文本传输协议)请求,这就要求我们需要按照固定的格式进行代码构造. 一般请求数据分为三部分:请求行.请 ...

  6. 001-ksum 求符合条件的 k 个数 1. Two Sum/15. 3Sum/18. 4Sum/

    推荐阅读 000-从零开始的数据结构与算法 001-01-ksum 求符合条件的 k 个数 1. Two Sum/15. 3Sum/18. 4Sum/ 002-两数相加 add two numbers ...

  7. 【随笔】Axios delete传递数组问题

    pre { overflow-y: auto; max-height: 300px } img { max-width: 500px; max-height: 300px } Axios delete ...

  8. Prometheus服务发现之kubernetes_sd_config

    一.为什么要使用Prometheus服务发现 之前我们讲过通过配置prometheus-operator的CRD ServiceMonitor来达到K8S集群相关组件和微服务的监控的目的,可以在Ser ...

  9. Linux 大文件按大小切割,合并还原

                    工作中,由于堡垒机限制,大文件无法上传,故产生切割大文件上传后合并还原的需求. 不说废话,直接上干货: 切割: 1.1G文件,切割为200M大小的几个文件: split ...

  10. 从头开始,手写android应用框架(一)

    前言 搭建android项目框架前,我们需要先定义要框架的结构,因为android框架本身的结构就很复杂,如果一开始没定义好结构,那么后续的使用就会事倍功半. 结构如下: com.kiba.frame ...