如何借助自动创建单元测试来提高单元测试的投资回报率(ROI)?

Parasoft Jtest的自动单元测试创建技术消除了单元测试的障碍,使单元测试的日常工作自动化,包括创建、隔离、模拟和维护。

大多数开发团队都会同意,尽管他们不喜欢它,但是单元测试实际上是非常有价值的。尽管有许多有助于手动测试创建的工具,但是在将业务逻辑添加到测试之前,创建和维护单元测试仍然需要大量手动,耗时且经常令人费解的工作。这样,尽管有进行大量单元测试的意图,但是开发团队通常会执行所需的最小数量的单元测试,或者完全跳过它。

开发人员表态

最近的一次客户调查表明,在某种程度上可以预料到,测试创建、模拟/隔离和维护是阻碍单元测试成功的关键问题。图1显示了该调查的结果,显示了开发人员正在使用Java进行单元测试时确定的首要问题。

1:调查结果显示了单元测试引起的关键关注领域(百分比)。

 

为了解决这些主要问题,我们可以转向自动化软件测试。在此文中,我将向您展示如何使用Parasoft Jtest自动化测试执行和数据收集,以及自动创建单元测试,以节省测试创建时的时间和精力。Parasoft Jtest的自动单元测试创建技术可以建立测试框架,实例化对象,并为适当的对象和被测方法使用的方法调用配置模拟。它创建了常规的JUnit,完成了所有平凡的工作,因此开发人员可以专注于将人类智能和逻辑应用于他们的测试。

 

单元测试的好处以及为什么开发人员仍然避免使用它

 

单元测试是迭代的,在敏捷过程中,单元测试具有改善项目成果的良好记录。当然,经过充分证明的是,在生命周期的早期进行测试是以后检测并消除昂贵且耗时的系统级错误的最佳方法。更具体地说,以下是单元测试的一些主要优点:

 

  • 为敏捷过程提供敏捷性:敏捷过程依赖于高效,可重复的自动化测试套件,以确保每次迭代都不会陷入“大爆炸”测试周期。敏捷和DevOps的成功很大程度上取决于开发团队创建可以高效运行的测试套件以及测试尽可能多的功能。
  • 更高的质量和安全性:软件团队了解,测试是确保软件满足要求的唯一方法,但是团队经常无法进行足够的测试,或者在开发生命周期中进行得太晚。特别是安全性,需要在最早的阶段就内置到应用程序中,因此必须尽早进行安全性测试。
  • 从长远来看降低成本:在已发布软件中发现的软件错误修复成本可能是开发期间的1000倍。在单元测试的早期编码阶段发现的错误比后来发现的错误便宜得多。在测试自动化和单元测试基础架构上的短期投资可带来更好的产品质量、安全性和按时交付的回报。

不幸的是,尽管希望获得更好的结果,但是尽管有这些好处,开发人员仍在努力进行单元测试。上述调查结果也说明了这些斗争,其中包括:

  • 创建测试是额外的工作,而且通常很乏味:可以理解,单元测试是额外的工作,通常被视为编程的最不期望的方面。在尝试维护项目目标和截止日期的同时创建一个全面的测试套件是开发团队面临的两个相互竞争的压力。
  • 测试维护非常昂贵:就像代码一样,单元测试也需要维护。任何代码更改都可能导致相关测试的更改。不仅如此,由于代码库修改而失败的测试似乎无关紧要,从而导致测试套件不稳定。额外的维护在许多开发人员的心中创造了“双重工作”。
  • 模拟和隔离被测单元既困难又耗时:隔离被测单元至关重要,但要模拟依赖关系,这可能是一个耗时的过程。

如果软件开发团队想获得彻底的单元测试的好处,那么他们必须通过创建、隔离和维护测试来解决这些问题,而解决方案就是自动化。Parasoft Jtest的自动单元测试创建工具提供了测试创建和维护所需的帮助,同时在开发人员的IDE中工作并利用现有的测试和模拟框架。

通过自动创建测试来减少负担

