跳到内容

刚/缺陷4j

缺陷4J--版本2.0.1.github/工作流/ci.yml

Defects4J是可再现错误的集合和支持基础设施以推进软件工程研究为目标。

缺陷内容4J

项目

Defects4J包含来自以下开源项目的835个错误(加上29个弃用的错误):

标识符 项目名称 活动Bug的数量 活动错误ID 不推荐的错误ID(*)
图表 柱状图 26 1-26
克里 通用cli 39 1-5,7-40 6
关闭 闭包编译器 174 1-62,64-92,94-176 63,93
编解码器 通用编解码器 18 1-18
收藏 公共-集合 4 25-28 1-24
压缩 公共-压缩 47 1-47
Csv公司 通用csv 16 1-16
格森 格森 18 1-18
杰克逊科尔 千斤顶芯 26 1-26
杰克森数据绑定 jackson-databind 112 1-112
杰克逊克马尔 jackson-dataformat-xml 6 1-6
大杀器 J组 93 1-93
Jx路径 通用-jxpath 22 1-22
冗长的 公共语言 64 1,3-65 2
数学 公共数学 106 1-106
莫基托 莫基托 38 1-38
时间 约达时间 26 1-20,22-27 21

*由于Java8中引入的行为更改,一些错误不再可复制。因此,Defects4J区分了活动错误和不推荐使用的错误:

  • 可以通过以下方式访问活动的Bug活动bugs.csv.

  • 已从中删除弃用的Bug活动bugs.csv,但其元数据是保留在项目目录中。

  • 弃用的错误可以通过访问已弃用-bugs.csv,这也详细说明不推荐使用错误的时间和原因。

我们不会重新计算活动错误,因为发布使用了Defects4J工件通常通过特定的bug id来引用bug。

虫子

每个bug都具有以下属性:

  • 在相应的问题跟踪程序中归档的问题,以及问题跟踪程序标识符在修复提交消息中提到。
  • 在一次提交中修复。
  • 最小化:手动删除Defects4J维护人员提交中不相关的更改(例如重构或功能添加)。
  • 通过修改源代码(与配置文件相反,文档或测试文件)。
  • 存在在修复之前失败并在修复之后通过的触发测试--测试失败不是随机的,也不是依赖于测试执行顺序的。

(b)uggy和(f)ixed程序修订标记为<id>b<id>f分别为(<标识>是一个整数)。

设置缺陷4J

要求

  • Java 1.8语言
  • Git>=1.9
  • SVN>=1.8
  • Perl>=5.0.12

缺陷4J版本1.x和0.x需要Java 1.7。

Java版本

使用最新的Java 1.8版本。使用不同版本的Java可能会导致在程序版本。

时区

缺陷4J在时区内生成并执行测试美国/洛杉矶.如果您正在使用Defects4J框架之外的bug,请将TZ公司环境变量到美国/洛杉矶并将其导出。

Perl依赖项

中列出了所有必需的Perl模块cpan文件.在许多Unix平台上,默认情况下会安装这些必需的Perl模块。如果不是这样,请参阅下面的说明以了解如何安装它们。

设置缺陷的步骤4J

  1. 克隆缺陷4J:

    • git克隆https://github.com/rjust/defects4j
  2. 初始化Defects4J(下载项目存储库和外部库,出于大小目的和避免冗余,git存储库中未包含这些库):如果你没有cpanm公司安装后,使用cpan或cpan包装器安装中列出的perl模块cpan文件.

    • cd缺陷4j
    • cpanm—安装程序。
    • ./init.sh文件
  3. 将Defects4J的可执行文件添加到PATH:

    • export PATH=$PATH:“path2defects4j”/framework/bin(“path2defects4j”指向您克隆Defects4J的目录;它看起来像“/user/yourComputerUserName/desktop/defects4j”。)
  4. 检查安装:

    • defects4j信息-p Lang

在某些平台(如Windows)上,您可能需要使用perl“完整路径”\缺陷4j这些说明说明在哪里使用缺陷4j.

