coverity代码检测工具介绍_FOREPOST:一种使用反馈驱动学习软件测试的性能检测工具...

FOREPOST:一种使用反馈驱动学习软件测试的性能检测工具

28b0ecf29271a9ab56729de9baaa51eb.png

摘要

性能测试的一个目标是找出某些特定情况,在这些情况下对于某些输入值组合,应用程序意外地展示出更糟糕的特性。性能测试的一个基本问题是如何更快地选择输入数据的可管理子集,以自动发现应用程序中的性能问题。

我们提供了一种新颖的工具 FOREPOST,可使用黑盒软件测试自动发现应用程序中的性能问题。在本文中,我们演示了 FOREPOST 如何通过使用机器学习算法从应用程序的执行痕迹中提取规则,然后使用这些规则自动选择测试输入数据,以将应用程序引向计算密集型路径并发现性能问题。我们的在线附件(http://www.cs.wm.edu/semeru/data/ICSE16-FOREPOST)中提供了FOREPOST的工具、源代码和演示视频。

关键词:性能测试,机器学习,黑盒测试

1.介绍

性能测试的目的是发现性能问题,即被测应用程序(AUT)会在特定工作负载下意外地表现出更糟糕的特性。 例如,负载测试作为性能测试的一种有效测试方法,可以发现 AUT 预期之外的高响应时间或低吞吐量的行为。 测试工程师构造性能测试用例,这些用例包括系统行为(例如,与 GUI 对象进行交互或调用公共接口的方法)以及作为这些方法或 GUI 对象输入参数的测试数据。 在短时间内构建能够发现性能问题的有效性能测试用例是很困难的,因为它需要测试工程师测试很多不常见的应用程序动作和数据的组合。

根据输入值,应用程序可能会在资源消耗方面表现出不同的行为。其中一些行为涉及密集计算。自然,测试人员想总结一下其输入的内部行为,以便他们可以选择输入数据导致资源消耗显著增加,从而揭示性能问题。不幸的是,找到适当的规则来共同描述此类输入数据的属性是一个高度创造性的过程,涉及对输入域的深入理解。

用于选择输入测试数据的描述性规则在软件测试中起着重要作用。例如,对于保险申请的规则是,如果这些客户先前犯有一次或多次保险欺诈罪,并且未在其处所安装防盗锁,那么这些客户是有高保险风险的。 和该规则相匹配的高风险保险记录的客户与没有问题记录的客户相比,计算保险费可能会消耗更多的资源,因为处理此高风险的客户记录涉及针对数据库执行多个计算量大的事务。 当然,我们使用了一个过分简化的规则的例子来说明这个想法。 即使现实世界中的系统表现出更为复杂的行为,有用的描述性规则也常常使测试人员能够构建有效的可以揭示性能故障的测试用例。

规则可以洞察 AUT 的行为。 例如,一条规则可以指出当测试用例很好地揭示性能瓶颈经常会调用方法 checkFraud,并且从后端数据库中检查表 Finances 的属性 SecurityDeposit 的值。 此信息有助于性能测试人员创建完整的测试视图,并适当地选择测试输入数据,从而减少测试数量,因此这些规则可用于自动选择更好的测试用例。

我们演示了工具 FOREPOST,该工具可通过学习和使用描述导致密集计算的输入数据类别的规则自动发现性能问题。 在我们之前的工作中,FOREPOST 实现了反馈驱动性能软件测试方法,并在四个主题应用程序(Renters,JPetStore,Dell DVD Store 和 Agilefnat)进行了评估。与随机性能测试相比,FOREPOST 可从 AUT 执行痕迹中学习规则,并使用这些规则自动选择测试输入数据,以发现应用程序中的更多性能问题。 FOREPOST 将结合运行时监视与机器学习技术,并自动执行测试脚本以减少在 AUT 运行期间收集的大量与性能相关的信息。 其目标是选择少量描述性规则,这些规则能帮助了解那些可以导致应用程序计算负担增加的测试输入数据的属性。

在当前版本的 FOREPOST 中,它支持 Java 应用程序的性能测试。 它采用二进制代码和 AUT 的测试输入数据作为输入,并将输出一系列的规则,这些规则描述了如何输入数据以引导 AUT 进入计算密集路径,并列出了可能是性能瓶颈的方法列表。 FOREPOST,其运行要求和实验结果可公开获得。 我们还在在线附件中提供了演示视频,展示如何在主题应用程序之一的 Agilefant 上工作。

2.演示 FOREPOST

FOREPOST 是性能测试的工具,它会自动学习在输入数据方面描述 AUT 行为的规则,并使用这些规则选择输入并检测性能问题。 FOREPOST 是建立在两个关键思想的基础上的:1)从执行轨迹中提取规则,以描述输入数据与使用此数据执行测试的系统性能之间的关系,以及 2)使用这些规则识别瓶颈。 FOREPOST 仅需要二进制代码和 AUT 的测试输入数据,因此, FOREPOST 不需要通过源代码进行性能测试。最后获得方法的排名列表。排名最高的方法可能是性能瓶颈,测试工程师需要进一步确认。当前,FOREPOST 由于底层配置文件(例如 TPTP )的实现而支持 Java 应用程序的性能测试。但是,通过使用不同的配置工具将 FOREPOST 扩展到使用不同编程语言实现的程序很简单。 FOREPOST 的体系结构如图 1 所示。在本节中,我们详细介绍我们的工具及其体系结构。

