2.1 探索JUnit核心
JUnit实战(第2版)
第1章中的CalculatorTest程序,如代码2.1所示,定义了一个测试类,它包含了一个单独的测试方法testAdd。
定义一个测试类的要求是,这个类必须是公共的并且包含了一个无参数的构造函数。在我们的示例中,因为我们没有定义任何其他构造函数,所以我们也不需要定义无参数的构造函数;Java会为我们隐式地创建它。
创建一个测试方法的要求是,这个方法必须使用@Test注释,是公共的,不带任何参数,并且返回void类型。
代码2.1 CalculatorTest测试用例
JUnit在调用(执行)每个@Test方法之前,为测试类创建一个新的实例。这有助于提供测试方法之间的独立性,并且避免在测试代码中产生意外的副作用。因为每个测试方法都运行于一个新的测试类实例上,所以我们就不能在测试方法之间重用各个实例变量值。
为了进行测试验证,我们使用了由JUnit的Assert类提供的assert方法。正如你在之前的示例中所看到的那样,我们在测试类中静态地导入这些方法。另外,根据我们对静态导入的喜好,我们还可以导入JUnit的Assert类本身。表2.1列出了一些最流行的assert方法。
表2.1 JUnit断言方法示例
当你需要一次运行多个测试类时,你就要创建另一个叫做测试集(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核心对象
接下来,我们要详细说明一下表2.2中列出的但我们此前还没有见到过的对象:测试运行器Runner与测试集Suite对象。
要运行一个基础的测试类,你不需要做什么特别的工作;JUnit会代替你使用一个测试运行器(test runner)来管理你的测试类的生命周期,包括创建类、调用测试以及搜集结果。后面的章节将会涉及一些情况,要求你创建的测试能以一种特殊的方式运行。其中的一种情况可以缓解创建测试时经常碰到的一个问题:调用输入不同的测试。在介绍JUnit提供的其他测试运行器之前,我们先在下一节中通过实例来讨论这个特殊情况。