使用缺陷4J

命令示例

  1. 获取特定项目的信息(通用语言):

    • defects4j信息-p Lang
  2. 获取特定错误的信息(commons lang,bug 1):

    • defects4j信息-p Lang-b 1
  3. 签出一个有缺陷的源代码版本(commons lang,bug 1,bug版本):

    • 缺陷4j检出-p Lang-v 1b-w/tmp/Lang_1_buggy
  4. 切换到工作目录,编译源代码和测试,并运行测试:

    • cd/tmp/lang_1_buggy
    • defects4j编译
    • 缺陷4j试验
  5. 一些Defects4J命令将项目id作为命令行参数(可能与其他参数一起)。示例包括信息,校验,查询。请注意信息查询导出的报告信息来自Defects4J元数据,不需要访问在项目的VCS中。

    其他命令需要一个工作目录,或者显式设置(-w个命令行参数)或隐式(从工作目录)。示例包括需要访问下文件的任何命令版本控制,包括源代码和构建文件。这包括所有生成或测试代码的命令(编译,测试,新闻报道,突变)和返回版本特定信息的命令(出口).

  6. 中的脚本框架/测试/是如何使用Defects4J的示例,您可能会发现这些示例很有用当您使用Defects4J编写自己的脚本时,这是一种灵感。

命令行界面:defects4j命令

使用框架/bin/defects4j执行以下任何命令:

命令 描述
信息 查看特定项目的配置或特定bug的摘要
环境价值 打印缺陷4j执行的环境
校验 签出错误或固定项目版本
编译 编译错误或固定项目版本的源代码和开发人员编写的测试
测试 在错误或固定项目版本上运行单个测试方法或测试套件
突变 对错误或固定项目版本运行变异分析
新闻报道 在错误或固定项目版本上运行代码覆盖率分析
监视器测试 在执行单个测试或测试套件期间监视类加载器
投标 打印特定项目的活动或不推荐使用的错误ID列表
个人识别码 打印可用项目ID的列表
出口 导出特定于版本的属性,例如类路径、目录或测试列表
查询 查询元数据以生成特定项目所需信息的CSV文件

导出特定于版本的属性

使用defects4j导出-p<属性名称>[-o输出文件]在工作中导出特定于版本的属性的目录:

财产 描述
类.已修改 由错误修复程序修改的类
类别.相关 JVM在执行所有触发测试时加载的类
cp.com桩 编译和运行项目的类路径
cp.测试 编译和运行开发人员编写的测试的类路径
目录.src.class 类的源目录(相对于工作目录)
目录bin.class 类的目标目录(相对于工作目录)
目录.rc.tests 测试的源目录(相对于工作目录)
直接最小测试 测试类的目标目录(相对于工作目录)
测试.all 所有开发人员编写的测试类列表
测试。相关 相关测试类的列表(如果执行时JVM加载了至少一个修改过的类,则测试类是相关的)
tests.触发器 触发(暴露)错误的测试方法列表

导出特定于项目的元数据

使用defects4j查询-p<pid>-q<field_list>[-o<output_file>][-D|-A]生成一个CSV文件,其中包含一组针对每个bug请求的元数据在特定项目中。

默认情况下,defects4j查询返回项目的活动bug ID列表。要请求特定的元数据-q个标志应提供一个以下列表中以逗号分隔的变量列表。例如,defects4j查询-p图表-q“report.id,report.url”将提供所有活动的错误ID,以及每个错误的错误报告ID和错误报告URL。