1ae8414ea9977245571edaf2b2253bbd.png

图 1 FOREPOST 体系结构

2.1 生成规则

作为首个关键点的一部分,AUT 最初使用少量选定的测试输入数据运行(请参见图 1 中的步骤 1)。在我们的实现中,测试工程师编写随机选择的测试输入数据组合的测试脚本,并将所选的输入自动发送到 AUT。输入的测试数据来自现有的目录或数据库;这是行业中的惯例,因为我们与不同的性能测试专家进行了确认。例如,Renters 的数据库包含大约 7800 万个客户配置文件,这些文件用作包括 Renters 本身在内的不同应用程序的测试输入数据。对于基于 Web 的应用程序,我们编写了包含所有具有不同参数的 URL 请求的测试脚本,并使用 JMeter 模拟了发送 URL 请求以执行应用程序的用户。在测试脚本中,我们将来自一个用户的一组 URL 请求定义为一个事务,并使用 JMeter 同时发送五个事务。尽管在当前的 FOREPOST 实现中随机选择了初始测试输入数据,但实际上,测试工程师还可以提供可能揭示瓶颈的输入数据或他们希望开始使用的任何输入数据。

一旦测试脚本开始执行应用程序,配置文件就会收集其执行轨迹,并将这些轨迹信息转发到执行轨迹分析器,后者会生成轨迹统计信息(图 1 中的步骤 2-3)。我们使用 TPTP 框架实现了分析器,该框架可以将探针注入二进制代码中,以收集运行时信息,例如系统时间,参数大小以及 AUT 与数据库之间传输的数据量。基于收集到的分析数据,可以获得每个执行轨迹的轨迹统计信息,例如调用的方法的数量,完成端到端应用程序运行所花费的时间以及调用的次数。图 2(a)显示了 FOREPOST 中轨迹统计的结果,其中每个轨迹的经过时间显示在第二列中(请参见图 2 中的(1))。当前,FOREPOST 支持使用经过的执行时间来评估每个执行轨迹的性能行为。我们选择经过的执行时间作为性能指标,因为它是使用最广泛的指标之一。当然,FOREPOST 可以通过更改配置文件的设置来考虑其他不同类型的性能指标。我们将其留作未来的工作。

轨迹统计数据提供给轨迹聚类模块,该聚类模块将收集到的轨迹聚类到两个不同的组中,这些组共同描述了 AUT 的不同性能。例如,可以只有两族分别对应好的性能测试用例和糟糕的性能测试用例(图 1 中的步骤 4-8)。良好的执行轨迹使 AUT 消耗更多的资源和时间,这能够很容易的揭示性能瓶颈。相反,与良好的轨迹相比,糟糕的执行轨迹会浪费很少的资源,这样很难能揭示性能瓶颈。 FOREPOST 使用平均已执行时间对轨迹进行聚类。执行时间比平均值长的轨迹被视为良好轨迹。合理地认为,执行时间较长的执行轨迹,将导致密集的计算和增工作量增加,可能会揭示性能瓶颈。否则,这些轨迹将被分配为糟糕的执行轨迹。如图 2(b)所示,所有收集的轨迹都被分为不同的组。测试工程师可以在必要时查看这些轨迹并修改分配,例如将“好”更改为“不好”(请参见图 2 中的(2))。

f636f95dd66db2ae40a8fb8b8e66b122.png

