System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind() 一种基于程序上下文的断言生成方法技术_技高网
当前位置: 首页 > 专利查询>南京大学专利>正文

一种基于程序上下文的断言生成方法技术

技术编号:42750097 阅读:2 留言:0更新日期:2024-09-18 13:40
本发明专利技术提供一种基于程序上下文的断言生成方法,包括以下步骤:1)构建用例格式为<测试函数‑被测函数,语法序列>的数据集,并按照8∶1∶1的比例将数据集划分为训练集,验证集和测试集;2)构建神经机器翻译模型并用上述的训练集对其进行训练;3)从GitHub中提取开源项目,并对数据集进行定位;4)从项目中提取上下文信息,用上下文信息限制神经机器翻译模型的词表,限制模型生成语法正确的模型;5)用提取到的上下文信息进一步生成UNK;6)从预测准确率和通过编译的比例两个方面衡量本发明专利技术的效果。本发明专利技术解决了目前自动化测试工具生成断言质量低的问题,并且生成了能够通过编译的断言。提升了自动化测试工具检测缺陷的能力。进一步缩短了软件项目的开发时间。

【技术实现步骤摘要】

本专利技术属于计算机,尤其是软件分析测试领域。本专利技术提供了一种面向java语言的、基于程序上下文的断言生成方法,用于生成高质量能编译的断言语句。


技术介绍

1、软件测试是软件生命周期的重要组成部分。研究表明开发人员需要消耗近一半的时间来测试编写的代码,因此自动化测试长时间以来被研究人员关注。在自动化测试中,单元测试主要用于验证代码组件(例如函数,类等)的正确性,与其他等级的测试相比,单元测试能够更加快速的检测代码的缺陷。单元测试的测试用例包括两个部分,测试输入和测试断言,测试断言用于判断测试输入能否按照预期运行。当前常用的测试用例自动生成工具包括java的自动化测试用例生成工具evosuite和randoop,python的自动化工具pynguin等,这些工具更加关注于高的代码覆盖率而忽视了断言的质量。根据almasi等人的研究,这些工具生成的断言只能检测defects4j数据集中40.6%的缺陷。除了断言质量不高外,这些方法还需要动态检测被测程序,有着较高的运行时间成本。

2、目前,已有一些研究利用不同的方法进行自动化断言生成。例如,yu等人利用了信息检索技术,以及watson等人基于深度学习技术进行断言生成,但是他们是通过把测试和被测函数输入到模型中进行断言生成。也就是说,他们将断言生成问题简单当作文本生成问题来处理,没有应用到上下文的依赖信息。因此,这两种方法生成的断言语句不能编译运行,只能供开发人员参考。在这样的背景下,我们提出了一个自动化的实证分析的框架,旨在分析哪些因素影响了python调用图的构造效果,并将评判的标准主要聚焦于召回率。一方面通过对python语言中调用发生的模式进行详尽的分类,把工具的局限性归因到具体的语言特性或使用模式;另一方面,我们以开源项目作为测试的数据,通过语法分析和动态插桩实现对项目中调用的标注,并以动态运行时抽取的动态调用图作为依据,比较分析调用图工具的效果。

3、在这样的背景下,我们提出了一种基于程序上下文的断言生成方法,旨在用神经机器翻译模型生成能编译的断言语句。一方面通过tranx模型的方法,先生成抽象语法树的构造序列再生成断言语句,这样的作法保证了断言的语法正确性;另一方面通过spoon工具提取断言的上下文信息,通过限制翻译模型的解码器的解码生成能编译的断言。


技术实现思路

1、本专利技术提出了以下的断言生成方法,用以生成能编译的断言语句。本专利技术由以下几个模块组成:

2、●数据集构建:该模块负责对断言语句的语法分析,将其转化为语法序列;

3、●模型构建与训练:该模块负责构建神经机器翻译模型并用数据集进行训练;

4、●数据集定位模块:该模块会到开源项目集合中寻找断言所对应的位置;

5、●断言生成模块:该模块负责在神经机器翻译模型测试过程的解码阶段提取正在生成的断言的上下文,并依照上下文信息对词表进行限制。

