Welcome 微信登录

首页 / 软件开发 / JAVA / 基于JUnit的全局单元测试程序

基于JUnit的全局单元测试程序2013-09-20 IBM 方晓琴, 吴邻燕, 赵娜背景介绍

最近参与了一个新产品的研发工作。新产品是采用模块式开发方式,拥有众多的功能模块,每一个模块 是一个独立的 Java 工程。在产品中,为了保证各个模块的功能,目前其都有相应的 JUnit 测试程序。随着产品功能的逐 渐完善,我们发现,程序中光是 JUnit Test 测试文件,全部加起来已经有几百个。由于这些文件分布在几十个不同的工程 不同的子目录结构中,目前并没有很好的工具可以将所有的单元测试一次运行。而手工的运行这些单元测试是非常繁琐的, 对程序员来说是浪费时间的;又或者可以用脚本完成运行所有测试文件的目的,但是由于我们采取的是敏捷开发的模式, JUnit Test 测试集合会不断的持续增长,每增加一个 JUnit Test 文件,就需要立即修改脚本;一旦忘记修改,这个新加 的测试文件可能就无法被执行可见,用脚本来执行测试文件也并不是很好的手段,依然给我们的开发带来额外工作。这里我 们有了一个想法,做一个全局的单元测试程序,去自动的检索工程集中所有的 JUnit Test 测试程序。这个全局单元测试程 序将基于 JUnit4 去运行。

核心机制:JUnit4 支持一次运行多个测试程序

首先我们要了解 JUnit4 支持多 个 Class 集合作为输入,并且调用 org.junit.runner.Runner.run() 方法运行输入的测试类集合。JUnit4 中已经定义了 一些默认的 Runner,可以分别处理不同的输入类集合:比如 BlockJUnit4ClassRunner,就是默认处理带有 @Test 的 JUnit4 测试类的运行器;Suite,可以处理兼容 JUnit3 的测试类的运行器,等等。

我们可以来看下面的 Runner 结构图:

图 1. JUnit Runner 结构图

Runner 类定义了运行测试用例的接口, Suite 类继承自 Runner 类,Suite 类支持 JUnit3 风格的测试类,可以用来执行多个测试用例。因此我们的想法是,自定 义一个继承自 Suite 类的 Runner,就是上图中得 AllClassRunner 类。这个 Runner 的输入将是工程集中所有找到的 JUnit Test Class 集合,这样就可以一次运行工程中不同工程不同目录下的所有 JUnit Test 文件了。下面是我们的 AllClassRunner 类的代码:

清单 1. AllClassRunner 类的代码

public class AllJunitTestRunner extends Suite {public AllJunitTestRunner(Class<?> clazz, RunnerBuilder builder) throwsInitializationError { // 调用父类 Suite 方法直接运行所有符合要求的 JUnit Test 对象super(builder, clazz, loadAllTestClass(filterClassNameList (clazz, loadAllClassesName(clazz))));} }
loadAllClassesName 方法将会找到工程集中所有的 Class 文件名的集合,filterClassNameList 将会对找到 的 Class 文件集合进行过滤,过滤条件是针对文件名称。loadAllTestClass 则会找到所有符合条件的 JUnitTest Class 集合。

如何找到所有的需要的 JUnit Test 测试类集合

我们来看下面的流程图:

图 2. 找到需要的 JUnit Test Class 对象集合的流程图