通过将这些学习到的规则重新提供给测试脚本来形成反馈循环,以自动指导选择测试输入(图 1 中的 step13)。 一旦测试脚本收到一组新的规则,它就会根据这些规则将输入空间划分为多个块并从每个块中选择测试输入。 分析器收集了这些新测试运行的轨迹,因此循环重复进行。可以在每几次执行之后重新学习新规则,并根据新规则重新自适应地分配输入空间。 在经过一段时间的测试后,如果没有新的规则发现,则测试输入的划分很可能是稳定的。 此时,可以不继续执行,并使用这些选定的输入继续进行测试。

15011c81eb764709416ddbc26c5d0ea7.png

图 2 FOREPOST 的四个视图

(a)轨迹统计数据 (b)自动聚类 (c)学习规则 (d)识别到的性能瓶颈

2.2 识别瓶颈

我们的目标是帮助测试人员自动识别性能瓶颈,因为方法调用的执行会严重影响整个 AUT 的性能。例如,考虑一个由线程定期执行的方法,以检查某些文件的内容是否被修改。尽管此方法可能是一个瓶颈,但它同时调用了好的执行轨迹和不好的执行轨迹,因此作为应用程序逻辑的必要部分,它对资源消耗的贡献不会导致产生任何可解决性能问题的方法。 我们的第二个主要想法是考虑在好的执行轨迹中调用的最重要的方法而该方法不包含在不含的轨迹中或者对不好的轨迹只有很小的影响,其中方法的重要性是其执行引起的资源消耗。 因此,一旦输入空间被划分为导致好的和不好的执行的簇,我们就希望找到专门针对好的轨迹并且最有可能造成瓶颈的方法。

此任务与计算规则并行完成,并且在轨迹分析器生成用于相应的构造好的轨迹和不好的轨迹的两个矩阵$||XB||$、$||XG||$的方法统计信息时开始(图 1 中的步骤 14-16)。尽管 FOREPOST 当前将每种方法的执行时间视为其资源消耗,但用户可以通过将消耗表示为方法调用时间,总执行时间,数据库中访问的属性数量以及在 AUT 和数据库之间传输的数据量的归一化加权总和来轻松地扩展 FOREPOST。一旦构造了这些矩阵,独立组件分析(ICA)将它们分解为相应的不好的轨迹和好的轨迹的矩阵$||SB||$和$||SG||$。 FOREPOST 使用 Java 库 FastICA 为 ICA 实现快速和高鲁棒性的定点算法。交叉引用矩阵$||SB||$和$||SG||$,FOREPOST 为不同组(例如好或坏)的高级需求指定方法权重,并进行对比挖掘(请参见我们以前的工作“Forepost: Finding performance problems automatically with feedback- directed learning software testing”一文中的详细信息),来将较大的权重分配给最显著的好的轨迹而对不好的轨迹不调用或者不分配权重。所有方法均根据其权重进行排名,如图 2(d)所示。建议人员可以决定性能测试人员是否应该分析排名最高的方法来调试可能的性能问题(图 1 中的步骤 17-19)

2.3 获取方式

有关 FOREPOST 的更多信息,请参见我们的在线附录,其中包含(i)演示 FOREPOST 的视频,(ii)用于下载 FOREPOST 的源代码的链接,(iii)用于下载使用的工具(例如 Weka 和 TPTP 框架)的链接,(iv)检测到的性能瓶颈样例,以及(v)FOREPOST 的体系结构。

2.4 使用样例

在保险公司的一个非普通应用程序 Renters 和三个开源应用程序 JPetStore,DellDVDStore 和 Agilefant 上对 FOREPOST 进行了评估。 JPetStore 和 Dell DVD Store 是电子商务站点的开源模拟,而 Agilefant 是企业级项目管理系统。 所有应用程序均可在我们的在线附件中获得。 结果显示在我们以前的工作中(“Automatically finding performance problems with feedback-directed learning software testing.”,“Forepost: Finding performance problems automatically with feedback-directed learning software testing.”)。 在本节中,我们显示一些规则示例和已检测到的性能瓶颈。

获取规则。 FOREPOST 使用 ML 算法提取描述测试输入数据与 AUT 行为之间的关系的规则。 这些规则用于生成将 AUT 引向计算密集型执行路径的输入数据。 以下是分别针对 Renters,JPetStore,Dell DVD Store 和 Agilefant 的四个规则示例:

  • (childOrAdultCareDetails.numberPersonsCaredForChild>3)and (personalInjuryDetails.nationalEntertainerAthlete = Y) →Good
  • (viewPrdctK9RT01 > 5) and (viewItemEST16 > 5) → Bad
  • (storeStory3 > 100) and (storeProject6 < 25)→Bad

