System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind() 一种基于神经机器翻译的测试用例版本自动迁移方法技术_技高网

一种基于神经机器翻译的测试用例版本自动迁移方法技术

技术编号:40948996 阅读:4 留言:0更新日期:2024-04-18 20:23
本发明专利技术属于软件测试技术领域,公开了一种基于神经机器翻译的测试用例版本自动迁移方法,首先,收集并处理协同演化历史数据集,使用匹配器在代码仓库中挖掘样本,并对其进行作筛选、抽象、正则化、令牌序列化等处理;其次,训练一个具有自我注意机制的Seq2Seq模型,用于测试用例的自动协同演化;最后,如果一个新的生产代码修改对象被输入到训练模型中,使用波束搜索来获得最有可能的k个候选预测序列。本发明专利技术方法,从项目生产‑测试协同演化的历史数据中自动学习一个模型,当开发人员在项目演进过程中改变生产代码时,可以自动生成测试用例的修改。

【技术实现步骤摘要】

本专利技术属于软件测试,尤其涉及一种基于神经机器翻译的测试用例版本自动迁移方法


技术介绍

1、软件测试被广泛应用于软件质量保证过程中。在实践中,软件开发人员经常编写测试代码来验证生产代码的行为是否符合预期。软件产品经常演变,当生产代码发生重大变化(如添加或删除功能)时,测试代码应该与相应的生产代码共同演变,以保持对软件质量的有效评估,否则,过时的测试代码可能无法有效地揭示错误或导致测试失败,这可能会混淆开发人员并浪费质量管理的资源。尽管如此,维持这种协同演化可能会耗费时间和资源。

2、然而现有的工作已经揭示了,在实践中,测试代码常常无法与生产代码协同工作。主要有以下几个原因:1)缺乏测试维护的时间和qa资源;2)不知道特定功能的测试存在;3)没有时间运行所有测试(从而阻止发现过时的测试)。

3、给定一组生产代码更改,自动生成相应的测试代码更改是一项挑战。尽管现有的工作已经研究了生产代码和测试代码之间的关联,但很少有研究明确探索测试代码的自动生成的方案。


技术实现思路

1、本专利技术目的在于提供一种基于神经机器翻译的测试用例版本自动迁移方法,以解决上述的技术问题。

2、为解决上述技术问题,本专利技术的一种基于神经机器翻译的测试用例版本自动迁移方法的具体技术方案如下:

3、一种基于神经机器翻译的测试用例版本自动迁移方法,包括如下步骤:

4、s1:matcher匹配器通过匹配生产和测试代码的更改,在代码仓库中挖掘样本;

5、s2:筛选器筛选出更改行数小于3的样本;

6、s3:正则表达式匹配无用行,除去无用行的更改;

7、s4:令牌序列化表示生产和测试代码的更改;

8、s5:使用k折交叉验证和早停法,结合控制变量法,训练seq2seq模型;

9、s6:使用波束搜索预测出最有可能的k个序列。

10、进一步的,所述s1:matcher匹配器通过匹配生产代码更改和代码仓库历史中相应的测试代码更改,在代码仓库中挖掘样本:对于仓库主分支中的每一次提交commiti,matcher都会找到所有生产代码文件的更改,matcher在每一次提交的后48小时内迭代所有提交,并根据标准目录布局收集测试代码的更改,生成一个生产代码更改的列表prod_list和测试代码更改的列表test_list,matcher然后根据java项目的生产代码文件和测试代码文件的命名约定对它们进行匹配,如果测试代码文件存在并且在更改列表中,则形成协同演化更改对changepairs=(changep,changet)并将其添加到样本集,其中changep,changet都是一个三元组(path,id,type),分别代表生产/测试代码文件的相对路径、提交的哈希id、文件的修改类型;

11、另外,协同演化更改对changepairs中只收集修改类型为ee的样本。

12、进一步的,所述s2:对所有协同演化更改对changepairs样本进行筛选,使用gitpython获取所有changepairs和与之对应的上一次提交之间的差异文件diff,同时计算差异文件更改行数,筛选出更改行数小于等于3的diff文件。

13、进一步的,所述s3:将生产代码的更改分为12种类型,它们属于两大类,分别是编程语言结构的修改和自然语言结构的修改,前者包括package-id、import-stmt、class-dec、method-sig、method-body、field、annotation的修改,后者包括copyright、javadoc、comment的修改,使用如下的正则表达式:

