JUnit教程:设置,编写和运行Java单元测试

今天,我们将返回简短的(但并非少用的!)JUnit教程之一,它有关如何设置、编写和运行JUnit测试的单元测试基础知识。什么是JUnit,如何入门?

JUnit教程:设置,编写和运行Java单元测试

今天,我们将返回简短的(但并非少用的!)JUnit教程之一,它有关如何设置编写和运行JUnit测试的单元测试基础知识。什么是JUnit,如何入门/strong>

理解基础知识,并像本教程的专业版一样扩展您的单元测试实践。

什么是单元测试/h4>

但是在深入探讨JUnits之前,让我们先讨论一下单元测试和回归测试以及它们为什么如此重要。我们将继续介绍一些很好的例子。

单元测试是白盒测试的一种形式,其中测试用例基于内部结构。测试人员选择输入以探索特定路径,并确定适当的输出。单元测试的目的是检查单个组件或方法/类的片段以验证功能,以确保行为符合预期。

“单元”的确切范围通常留给解释,但是一个很好的经验法则是,一个单元包含最少量的执行独立任务的代码(例如,单个方法或类)。我们有一个很好的理由限制单元测试的范围如果我们构建的测试具有项目的多个方面,那么我们已经将重点从单一方法的功能转移到了代码不同部分之间的交互上。如果测试失败,我们不知道为什么失败,而我们却想知道失败的点是在我们感兴趣的方法之内还是与该方法相关的依赖关系。

回归测试

作为对单元测试,回归测试的补充,通过测试对代码所做的更改,可以确保最新的修复程序,增强功能或补丁程序不会破坏现有功能。更改代码是不可避免的,无论是对现有代码的修改,还是为新功能添加软件包……您的代码肯定会更改。正是这种变化才是最危险的,因此考虑到这一点,必须进行回归测试。


什么是JUnit/span>

JUnit是一个Java单元测试框架,是用于回归测试的最佳测试方法之一。一个开源框架,用于编写和运行可重复的自动化测试。

与其他任何东西一样,JUnit测试框架也随着时间的推移而发展。要注意的主要变化是JUnit 4发行版中引入了注释,这增加了JUnits的组织性和可读性。本文章的其余部分将根据Junit 45的用法编写。


如何设置JUnit测试

因此,让我们开始吧。这是设置JUnit的步骤。

默认情况下,更常见的IDE(例如EclipseIntelliJ)已经安装了JUnit测试集成。如果不使用IDE或仅依靠MavenGradle这样的构建系统,则分别通过pom.xmlbuild.gradle处理Junit 4/5的安装。重要的是要注意,Junit 5分为3个模块,其中一个是老式模块,支持Junit 43的注释/语法(尽管坦率地说,使用Junit 3令人沮丧,通常仅在较老的项目中才能看到)。

JUnit 4

要将JUnit 4添加到您的Maven,请在pom.xml中构建以下内容。注意版本:

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>

对于Gradle,将以下内容添加到build.gradle中:

apply plugin: 'java'dependencies {testCompile 'junit:junit:4.12'}

JUnit 5

添加JUnit 5有点不同。由于JUnit 5采用模块化方式,因此使用BOM来导入所有方面。如果仅需要特定的类,则可以指定单个组或工件。

要将JUnit 5添加到Maven,请将以下内容添加到pom.xml

<dependency><groupId>org.junit</groupId><artifactId>junit-bom</artifactId><version>5.2.0</version><scope>test</scope></dependency>

对于Gradle,将以下内容添加到build.gradle中:

apply plugin: 'java'dependencies {implementation 'org.junit:junit-bom:5.2.0'}

如果您需要手动放置类路径以进行JUnit测试,则Java需要原始jar文件,尽管通常不需要这样做。Git包含JUnit的代码。JUnit 4具有可直接下载的jarJunit 5(我正在写这篇文章)目前还没有预制的jar文件,但是可以轻松地编译代码并生成jar


编写单元测试:JUnit的剖析

现在我们已经讨论了一些有关JUnit测试和设置的知识,让我们继续进行这些测试的实际构建和执行。为了最好地说明JUnit的创建,我们想从一些基本的东西开始。在下面的JUnit测试示例图像中,我们有一个简单的方法(左)将华氏温度转换为摄氏温度,还有一个与我们的方法关联的JUnit(右)。我已为我们的JUnit编号,并将在下面详细讨论这些部分。

JUnit教程:设置,编写和运行Java单元测试

1节和第2节:

这些是利用测试框架所需的JUnit库的导入。可以将导入的库指定为JUnit的特定功能,但是通常将其与星号一起导入以访问所有功能。

第3节:

这是我们测试类的开始,这里要注意的重要一点是该类的命名约定,它遵循ClassNameTest

4节:

在这里,我们看到了第一个特定于JUnit的语法,即注释。创建JUnit时,注释非常重要。这就是JUnit知道如何处理代码的处理部分的方式。在我们的示例案例中,我们有一个@Test批注,它告诉JUnit它可以附加到其上的public void方法可以作为测试用例运行。