6、●unk生成模块:该模块旨在找出神经机器翻译模型生成的unk,并用上下文信息对其进行生成。

7、接下来具体介绍各个模块的运行步骤:

8、首先,数据集构建模块的具体步骤如下:

9、步骤1):起始状态;

10、步骤2):选取atlas工具提供的数据集作为研究对象,数据集用例的格式为<测试函数-被测函数,断言语句>;

11、步骤3):提取atlas数据集中的断言语句,用python的javalang包将其转化为抽象语法树;

12、步骤4):先序遍历抽象语法树,得到抽象语法树的生成序列;

13、步骤5):将atlas提供的测试函数,被测函数与抽象语法树的生成序列结合,构建用例格式为<测试函数-被测函数,语法序列>的数据集;

14、步骤6):按照8∶1∶1的比例将数据集划分为训练集,验证集和测试集;

15、步骤7):数据集构建完毕。

16、其中,模型构建与训练模块的具体步骤如下:

17、步骤1):起始状态;

18、步骤2):从训练集的测试函数-被测函数序列中选取出现频率最高的1000个词作为输入的词表,从训练集的语法规则序列中选取出现频率最高的1000个词作为模型输出的词表;

19、步骤3):用一个双向的lstm作为模型的编码器,用于将输入文本转化为中间向量表示;

20、步骤4):同样用一个双向的lstm作为模型的解码器,用于将中将向量表示转化为文本序列输出。将父节点的信息编码进行解码器,用于限制模型;

21、步骤5):用训练集对模型训练300000轮,耗时约40h;

22、步骤6):模型构建且训练完毕。

23、接着,数据集定位模块的具体步骤如下:

24、步骤1):起始状态;

25、步骤2):从github中提取并克隆项目;

26、步骤3):分析项目的pom文件,查看是否有junit的依赖,过滤掉不包括junit依赖的项目;

27、步骤4):用spoon工具提取所有的测试函数,删除掉注释部分;

28、步骤5):按照文本完全一致的规则,根据每条用例的测试函数和北侧函数寻找其所属的项目;

29、步骤6):数据集定位完毕。

30、进一步,断言生成模块的具体步骤如下:

31、步骤1):起始状态;

32、步骤2):根据已生成的语法序列得知当前正在生成的词的类型;

33、步骤3):用spoon工具从项目中提取对应类型的上下文集合;

34、步骤4):根据词的类型对应的启发式规则对词表进行过滤,不同类型及其对应的启发式规则如下:

35、●常量值value:符合类型检查;

36、●引用类型referencetype:符合类型检查,符合先定义后引用,符合是否存在子类型

37、●变量引用memberreference:符合类型检查,符合先定义后使用

38、●二元操作符binaryoperator:左操作数类型符合

39、●java基本类型basictype:符合类型检查

40、●函数名methodname:返回值符合类型检查,参数序列符合,符合先定义后使用

41、●前缀名prefix:符合先定义后使用

42、步骤5):选取过滤后的词表中预测概率最高的词作为当前的生成结果;

43、步骤6):用模型生成语法序列之后,对其进行规约构建抽象语法树,同时构建断言语句;

44、步骤7):断言生成完毕。

45、接着,unk生成模块的具体步骤如下:

46、步骤1):遍历生成的断言语句中的unk;

47、步骤2):选取其中的一个unk作为生成对象;

48、步骤3):根据生成的抽象语法树得到unk的父节点,并由此可知unk的类型;

本文档来自技高网...

【技术保护点】

1.一种基于程序上下文的断言生成方法,其特征在于,包括数据集构建模块、模型构建与训练模块、数据集定位模块、断言生成模块、UNK生成模块以及效果分析模块;其中数据集构建模块以开源项目作为数据集提取对象,为方法提供数据;模型构建与训练模块构建了神经机器翻译模型,对数据集进行训练;数据集定位模块找出断言语句所属的项目位置;断言生成模块动态提取上下文信息,用以限制神经机器翻译模型生成断言;UNK生成模块提取上下文信息,从中选取符合编译规则的词作为UNK生成结果;效果分析模块分析生成的断言质量;