14、comment=re.compile(r'^[]*((\*)|(/\*)|(//)|import|package)')

15、comment_mod=re.compile(r'^[+-][]*((\*)|(/\*)|(//)|import|package)')

16、empty_row=re.compile(r'^[]*$')

17、empty_row_mod=re.compile(r'^[+-][]*$')

18、它们表示注释行、import行、package行、空行以及这些行的修改行,使用上面的正则表达式对生产和测试代码diff文件的无用行进行匹配并去除代码中的无用行及其修改,随后对处理之后的代码进行格式化的处理,将生产和测试的源代码表示成一个个的字符token,彼此之间用一个空格隔开;源代码首尾的空格需要去除,代码中间的多余空格进行删除保留一个空格即可。

19、进一步的,所述s4:基于令牌的序列化表示来描述生产和测试代码的更改,将完整的代码源文件表示成令牌级别的编辑脚本,相应地神经网络最终的输出也只输出更改后的源代码令牌,而不是整个函数,基于令牌的表示允许表示对一个函数的多次更改,并且减少了输入以及输出序列的大小,更关注代码修改处及其周围上下文,使用的一个特殊的token:<modstart>来标识一个更改,随后是n个上下文字符token(context),通过这些token来定位代码修改的位置;<modend>在替换或删除程序中的token时使用,随后跟着n个上下文字符token(context),以指定修改的完成。

20、进一步的,所述s4:定义令牌token序列以及修改处的上下文context用来描述一个函数的更改,它在多行标识多个更改位置,使用两个特殊令牌<modstart>和<modend>标识修改位置的开始和结束的上下文,上下文context的大小进行自定义,将其大小定义为10,支持增加新的令牌,删除令牌,替换令牌。

21、进一步的,所述s5:使用交叉验证法和早停法,结合控制变量法微调几种参数,训练出最优的编码器-解码器结构的具有注意力机制的seq2seq模型,编码器和解码器分别对应输入序列和输出序列的两个循环神经网络,在输入序列和输出序列后面分别附上一个特殊字符'<eos>'(end of sequence)表示序列的终止,在测试模型时,一旦输出'<eos>'就终止当前的输出序列;

22、1)编码器:编码器encoder采用单层双向循环神经网络gru。双向gru的隐藏状态输出由两个向量拼接而成:

23、

24、所有时刻的最后一层隐藏状态就构成了gru的output

25、output={h1,h2,…,ht}

26、设这是个m层gru,那么最后一个时刻所有层中的隐藏状态就构成了gru的finalhidden states

27、

28、其中

29、

30、所以

31、