检测性能瓶颈。FOREPOST 提供了方法排名列表,可能会成为性能瓶颈。 测试人员可以查看排名最高的方法,以检查它们是否是真正的性能瓶颈。例如,FOREPOST 从 Renters 获得了方法的排名列表,这些方法由最有经验的开发人员和针对 Renters 的测试人员进行了审查。在检查了方法并检查了源代码之后,他们确认大约有 20 种方法是瓶颈。为了说明,识别出的方法 checkWildFireArea 已经被确认是真正的瓶颈,由于实现访问者模式,发生了对 checkWildFireArea 的错误调用。即使它对计算保险报价没有帮助,也要消耗大量计算资源来执行。一些方法被视为瓶颈,因为它们处理了太多的 XML 数据。总之,FOREPOST 指出方法是瓶颈,但是需要更深入的分析。对于开源应用程序,我们注入了人工瓶颈来分析 FOREPOST 的有效性和准确性。详细的结果可以在我们以前的工作中找到(“Automatically finding performance problems with feedback-directed learning software testing.”,“Forepost: Finding performance problems automatically with feedback-directed learning software testing.”)。

3.相关工作

分区测试是一组策略,用于将程序的输入域划分为多个子域,测试用例可以至少覆盖一次每个子集。 Dickinson 等人的工作“Finding failures by cluster analysis of execution profiles.”与此密切相关,该研究使用聚类分析执行分析器在一组潜在测试用例引起的执行中发现故障。尽管我们都使用了聚类技术,但是 FOREPOST 的不同之处在于它根据执行时间的长短对执行轨迹进行聚类,并且我们针对性能错误而不是功能错误。

学习规则可帮助重新配置分布式系统,以优化动态变化的工作负载。“Machine learning for on-line hardware reconfiguration.”文中所做的工作与 FOREPOST 相似,它使用机器学习方法来学习规则,但它主要是在当前工作负载下学习一系列的硬件配置信息以取得更好的性能。相比之下,FOREPOST 使用反馈导向的自适应测试脚本来定位大多数计算密集型的执行和瓶颈。

“Applying classification techniques to remotely-collected program execution data”一文中提出可以自动将在现场收集的执行数据归类为来自通过或失败的程序运行。 它尝试使用执行数据来学习分类模型,以预测应用程序运行是否失败。 相反,FOREPOST 学习规则以选择输入测试数据,从而将应用程序引向计算密集型运行,以揭示性能问题。

在最近的研究中,Pingyuetal 等人在“Automatic generation of load tests.”文中使用动态符号执行生成性能测试用例。 与 FOREPOST 类似,他们使用启发式方法通过确定执行路径以引入更高的工作负载来生成测试用例。与 FOREPOST 不同的是,他们使用白盒测试方法,因此需要访问源代码,而 FOREPOST 是完全由黑盒驱动的方法。 目前尚不清楚白盒方法将如何扩展到大型工业领域, 我们认为该方法是互补的,其中混合方法可以在灰盒测试中结合两种方法的优点。 我们将其留作未来的工作。

4.结论

在本文中,我们演示了一种新颖的工具 FOREPOST,该工具使用黑盒软件测试自动发现应用程序中的性能问题。 我们的工具是一种自适应的,反馈导向的学习测试系统,可以从应用程序的执行轨迹中学习规则,并使用这些规则为这些应用程序自动选择测试输入数据,以发现与随机测试相比更多的性能问题。 FOREPOST 将二进制代码和 AUT 的测试输入数据作为输入,并输出一组将 AUT 转向计算在本文中,我们演示了一种新颖的工具 FOREPOST,该工具使用黑盒软件测试自动发现应用程序中的性能问题。 我们的工具是一种自适应的,反馈导向的学习测试系统,可以从应用程序的执行轨迹中学习规则,并使用这些规则为这些应用程序自动选择测试输入数据,以发现与随机测试相比更多的性能问题。 FOREPOST 将二进制代码和 AUT 的测试输入数据作为输入,并输出一组将 AUT 转向计算密集的执行路径的规则以及可能是性能瓶颈的方法排名。 评估表明,FOREPOST 在查找输入数据以引起密集计算和识别性能瓶颈方面是有效的。

致谢

本文由南京大学软件学院 2020 级硕士生曹振飞翻译转述。 感谢国家重点研发计划(2018YFB1003900)和国家自然科学基金(61832009,61932012)支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值