defects4j使用说明

本文档详细介绍了Defects4j的目录结构及其核心组件,包括project_repos、major、framework等,并以Lang项目为例,解析了triggertests、modifiedclasses、loadedclasses/relevantclasses、relevanttests和patches等目录的作用。通过实例展示了如何利用Defects4j检查、修复程序bug,以及如何触发和验证测试。同时,文中还分享了如何从源码层面理解和操作Defects4j中的故障修复过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

defects4j的安装及使用说明可以参考github上 readme,这里主要说一下自己在进行defects4j使用过程中的一些心得体会,帮助之后用到的同学们理解。

目录结构

首先看一下文件结构,首先是project_repos,指提供的含有故障的项目的版本控制库,之后是major,是主要的变异框架,再framework中存在我们比较需要的各种信息,重点关注projects,里面是各种真实故障的项目。

以Lang为例,讲解一下里面的目录结构

Lang

        逻辑是这样的,对每个defects4j项目来有很多测试类,每个测试类里面有很多测试用例,如果全通过了就说明程序没有问题,但有些情况下测试可能不通过,可能只是某一两个测试方法不通过,难道要把所有的程序再重新加载,进行实验吗?西门子故障程序是那么做的,不同版本的故障程序之间只有一两行不一样,所有的测试用例也都是一样的,测试用例对在运行不同版本的故障程序时结果是不同的。这种情况在defects4j上行不通,因为西门子程序太小了,这里动辄上万行的代码,吃不消啊。

trigger tests

        于是,变成了现在这个样子,每个故障版本都对应个一个trigger test,这个trigger test里面包含了一些引发了程序bug的测试方法,如下图所示

modified classes

既然有了trigger test ,那么就必然有bug,那么文件夹modified_classes里面装的就是将bug修复时,需要改动源程序中的哪些类。

 如图,Lang项目的第一个故障版本需要改动NumberUtils类即可修复。

loaded classes/relevant classes

虽然bug只和这一个类有关,但程序是一个整体,只有这一个类跑不起来呀,想要跑起来需要很多relevant classes,在项目里是loaded_classes文件夹下,只有将这些类都加载进JVM中,trigger test方法才能跑起来。

relevant tests

既然trigger test的运行,说明了程序中存在bug,只是在trigger_test中引发了bug,其他的测试程序中可能也跑了故障代码(modified classes),但是没有引发故障,所以relevent tests里面记录的就是所有的相关测试类。所谓相关测试类就是指当执行测试方法时,JVM中加载了modified classes,这样就保证了所有相关的测试都包含在内。

patches

最后就是patches,其中src.patch记录了故障应该怎么修复,比如说,按照github的教程上执行了

defects4j checkout -p Lang -v 1b -w /tmp/lang_1_buggy

这行代码后,实际上就是在/tmp/lang_1_buggy文件夹下将这个Lang  1  版本编译,测试所需要所有类和测试类都写进去了,在src文件夹下,我们再执行

cd /tmp/lang_1_buggy
defects4j compile
defects4j test

这时候我们编译的是含有故障的代码,运行后

 它就会显示trigger test中记录的故障代号。

如果我们想要一个没有故障的版本怎么办呢,就对defects4j checkout后,/tmp/lang_1_buggy中的源码进行更改即可,按照src.patch更改源码,其中@@后是代码在NumberUtils.java中的行数,每行代码前面没有符号时,代表代码无需改动,-  代表是新加的正确代码,+ 代表是错误代码,注释掉即可。

 更改完代码后,我们再执行defexts4j test 就没有错误了。

 这种方法可以帮助我们获取无故障的源码,以及为程序中插入故障提供思路。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值