《JUnit实战(第2版)》—第2章2.1节探索JUnit核心-阿里云开发者社区

开发者社区> 开发与运维> 正文

《JUnit实战(第2版)》—第2章2.1节探索JUnit核心

简介:

本节书摘来自异步社区《JUnit实战(第2版)》一书中的第2章2.1节探索JUnit核心,作者【美】Petar Tahchiev , Felipe Leme , Vincent Massol , Gary Gregory,更多章节内容可以访问云栖社区“异步社区”公众号查看。

第2章 探索JUnit的核心
JUnit实战(第2版)
Mistakes are the portals of discovery.

错误是发现之门。

—James Joyce

本章重点

使用核心JUnit类
理解JUnit的机制
理解JUnit的生命周期
在第1章中,我们已经明确了我们需要一种可靠的、可复用的方法来测试我们的程序。我们的解决方案就是编写或复用一个框架来驱动测试代码,以测试程序的API。因为我们的程序对现有的类增加了新的类、新的方法,所以我们也需要增加相应的测试代码。经验告诉我们,有时候类会以意想不到的方式相互作用,所以我们很有必要确保我们能够在任何时间运行所有的测试,无论代码发生了什么修改。现在的问题是,我们如何才能运行多个测试类?并且我们如何才能搞清楚哪些测试通过了,而哪些测试失败了?

在这一章中,我们将深入讨论JUnit是如何提供各种功能来解决以上这些问题的。我们首先介绍了JUnit的核心概念—测试类、测试集和测试运行器(test runner),然后我们进一步介绍了各种核心测试运行器和测试集,随后再来看一下我们的老朋友测试类,最后我们将观察这些核心类是如何共同工作的。

而在下一章中,我们将使用一个应用程序示例来展示如何使用这些JUnit的核心概念。而且,我们还阐述了编写和组织测试代码的最佳做法。

2.1 探索JUnit核心
JUnit实战(第2版)
第1章中的CalculatorTest程序,如代码2.1所示,定义了一个测试类,它包含了一个单独的测试方法testAdd。

定义一个测试类的要求是,这个类必须是公共的并且包含了一个无参数的构造函数。在我们的示例中,因为我们没有定义任何其他构造函数,所以我们也不需要定义无参数的构造函数;Java会为我们隐式地创建它。

创建一个测试方法的要求是,这个方法必须使用@Test注释,是公共的,不带任何参数,并且返回void类型。


e34114504acb1663de28a6ce829b932a2bfdf3a7

JUnit在调用(执行)每个@Test方法之前,为测试类创建一个新的实例。这有助于提供测试方法之间的独立性,并且避免在测试代码中产生意外的副作用。因为每个测试方法都运行于一个新的测试类实例上,所以我们就不能在测试方法之间重用各个实例变量值。

为了进行测试验证,我们使用了由JUnit的Assert类提供的assert方法。正如你在之前的示例中所看到的那样,我们在测试类中静态地导入这些方法。另外,根据我们对静态导入的喜好,我们还可以导入JUnit的Assert类本身。表2.1列出了一些最流行的assert方法。


8734a7a7e4b164fa728b8fd62761048524905e9e

当你需要一次运行多个测试类时,你就要创建另一个叫做测试集(test suite或Suite)的对象。你的测试集也是一个特定的测试运行器(或者Runner),因此可以像运行测试类那样运行它。一旦你理解了测试类、Suite与Runner是如何工作的,你就可以编写你所需要的任何测试了。这3个对象形成了JUnit框架的核心。

在日常工作中,你只需要编写测试类与测试集,其他类会在幕后帮你完成测试。

DEFINITION 测试类

(Test class或TestCase或test case)—一个包含一个或者多个测试的类,而这些测试就是指那些用@Test注释的方法。使用一个测试类,可以把具有公共行为的测试归入一组。在本书的后续部分中,如果我们提到测试的时候,我们指的是一个用@Test注释的方法;如果我们提到一个测试用例(或测试类),我们指的是一个包含了这些测试方法的类,也就是一组测试。通常在生产类和测试类之间都存在着一对一的对应关系。
测试集(Suite或者test suite)—一组测试。测试集是一种把多个相关测试归入一组的便捷方式。比如,如果你没有为测试类定义一个测试集,那么JUnit会自动提供一个测试集,包含测试类中所有的测试(在后面的章节中会详细介绍)。一个测试集通常会将同一个包中的测试类归入一个组。

测试运行器(Runner或test runner)—执行测试集的程序。JUnit提供了多种运行器来执行你的测试。本章随后会介绍这些运行器,并且教你如何编写自己的测试运行器。

让我们来看一看JUnit核心对象的具体职责,如表2.2所示。

表2.2 JUnit核心对象


83f90b706cf3262a888790da642b53b6ec77dc75

接下来,我们要详细说明一下表2.2中列出的但我们此前还没有见到过的对象:测试运行器Runner与测试集Suite对象。

要运行一个基础的测试类,你不需要做什么特别的工作;JUnit会代替你使用一个测试运行器(test runner)来管理你的测试类的生命周期,包括创建类、调用测试以及搜集结果。后面的章节将会涉及一些情况,要求你创建的测试能以一种特殊的方式运行。其中的一种情况可以缓解创建测试时经常碰到的一个问题:调用输入不同的测试。在介绍JUnit提供的其他测试运行器之前,我们先在下一节中通过实例来讨论这个特殊情况。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

版权声明:本文首发在云栖社区,遵循云栖社区版权声明:本文内容由互联网用户自发贡献,版权归用户作者所有,云栖社区不为本文内容承担相关法律责任。云栖社区已升级为阿里云开发者社区。如果您发现本文中有涉嫌抄袭的内容,欢迎发送邮件至:developer2020@service.aliyun.com 进行举报,并提供相关证据,一经查实,阿里云开发者社区将协助删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章