财产 描述
错误.id 分配的错误ID(包括在所有结果中)
项目.id 分配的项目ID
项目名称 原项目名称
项目.建筑.文件 项目的Defects4J构建文件的位置
项目.vcs 项目使用的版本控制系统
项目.仓库 项目存储库的位置
项目.bugs.csv 包含该错误信息的CSV的位置
修订.id.buggy 提交每个bug的bug版本的哈希
修订.id.已修复 提交每个错误的固定版本的哈希
修订日期buggy 每个错误的错误提交日期
修订日期固定 每个错误的修复提交日期
报告.id 来自版本跟踪器的每个Bug的Bug报告ID
报告.url 来自版本跟踪器的每个错误的错误报告URL
类.已修改 由错误修复程序修改的类
类.相关.src JVM在执行所有触发测试时加载的源类
类.相关测试 JVM在执行所有触发测试时加载的测试类
相关测试 相关测试类的列表(如果执行时JVM加载了至少一个修改过的类,则测试类是相关的)
tests.触发器 触发(暴露)错误的测试方法列表,用分号分隔(;)
测试.触发.暂停 触发(公开)错误的测试方法列表,以及引发的异常。每个列表元素的格式为“methodName-->exceptionClass[:message]”,列表元素由分号分隔(;)
已弃用。版本 (仅适用于不推荐使用的错误)不推荐使用错误的Defects4J版本
已弃用。原因 (仅适用于不推荐的错误)不推荐的原因

默认情况下,defects4j查询返回有关活动Bug的信息。这个【-D】标志只返回有关不推荐使用的错误的信息,而【-A】标志返回有关所有活动和已弃用错误的信息。

要确定代码的错误版本和固定版本之间更改的方法,请执行以下操作:

  1. 将此行添加到用户级git属性文件中:*.java diff=java

  2. 运行git diff—无index例如git diff—无index/tmp/lang_1_buggy/tmp/lag_1_fixed.在输出中,以“@”开头的每一行都给出了已更改方法的方法名。

测试执行框架

生成的测试套件的测试执行框架(框架/料仓)提供了以下脚本:

脚本 描述
缺陷4j 上面描述的主脚本
生成测试(_T) 使用EvoSuite或Randoop生成测试套件
运行包检测 确定实际故障检测率
运行_更改 确定突变得分
运行平均值 确定代码覆盖率(语句和分支覆盖率)

挖掘并为Defects4J贡献更多错误

我们欢迎您对Defects4J的贡献!小便器自述文件详细介绍了错误检测过程。

其他资源

基于Defects4J构建的脚本

故障定位(FL)

自动程序修复(APR)

出版物

  • “Defects4J:现有故障数据库,支持Java程序的受控测试研究”ReneéJust、Darioush Jalali和Michael D.Ernst,ISSTA 2014年[下载].

  • “变异是软件测试中真实错误的有效替代品吗?”勒内·贾斯特、达里奥乌什·贾拉利、劳拉·伊诺泽姆采娃、迈克尔·D·恩斯特、里德·霍姆斯和戈登·弗雷泽,2014年FSE[下载].

  • “使用基于搜索的测试生成来识别Mockito中真实故障的挑战”格雷戈里·盖伊,2016年SSBSE[下载].

  • “通过基于搜索的单元测试生成检测Gson库中的实际故障”格雷戈里·盖伊,2018年SSBSE[下载].

  • “缺陷4J是基于搜索的软件工程社区的挑战案例”格雷戈里·盖伊和雷内只是,2020年SSBSE[下载].

更多出版物

实施细节

任何脚本或模块的文档可用作HTML文档.

Defects4J的目录结构如下:

缺陷4j||---project_repos:所提供项目的版本控制存储库。||---major:主要变异框架。||---框架:核心库和可执行文件、测试执行、,|和错误检测框架。||---bin:Defects4J的命令行界面。||---错误挖掘:错误挖掘框架。||---核心:核心框架的模块。||---lib:核心框架中使用的库。||---util:Defects4J使用的util脚本。||---项目:特定于项目的资源文件。||---test:测试框架的脚本。

版本控制信息

Defects4J使用语义版本方案(专业.少数的.补丁):

更改 专业 少数的 补丁
添加/删除错误 X(X)
新的/升级的内部或外部工具 X(X)
修复和文档更改 X(X)

许可证

MIT许可证,请参阅许可证.txt了解更多信息。

关于

软件工程研究中的实际故障数据库和实验基础设施

话题

资源

许可证

星星

观察者

叉子

包装

未发布包