存储过程可重用的代码块_利用软件重用经验进行自动化测试推荐

fff5a8447aea19996198ecaa57f6d18d.png

1 引用

Werner Janjic and Colin Atkinson . Utilizing software reuse experience for automated test recommendation. In Proceedings of the 8th International Workshop on Automation of Software Test, 2013, 100-106.

2 摘要

缺陷测试开发仍然是一个劳动非常密集的过程,其要求软件工程师具备高级别的领域知识、专注度和问题意识。因此,任何可以在这一过程中减少人工劳动的技术都有潜力帮助显著地减少软件开发成本和时间消耗。实现这一目标的一个设想是重用已有测试用例中绑定的知识,以直接或间接帮助开发新软件组件和系统的测试。虽然在过去的研究里,软件重用技术在学术界和工业界都获得了很多关注,以前的研究集中在现有软件的重用来写新的产品代码,而没有聚焦测试推荐。在本文中,我们关注后者并提出一种新颖的自动化测试推荐方法,该方法从传统软件重用中吸取经验教训并在工程师开发测试时主动给出测试用例建议。相比之下,大多数现有的测试辅助工具以覆盖评估和测试质量评估的形式提供测试开发者事后的帮助。我们的目标是为高效的软件测试开发创建一个自动化的、非侵入式的推荐系统。在本文中,我们给出了基本实现方法,并呈现了我们的测试推荐系统在 Eclipse 上的原型实现。

3 技术介绍

在过去的十年中,由于大型开源软件存储库的出现,尤其是针对代码方面的软件搜索引擎的生存能力得到了极大的提升。这为新一代推荐工具(尤其是代码推荐系统)奠定了基础,旨在通过消除对“重复造轮子”的持续需求来加速软件开发过程。

我们的目的是构建一个用于软件测试事前推荐的搜索工具,搜索工具所用资源库包含了大约 200,000 个 Junit 测试文件。我们认为这些测试文件中存储的知识是非常有价值的,可以用来帮助软件开发人员更有效地创建测试。

3.1 单元测试搜索引擎

如清单 1 中所示的测试用例,该用例用于测试将十六进制数转换为十进制数的 HexUtil 类。我们的系统首先对代码进行编译,之后对其抽象语法树进行初始分析。然后识别出被测类(CuT)的接口。我们通过上述操作后提取如清单 2 所示的方法签名,最后将结果进行收集并建立索引,创建索引后,将使用测试驱动的搜索技术来构建语义相关的测试用例的集群。

8e53a63d26bdb84918ae06364f35f082.png

要搜索测试,可以使用正则表达式或接口描述语言类似的语言。例如,如果开发人员想通过将 String 作为输入参数并返回整数来测试将十六进制转换为十进制数字的方法,则以下查询就足够了:hexToDecimal(String):int;

为了避免用户必须学习复杂的查询语言的情况,如算法 1 所示,我们实施了一种简单的模糊搜索算法,该算法仅需要用户从上方输入即可。如果查询结果大于用户自定义需返回的结果数,则该查询将不再进行模糊搜索。如果结果数不足,系统将进行模糊搜索。该算法在递归调用中定义了四种规则:1)搜索查询语句的完全匹配 2)在方法名称中添加通配符进行匹配 3)删除方法,仅进行类名匹配 4)将通配符添加到类名进行匹配。

808532d704ddecff004febcc21ae6fee.png

搜索引擎返回所有匹配的测试用例,并附带一个表,该表描述了被测方法以及输入参数和返回值之间的映射关系。如图 1 所示,第一列包含测试调用方法的名称,第二列显示返回值,第三列为调用的参数值。

0747fc23e545d1af1732e06b816add7a.png

图 1. SENTRE 截屏-单元测试搜索引擎

3.2 自动化生成测试推荐结果

为了能够自动化的生成测试推荐结果,我们用到了上一节中提到的已分析测试用例的索引。我们的存储库中有大约 200,000 个从开源网站上收集的 JUnit 测试用例。其中进行测试推荐的基本流程如图 2 所示。(1)开发人员编写了一个类然后写单元测试。(2)随后,推荐系统对搜索与提供的被测类接口具有相似接口的测试用例。(3)并通过针对与搜索所获取的测试相关联的被测类执行开发人员的测试来判断其适用性。通过此步骤的测试用例成为待推荐测试建议,(4)对这些建议进行排序并交付给用户的 IDE。(5)由于测试是否适合还取决于用户的测试行为。用户检查推荐的测试集,并决定应在其项目中重用哪些推荐结果。通过重用推荐结果并放弃其他建议,开发人员可以向系统提供反馈。系统会对该反馈进行自动分析,并用于提高推荐引擎的未来精度。