还有许多其他注释,但更常见的是@Before(在@Test之前运行某些语句/前提,公共无效),@ After(在@Test之后运行某些语句,公共无效),例如重置变量,删除临时文件变量,等等)和@Ignore(在测试执行过程中会忽略某些语句——请注意,@BeforeClass@AfterClass分别用于在所有测试用例之前和之后运行语句,公共静态无效)。

5节:

这里的要点再次是命名约定。注意结构testMethodName

6节:

在这里,我们构造了类对象的新实例。这是必需的,因此我们可以调用正在测试的方法。没有这个对象实例,我们将无法测试该方法。

7节:

与该方法关联的变量需要建立,因此在这里我们声明与我们的方法相对应的变量。应该给它们赋予有意义的值(注意:如果参数是一个对象,则可以实例化或模拟它),以便我们的测试有意义。

8节:

该变量声明可以被认为是可选的,但是出于组织性和可读性的考虑,这是值得的。我们将要测试的方法的结果分配给该变量,并根据需要使用它来进行断言等。

9节:

assert方法(属于org.junit.Assert类的一部分)用于确定测试用例的通过/失败状态。仅记录失败的断言。像注释一样,有许多断言选项。在上面的示例JUnit中,我们使用assertEqualsexpectedActualdelta)。这将接受用户定义的预期结果,实际值(即调用方法的结果)和增量值(允许实现预期值和实际值之间的偏差)。断言的目的是验证。尽管不需要运行JUnit,但是添加断言无疑会破坏测试的目的。没有断言,您将没有验证,最多也不会进行冒烟测试,只有在测试错误出局时才能提供反馈。


如何运行JUnit

选择自己的冒险!在这里,我们将研究三种运行JUnit的方法:直接从命令行,从IDEEclipseIntelliJ)以及使用构建系统(MavenGradle)。

如何从命令行运行JUnit

要直接从命令行运行JUnit,您需要做一些事情:路径上的JDK,原始Junit jar文件以及测试用例。命令如下(此示例适用于Junit 4):

java -cp /path/to/junit.jar org.junit.runner.JUnitCore <test class name>

注意:在专业设置中,如果没有某些构建系统,就不太可能从命令行手动运行测试,但是可以使用。

如何从IDE运行JUnit

Eclipse

要从Eclipse运行,请从Package Explorer中找到JUnit测试,无论您将其指定在哪个文件夹中。右键单击,然后向下移动至“运行为JUnit测试”。这将执行测试并打开一个新的JUnit窗口(如果尚未打开)。

JUnit教程:设置,编写和运行Java单元测试

IntelliJ

IntelliJ中运行测试与Eclipse非常相似。在“项目”窗口中,找到测试,右键单击,然后选择运行“testName”。像Eclipse一样,将打开一个JUnit窗口,其中包含测试结果。

JUnit教程:设置,编写和运行Java单元测试

如何使用构建系统运行JUnit

Maven

Maven使运行测试变得简单。确保从命令行将您放置在正确的位置,并且正确配置了项目pom.xml。然后,您可以运行以下命令来执行JUnit

要运行整个测试套件:

mvn test

要运行单个/特定测试:

mvn -Dtest=TestName test

Gradle

maven一样,Gradle使运行测试变得简单。

要运行整个测试套件:

gradlew test

要运行单个/特定测试:

gradlew -Dtest.single=testName test

注意:MavenGradle是他们自己的产物——此处显示的内容很少涵盖基础知识。如果您想了解更多信息,请查阅他们的文档。

继续进行单元测试

我们的示例遍历了非常简单的代码段,当然,这仅仅是单元测试的开始。更复杂的方法调用数据库或其他方法,但是要保证功能性,我们需要隔离,这是通过模拟实现的。模拟可帮助我们隔离代码单元,以集中精力进行验证(通常用于模拟的框架为MockitoPowerMock)。要了解有关模拟的更多信息,请阅读另一篇文章:如何自动执行Java单元测试,包括模拟和断言

因此,如果单元测试是如此惊人,那么为什么每个人都不赞呢吧,单元测试并不容易实现。这需要大量的开发技能和时间,开发人员往往不太喜欢它,并且需要花时间和精力来维护测试套件。

但是单元测试的好处很明显:

  • 隔离和重点测试
  • 确保单个方法或方法片段的行为
  • 帮助确保添加或修改代码不会破坏应用程序
  • 边界分析——检查无效/不良输入
  • 测试方法的各个方面(覆盖率)
  • 覆盖范围

因此,部署强大的单元测试工具(如Parasoft Jtest)很有用,该工具可以解决与JUnits相关的许多问题,并节省开发人员宝贵的时间。Parasoft Jtest的单元测试助手费时费力为用户提供了使用直观的一键式操作创建测试的指南,从而减少了JUnit测试的生成时间。通过自动建议来解决可维护性,这些建议可以识别不稳定的测试环境(和其他风险)、断言建议等内容。

要了解有关如何减轻痛苦和提高单元测试的更多信息,请下载Parasoft Jtest单元测试助手的免费试用版。它是免费的,易于设置,您可以按照此处的所有教程进行操作,以快速入门。

JUnit教程:设置,编写和运行Java单元测试

标签:

来源:慧都

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年11月8日
下一篇 2020年11月8日

相关推荐

发表回复

登录后才能评论