利用软件重用经验进行自动化测试推荐

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 摘要

3 技术介绍

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

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

3.1 单元测试搜索引擎

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3.3 测试推荐工具 Eclipse 插件

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

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

以及返回值

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

致谢

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

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年1月23日
下一篇 2020年1月23日

相关推荐