天天看点

《JUnit实战(第2版)》—— 2.4 用Suite来组合测试

本节书摘来异步社区《junit实战(第2版)》一书中的第2章,第2.4节,作者:【美】petar tahchiev , felipe leme , vincent massol , gary gregory,更多章节内容可以访问云栖社区“异步社区”公众号查看。

junit实战(第2版)

因为是一个简单的测试,所以你可以直接编译如代码2.1所示的简单的计算器测试程序,并把它交给控制台façade运行器,如下所示:

《JUnit实战(第2版)》—— 2.4 用Suite来组合测试

如果类路径配置正确的话,那么测试应当顺利运行。这非常简单—至少运行这么一个单独的测试用例是非常简单的。

下一步就是运行多个测试类。为了简化这个任务,junit提供了测试suite。这个suite是一个容器,用来把几个测试归在一起,并把它们作为一个集合一起运行。

junit设计suite的目的就是为了运行一个或者多个测试用例。测试运行器会启动suite;然后运行哪个测试用例是由suite来决定的。

你可能会疑惑,在第1章最后给出的那个示例中,你并没有定义一个suite,这个示例是如何运行起来的呢?为了使简单的事情可以保持简单,如果你没有提供一个自己的suite,那么测试运行器会自动创建一个suite。

默认的suite会扫描你的测试类,找出所有以@test注释的方法。默认的suite会在内部为每个@test方法创建一个测试类的实例。然后junit就会独立地执行每个@test方法,以避免潜在的负面影响。

如果你想将另一个测试添加到calculatortest类,比如testsubtract,同时你使用@test注释这个测试,那么默认的suite就会自动包含这个测试。

suite对象其实是一个runner,可以执行测试类中所有@test注释的方法。

代码2.3显示了如何将多个测试类组合成一个单独的测试集(test suite)。

代码2.3 将测试类组合为一个suite

《JUnit实战(第2版)》—— 2.4 用Suite来组合测试

在代码2.3中,我们使用@runwith注释指定了相应的运行器..lucene实战1.tif,并且通过在@suiteclasses注释中指定测试类,来列出我们想要在这个测试中包含的所有测试..lucene实战2.tif。这些测试类中的所有@test方法都将包含到该suite中。

对于代码2.1中的calculatortest而言,默认的suite可以用以下代码来表示:

《JUnit实战(第2版)》—— 2.4 用Suite来组合测试

由于junit采用了一种精妙的构建方式,所以使用junit来创建一组测试集也就成为了可能。例如,代码2.4串联了几个不同的文件,以展示多个测试用例是如何组合成多个测试集,然后这些测试集又组合成了一个主测试集。

代码2.4 一组测试集

《JUnit实战(第2版)》—— 2.4 用Suite来组合测试

为了简化这个示例,我们的测试集testsuitea与testsuiteb分别只有一个测试用例。而真正的测试集应该包含多个测试类,就像我们的主测试集。

你可以运行这段代码中的任何一个类,比如一个junit测试、两个测试类中的任意一个、两个测试集中的任意一个,甚至是主测试集。图2.2展示了在eclipse中运行主测试集后的结果。

《JUnit实战(第2版)》—— 2.4 用Suite来组合测试

测试集提供了一种强有力的组织测试的方式。当然,这种便利性并非junit独有,在下一小节中你将会看到,其他工具也具有这样的功能,这将使我们重新考虑任何junit测试集的创建。

ant与maven也提供了运行多组测试类和测试集的功能,你可以通过正则表达式的类型、要运行的测试类和测试集的名称来指定运行哪些测试类和测试集。另外,有些ide(比如eclipse)允许你在某个指定的包或者源代码目录中运行所有的测试类与suite。这足以让我们重新考虑是否值得在最初的地方创建junit的suite。

当然,如果你想在java环境中组织你的测试,而不依赖于你的构件系统能力,那么junit的suite是非常有用的。因为一般情况下构建系统都是由专门的人员或者团队来维护,而不是开发者自己。同样,你可能不希望依赖于任何指定的ide以及它的junit集成能力。

继续阅读