创建单元测试很繁琐,并且将注意力从项目中更有趣的部分转移开来。代码本身是重复的,通常需要与被测代码一样多的工作,最重要的是,单元测试代码本身需要像任何代码一样进行修复和调试。幸运的是,单元测试非常适合自动化,而来自单元测试工具的自动指导可以极大地简化测试的创建,减少调试和修复的数量,并收集结果和指标以提供项目分析。

超越IDE

例如,许多IDE提供了针对JUnit的单元测试创建向导,但没有提供“内容”来完成该过程。断言需要手动定义,并且如果使用模拟框架,则需要大量的手动编码。相反,Parasoft Jtest在开发人员的IDE中提供了上下文相关的实时帮助。通过自动创建单元测试,当您利用单元测试工具执行以下操作时,快速简单地完成了简单骨架单元测试中缺少的“内容”:

  • 创建测试框架,实例化对象,并配置适当的模拟对象和方法
  • 执行测试自动化执行的运行时分析,以突出显示在测试过程中更改的对象值,并建议对这些值进行验证的断言。
  • 标识应该模拟的方法调用,以便更好地隔离测试中的代码
  • 检测已创建但未在测试完成后释放的系统资源,从而可能创建不稳定的测试环境
  • 收集代码覆盖率和其他指标

为了解决这个问题,我们来看一个例子。在这里,用IDE调用Parasoft Jtest的单元测试助手来创建参数化测试:

 

该工具将创建以下单元测试代码,此时开发人员将根据需要完成参数:

 

为了为不同的参数值创建测试用例,Parasoft Jtest的单元测试助手提供了一个测试用例向导:

 

而你没有这么做。

 

降低模拟复杂度

 

单元测试意味着隔离被测对象,如果存在许多依赖性,则需要大量工作。即使使用MockitoPowerMock这样的模拟框架,仍然需要大量的手动编码。使用自动测试助手工具,您可以检测依赖关系并自动填写框架所需的详细信息。

 

该工具本身会分析被测代码,自动检测依赖关系,并向开发人员提出建议。

 

例如,在这里我们正在执行IWorkspaceClass类的以下单元测试:

 

在运行时会检测到依赖关系,该工具建议模拟发现的依赖关系:

 

使用该工具选择“模拟”将通过单元测试生成必要的模拟代码。生成此代码后,可以对其进行自定义以表示所需的正确逻辑。依赖关系的自动检测和随后的模拟代码创建极大地减少了模拟对象所需的手动编码,并且可能容易出错。

 

通过自动化减少测试套件的维护

 

测试套件的维护与创建测试所需的许多工作重叠,例如创建新测试,修改测试以适合基础逻辑、模拟依赖关系、测试执行和验证。在测试维护期间从Parasoft Jtest的单元测试助手获得帮助与在创建过程中一样有价值,因为它可以提供有关在测试执行期间收集的运行时分析结果的更新反馈。例如,在运行时检测到被测对象中的新依赖关系,该工具会提示开发人员如何处理它。

 

在此阶段同样重要的是,确保断言仍然有效。Parasoft Jtest单元测试助手提供了一些建议,这些建议可以检测代码中的更改并更新断言以反映新的业务逻辑。

 

最大限度地利用现有工具

已经进行单元测试的Java开发人员可能会使用JUnit,并可能使用其项目的断言框架,例如MockitoPowerMock。测试自动化工具需要利用这些现有工具,因为替换单元测试中的现有投资将消除任何成本和时间收益。Parasoft Jtest的单元测试助手与这些现有工具无缝集成,这一点至关重要。

结论

单元测试具有明显的好处,尽管大多数开发团队都意识到了这一点,但是许多人却因创建和维护测试而受阻。使用Parasoft Jtest的自动化单元测试技术将帮助用户消除这些障碍,使单元测试的平凡方面自动化,包括创建,隔离,模拟和维护。为了加快采用速度,Parasoft Jtest利用了开发团队在测试和模拟框架上的现有投资,并在为产品带来高品质的同时,还给了开发人员更多的时间。

 

posted @ 2020-12-24 14:54  SWTOR  阅读(198)  评论(0编辑  收藏  举报