// //

Want to see Parasoft in action? Sign up for our Monthly Demos! See Demos & Events >>

X
BLOG

Parasoft Jtest让单元测试重获青睐

Parasoft Jtest让单元测试重获青睐 Reading Time: < 1 minute

Parasoft开发了Parasoft Jtest单元测试助手来提高单元测试的效率,因为Parasoft作为软件测试的专业厂商知道它有多重要,同时也了解单元测试是极其耗时的。

众所周知,单元测试的核心是最佳实践。同时,Parasoft也从用户中了解到许多有关他们的代码单元测试覆盖不足的情况,而且这种情况非常普遍。

那么,为什么最佳实践和现实之间存在差距呢?

让我们看看单元测试覆盖率低的一些原因,以及如何通过软件自动化克服这些障碍。

为什么要进行单元测试

谈到单元测试,我们首先需要明白,我们为什么需要进行单元测试。大多数开发团队都认同单元测试是有价值的。一个好的单元测试套件为应用程序开发提供了一个安全基础,使团队能够更加迅速地实行开发,同时可以降低潜在的后期阶段风险。

从大方向来讲,创建软件单元测试的过程本身就是一项有益的活动,它能够帮助开发人员从不同的视角审查他们的代码,这件事情的本质上就相当于是进行额外的代码审查。

Testing pyramid
在编写单元测试时,开发团队可以从外部角度来查看功能接口,考虑下面两个问题,会给团队带来非常大的价值。

  • 如何使用我的代码?

—对于这个问题的回答可以简化界面,降低代码维护成本。

  • 如果我得到无效的数据会发生什么?

—对于这个问题的回答,可以让我们设计更好的、更健壮和可重用的代码来“证明”团队的代码。

我们Parasoft的开发团队在为开发中的代码编写单元测试时发现了许多问题。

为什么不愿意进行大量的单元测试

通常情况下,开发团队会进行最少的单元测试或完全跳过它。这通常是由于以下两种情况:

  • 需要交付越来越多的功能带来的压力,导致团队没有时间去进行单元测试。
  • 创建有价值的单元测试的复杂性和耗时性,导致团队需要投入更多的精力去进行单元测试。

采用有限单元测试的原因

为什么团队会只采用有限的单元测试。其实大致可以分为以下几个原因:

  • 涉及大量的手工编码。有时甚至比实现特定功能或增强功能所需的内容还要多。
  • 很难理解初始化和隔离被测单元的依赖关系。
  • 定义适当的断言是很耗时的,通常需要循环运行和手动调整测试或执行智能断言。
  • 测试过程枯燥。开发人员不希望感觉自己像测试员,他们希望花时间交付更多的功能。

帮助进行单元测试的工具

目前有几种工具可以帮助进行单元测试。

      • 单元测试和断言框架给我们提供了标准化的执行格式,如JUnit,以便无缝集成到CI基础设施中(Jenkins、Azure DevOps、Bamboo、TeamCity)。
      • IDE有助于创建测试代码(IntelliJ、Eclipse)。
      • 模拟框架将代码与其依赖项(Mockito)隔离开来。
      • 代码覆盖工具为执行的代码提供了一些可见性(JaCoCo、Emma、Cobertura、Clover)。
      • 调试器允许开发人员监控和检查单个测试的逐步执行详情。

单元测试为什么成本这么高?

尽管这些工具很有帮助,但它们没有解决开发人员没有进行足够单元测试这个问题。开发人员在使用这些工具的过程中,都会发现会存在许多问题会导致成本增加,例如:

      • IDE有助于为单元测试创建框架,但没有内容。开发人员仍然需要花费大量的时间来添加代码来创建一个可以执行的测试。

Parasoft Jtest让单元测试重获青睐

      • 模拟框架需要大量的手工编码来实例化和配置,以及如何正确使用它们的知识。
      • 断言需要手动定义,并且必须执行测试,看看是否断言了正确的值。
      • 覆盖工具可以深入了解已执行测试涵盖的代码,但它们不提供对测试运行时行为的任何洞察。
      • 调试器可用于单个测试,但不能扩展到监控整个测试运行。