0d249f2ebd1fb3546f6b887aedf480c1.png

图 2. 测试推荐和重用流程图

当前,我们设想开发人员可以重用测试用例的两种可能情况:针对有状态对象的重用测试用例,以及针对无状态算法和功能的重用测试用例。

在面向对象的开发中,程序员创建的对象通常是有状态的,因此通常无法通过简单的单行断言进行充分测试。测试有状态对象取决于在其上下文中设置对象,将其属性设置为某些值来进行初始化,并在最后定义一个或多个断言以证明对象按预期执行。由于这是一个相当复杂的场景,所以最好在 IDE 内的单独视图中提供完整测试建议,而不是直接在代码编辑器中执行单行或方法测试用例建议。

系统会根据各种标准对推荐结果进行评估、排名和展示。在我们的初步工作中,我们建议使用以下标准:

(1)执行顺序一致性:有状态的对象的几个方法调用通常是不可交换的,并且在开发人员提供的测试与找到的测试之间的语句执行顺序中存在高度重叠,因此结果的排名更高。

(2)接口相似度:在搜索过程中找到的测试所需接口与开发人员所测试的类的接口(理想情况下相同)越接近,推荐系统对其的排名就越高。

(3)测试执行成功率:可能发生图 2 步骤 3 中的测试执行仅部分成功的情况,即所提供测试的一部分失败。测试失败的部分越多,推荐系统对其的排名就越低。

对于不考虑对象状态的特定算法(即方法,过程等)的测试,有可能通过在纯输入输出映射的级别上提供具体的测试建议来帮助开发人员。我们建议使用以下标准:

(1)覆盖率–根据候选人对开发人员测试代码覆盖率的提高程度进行排名。

(2)测试相似性–如果开发人员测试中包含的模式(即断言的顺序和内容)与搜索引擎发现的测试相似,则在推荐列表中找到的测试排名较高。

3.3 测试推荐工具 Eclipse 插件

在本节中,我们将介绍我们开发的一个针对 Eclipse 的测试推荐插件–Test Tenderer。我们的目标是向开发人员推荐有用的测试用例,并帮助他们为正在开发的软件编写更好的测试代码。因此,与传统的代码推荐系统一样,不应该通过要求开发人员编写任何其他规范或学习新的查询语言来避免产生更多的开销。Test Tenderer 无缝集成到 Eclipse 开发环境中,基本推荐过程的概述如算法 2 所示。

e15b40a4e5c5bd91bfda0d158f0866f3.png

后台模块分析正在进行测试项目的上下文并使用不同的启发式策略来确定正在测试的类的细节。在包含 65,003 个测试文件的初始数据集上进行的初步实验显示,成功匹配了 56,930 个测试用例,有 87.5%成功匹配。对于剩下无法成功匹配的情况,系统会消除所有 JDK 标准导入,并尝试在其余的对象中识别出被测类。在测试的开发过程中,后台模块不断监视用户输入的代码,提取被测类上的所有方法调用,并保存方法的参数列表

ec5638f6faecb89faedf99523db2329e.png

以及返回值

59f6bb7dffb1ec1cb9e8610cd88edc1d.png

后台模块之后进行可重用测试用例的搜索和测试推荐分析,最后进行测试用例推荐。

4 本文主要贡献

本文主要贡献是提出了一种自动化测试用例推荐方法,重用已有测试用例中绑定的知识,以直接或间接帮助开发新软件组件和系统的测试。作者创建了一个软件测试领域的自动化的、非侵入式的推荐系统并开发了基于 Eclipse 的使用插件。该系统建立了被测类接口与测试用例的关联关系,存储到索引库中。之后系统会挖掘用户在测试过程中的上下文信息,分析代码的抽象语法树并提取被测类中的方法接口信息。系统会根据提炼的方法接口信息在索引库中检索关联的测试用例,最后通过设定好的策略排序和过滤后推荐给用户。

致谢

感谢国家重点研发计划课题:基于协同编程现场的智能实时质量提升方法与技术(2018YFB1003901)和国家自然科学基金项目:基于可理解信息融合的人机协同移动应用测试研究(61802171)支持!

本文由南京大学软件工程系 2018 硕士生门铎翻译转述。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值