32、需要的是hidden的最后一层输出(本文档来自技高网...

【技术保护点】

1.一种基于神经机器翻译的测试用例版本自动迁移方法,其特征在于,包括如下步骤:

2.根据权利要求1所述的基于神经机器翻译的测试用例版本自动迁移方法,其特征在于,所述S1:Matcher匹配器通过匹配生产代码更改和代码仓库历史中相应的测试代码更改,在代码仓库中挖掘样本:对于仓库主分支中的每一次提交Commiti,Matcher都会找到所有生产代码文件的更改,Matcher在每一次提交的后48小时内迭代所有提交,并根据标准目录布局收集测试代码的更改,生成一个生产代码更改的列表prod_list和测试代码更改的列表test_list,Matcher然后根据Java项目的生产代码文件和测试代码文件的命名约定对它们进行匹配,如果测试代码文件存在并且在更改列表中,则形成协同演化更改对ChangePairs=(changep,changet)并将其添加到样本集,其中changep,changet都是一个三元组(path,id,type),分别代表生产/测试代码文件的相对路径、提交的哈希ID、文件的修改类型;

3.根据权利要求1所述的基于神经机器翻译的测试用例版本自动迁移方法,其特征在于,所述S2:对所有协同演化更改对ChangePairs样本进行筛选,使用GitPython获取所有ChangePairs和与之对应的上一次提交之间的差异文件diff,同时计算差异文件更改行数,筛选出更改行数小于等于3的diff文件。

4.根据权利要求1所述的基于神经机器翻译的测试用例版本自动迁移方法,其特征在于,所述S3:将生产代码的更改分为12种类型,它们属于两大类,分别是编程语言结构的修改和自然语言结构的修改,前者包括package-id、import-stmt、class-dec、method-sig、method-body、field、annotation的修改,后者包括copyright、javadoc、comment的修改,使用如下的正则表达式:

5.根据权利要求1所述的基于神经机器翻译的测试用例版本自动迁移方法,其特征在于,所述S4:基于令牌的序列化表示来描述生产和测试代码的更改,将完整的代码源文件表示成令牌级别的编辑脚本,相应地神经网络最终的输出也只输出更改后的源代码令牌,而不是整个函数,基于令牌的表示允许表示对一个函数的多次更改,并且减少了输入以及输出序列的大小,更关注代码修改处及其周围上下文,使用的一个特殊的token:<ModStart>来标识一个更改,随后是n个上下文字符token(context),通过这些token来定位代码修改的位置;<ModEnd>在替换或删除程序中的token时使用,随后跟着n个上下文字符token(context),以指定修改的完成。

6.根据权利要求5所述的基于神经机器翻译的测试用例版本自动迁移方法,其特征在于,所述S4:定义令牌token序列以及修改处的上下文context用来描述一个函数的更改,它在多行标识多个更改位置,使用两个特殊令牌<ModStart>和<ModEnd>标识修改位置的开始和结束的上下文,上下文context的大小进行自定义,将其大小定义为10,支持增加新的令牌,删除令牌,替换令牌。

7.根据权利要求1所述的基于神经机器翻译的测试用例版本自动迁移方法,其特征在于,所述S5:使用交叉验证法和早停法,结合控制变量法微调几种参数,训练出最优的编码器-解码器结构的具有注意力机制的Seq2Seq模型,编码器和解码器分别对应输入序列和输出序列的两个循环神经网络,在输入序列和输出序列后面分别附上一个特殊字符'<eos>'(end of sequence)表示序列的终止,在测试模型时,一旦输出'<eos>'就终止当前的输出序列;

8.根据权利要求1所述的基于神经机器翻译的测试用例版本自动迁移方法,其特征在于,所述S6:使用波束搜索预测出最有可能的k个序列,在解码阶段的每一个step里,每次保留top K个最优序列。

...

【技术特征摘要】

1.一种基于神经机器翻译的测试用例版本自动迁移方法,其特征在于,包括如下步骤:

2.根据权利要求1所述的基于神经机器翻译的测试用例版本自动迁移方法,其特征在于,所述s1:matcher匹配器通过匹配生产代码更改和代码仓库历史中相应的测试代码更改,在代码仓库中挖掘样本:对于仓库主分支中的每一次提交commiti,matcher都会找到所有生产代码文件的更改,matcher在每一次提交的后48小时内迭代所有提交,并根据标准目录布局收集测试代码的更改,生成一个生产代码更改的列表prod_list和测试代码更改的列表test_list,matcher然后根据java项目的生产代码文件和测试代码文件的命名约定对它们进行匹配,如果测试代码文件存在并且在更改列表中,则形成协同演化更改对changepairs=(changep,changet)并将其添加到样本集,其中changep,changet都是一个三元组(path,id,type),分别代表生产/测试代码文件的相对路径、提交的哈希id、文件的修改类型;

3.根据权利要求1所述的基于神经机器翻译的测试用例版本自动迁移方法,其特征在于,所述s2:对所有协同演化更改对changepairs样本进行筛选,使用gitpython获取所有changepairs和与之对应的上一次提交之间的差异文件diff,同时计算差异文件更改行数,筛选出更改行数小于等于3的diff文件。

4.根据权利要求1所述的基于神经机器翻译的测试用例版本自动迁移方法,其特征在于,所述s3:将生产代码的更改分为12种类型,它们属于两大类,分别是编程语言结构的修改和自然语言结构的修改,前者包括package-id、import-stmt、class-dec、method-sig、method-body、field、annotation的修改,后者包括copyright、javadoc、comment的修改,使用如下的正则表达式:

5.根据权利要求1所述的基...

【专利技术属性】
技术研发人员:孙建国池剑磊黄晏瑜白胜刚田野冷雪
申请(专利权)人:西安电子科技大学杭州研究院
类型:发明
国别省市:

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

1