总而言之,创建单元测试仍然需要大量成本投入来搭建好框架,然后才能开始向测试用例框架中添加业务逻辑。

我们通过创建测试助手来解决以上难题

为了解决上面提到的这些问题,帮助团队节省成本,我们将整个测试趋势转向了软件测试自动化。Parasoft Jtest的单元测试助理(UTA)可以帮助团队仅仅通过点击一个按钮就可以创建一个功能完整的单元测试。

使用Parasoft Jtest创建的测试是常规的JUnits形式的测试用例,但可以为团队完成所有的普通的工作。Parasoft Jtest可以设置测试框架,实例化对象,为待测方法使用的适当对象和方法调用配置模拟,并为测试对象中更改的值添加断言。这些Junit格式类的测试用例可以作为标准CI工作流的一部分执行,与团队利用Junit框架手写的测试用例基本相同。

Parasoft Jtest支持对以下情况测试目标进行测试创建:

  • 为新开发的代码创建单元测试。
  • 批量为旧代码生成单元测试。
  • 有针对性地生成单元测试,来覆盖特定未覆盖的代码块。

为新开发的代码创建单元测试

开发人员可以选择使用对象初始化和完全配置的Mockit生成多个测试用例,以覆盖测试方法中的所有分支。或者,如果他们想要对生成的代码有更多的控制,他们可以使用有针对性的Parasoft Jtest操作一点一点地构建测试。

Parasoft Jtest的单元测试助手专门通过执行以下操作的辅助工作流程:

  • 创建调用测试方法的测试框架,并初始化所有对象。
  • 识别可以mook的方法调用,以更好地隔离被测代码,并通过快速修复生成模拟代码。
  • 为在执行测试期间更改并应断言的对象值创建断言。
  • 查找在自己创建潜在不稳定测试环境后无法清理的测试(由于使用线程、外部文件、静态字段或系统属性)。

为遗留代码生成批量单元测试

许多团队仍然使用大量未经测试的代码维护遗留代码库。当需要对代码进行更改时,这就成为业务风险。

Parasoft Jtest支持开发人员为整个项目、软件包和类生成测试套件,以快速构建一组测试,为遗留代码提供高覆盖率。可以对测试进行优化,以最小的测试用例集产生最高的覆盖率,或者通过更稳定和可维护的测试套件产生略小的覆盖率。

生成目标单元测试以覆盖特定的

未覆盖的代码块

通常会存在一些针对代码库的测试,但没有足够的测试来覆盖所有条件。主流代码虽然进行了测试,但并未覆盖边缘情况或错误条件。

Parasoft Jtest能够直观地显示测试了哪些代码块,哪些没有被测试,并提供特定于上下文的操作来创建一个测试用例,专门覆盖了指定的未覆盖的代码行。该操作创建一个测试用例,使用强制测试执行给定代码行所需的特定值初始化所有对象和mock。

Parasoft帮助减少单元测试时间

Parasoft开发了Parasoft Jtest的单元测试助手,来提高单元测试的效率,因为作为一个专门从事智能测试自动化的团队,我们知道单元测试是创建安全、可靠、合规和高质量软件的重要步骤。

自从我们发布了带有单元测试助手的Parasoft Jtest以来,客户告诉我们,Parasoft Jtest将创建和维护单元测试所需的时间减少了将近50%。我期待您的尝试,并分享您使用Parasoft Jtest的经验,以大幅减少创建和维护单元测试所需的时间。

Written by

Nathan Jakubiak

Nathan是Parasoft的开发总监。自2000年以来一直在Parasoft工作。Nathan和他的团队开发了UI测试(Selenic)、API测试(SOAtest)、服务虚拟化(Virtualize)和单元测试(Jtest)等领域的产品功能。

将最新的软件测试新闻和资源发送到您的电子邮箱。