2.根据权利要求1所述的基于程序上下文的断言生成方法,其特征是,所述数据集构建模块的具体步骤包括:选取ATLAS提供的数据集作为研究对象,用基于Python的javalang包将断言语句转化为抽象语法树;先序遍历抽象语法树,得到抽象语法树的语法序列;随后构建格式为<测试函数-被测函数,语法序列>的数据集;最后将这一数据集按照8∶1∶1的比例划分为训练集,验证集以及测试集;

3.根据权利要求1所述的基于程序上下文的断言生成方法,其特征是,所述模型构建与训练模块的具体步骤包括:构建词表,从模型的输入和输出序列中分别选取出现频率最高的1000个词作为模型的词表;用一个LSTM作为模型的编码器;同样用一个LSTM作为模型的解码器,并将父节点的信息编码进解码器;最后用训练集对模型训练300000轮,耗时约40h;

4.根据权利要求1所述的基于程序上下文的断言生成方法,其特征是,所述数据集定位模块的具体步骤包括:从GitHub中提取项目;分析项目的pom文件,查看是否有junit的依赖,过滤掉不包括junit依赖的项目;用Spoon工具提取所有的测试函数,删除掉注释部分;按照文本完全一致的规则寻找数据集中每条用例的所属项目;

5.根据权利要求1所述的基于上下文的断言生成方法,其特征是,所述断言生成模块的具体步骤包括:在神经机器翻译模型的解码阶段动态提取断言的上下文信息用于限制词表,以此来生成符合上下文的词;根据模型生成的语法序列构建抽象语法树,生成断言语句;

6.根据权利要求1所述的基于上下文的断言生成方法,其特征是,所述UNK生成模块的具体步骤包括:按照模型生成的断言语句构建其抽象语法树;遍历生成的断言语句的UNK对于每个UNK执行下一步操作;根据抽象语法树中UNK的父节点得到UNK的类型,并取对应类型的上下文的词与词表的差集作为该UNK的解的取值范围;将多个UNK的取值范围结合成为该条带有UNK断言的解空间;按照先前为每种类型的词定义的启发式规则,深度遍历解空间求得该断言语句所有UNK的解;

7.根据权利要求1所述的基于上下文的断言生成方法,其特征是,所述效果分析模块的具体步骤包括:选取预测准确率作为整个测试集的评估度量,统计文本完全一致的比例;从测试集种随机抽取一部分,手动验证其是否可以编译运行,并统计能够编译的比例。

...

【技术特征摘要】

1.一种基于程序上下文的断言生成方法,其特征在于,包括数据集构建模块、模型构建与训练模块、数据集定位模块、断言生成模块、unk生成模块以及效果分析模块;其中数据集构建模块以开源项目作为数据集提取对象,为方法提供数据;模型构建与训练模块构建了神经机器翻译模型,对数据集进行训练;数据集定位模块找出断言语句所属的项目位置;断言生成模块动态提取上下文信息,用以限制神经机器翻译模型生成断言;unk生成模块提取上下文信息,从中选取符合编译规则的词作为unk生成结果;效果分析模块分析生成的断言质量;

2.根据权利要求1所述的基于程序上下文的断言生成方法,其特征是,所述数据集构建模块的具体步骤包括:选取atlas提供的数据集作为研究对象,用基于python的javalang包将断言语句转化为抽象语法树;先序遍历抽象语法树,得到抽象语法树的语法序列;随后构建格式为<测试函数-被测函数,语法序列>的数据集;最后将这一数据集按照8∶1∶1的比例划分为训练集,验证集以及测试集;

3.根据权利要求1所述的基于程序上下文的断言生成方法,其特征是,所述模型构建与训练模块的具体步骤包括:构建词表,从模型的输入和输出序列中分别选取出现频率最高的1000个词作为模型的词表;用一个lstm作为模型的编码器;同样用一个lstm作为模型的解码器,并将父节点的信息编码进解码器;最后用训练集对模型训练300000轮,耗时约40h;

4.根据...

【专利技术属性】
技术研发人员:陈林杨帆
申请(专利权)人:南京大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1