在Java程序中基于JUnit的全局单元测试程序

而每个程序模块内又含有众多的单元测试,此时如果程序员还每次都手工跑单元测试的话,工作量将是巨大的,而且这是种无聊的重复性工作。本文将介绍一个基于 J">Unit 的全局单元测试程序,程序员只需要执行一个文件,就能将整个工程内所有的单元测试文件都自动执行,从而节约了程序员宝贵的时间,提高软件产品开发进度。

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

loadAllClassesName 方法将会找到工程集中所有的 Class 文件名的集合,filterClassNameList 将会对找到的 Class 文件集合进行过滤,过滤条件是针对文件名称。loadAllTestClass 则会找到所有符合条件的 JUnitTest Class 集合。

时间: 2024-08-25 01:28:10

在Java程序中基于JUnit的全局单元测试程序的相关文章

基于JUnit的全局单元测试程序

背景介绍 最近参与了一个新产品的研发工作.新产品是采用模块式开发方式,拥有众多的功能模块,每一个模块 是一个独立的 Java 工程.在产品中,为了保证各个模块的功能,目前其都有相应的 JUnit 测试程序.随着产品功能的逐 渐完善,我们发现,程序中光是 JUnit Test 测试文件,全部加起来已经有几百个.由于这些文件分布在几十个不同的工程 不同的子目录结构中,目前并没有很好的工具可以将所有的单元测试一次运行.而手工的运行这些单元测试是非常繁琐的, 对程序员来说是浪费时间的:又或者可以用脚本完

Java 程序中的多线程

程序|多线程 在Java程序中使用多线程要比在 C 或 C++ 中容易得多,这是因为 Java 编程语言提供了语言级的支持.本文通过简单的编程示例来说明 Java 程序中的多线程是多么直观.读完本文以后,用户应该能够编写简单的多线程程序. 为什么会排队等待? 下面的这个简单的 Java 程序完成四项不相关的任务.这样的程序有单个控制线程,控制在这四个任务之间线性地移动.此外,因为所需的资源 - 打印机.磁盘.数据库和显示屏 -- 由于硬件和软件的限制都有内在的潜伏时间,所以每项任务都包含

在Java程序中内嵌Mozilla浏览器

简介 SWT 浏览器部件是 SWT 所提供的众多部件中较为复杂的一个,它提供了在 Java 应用程序中内嵌浏览器应用并通过 Java API 与之进行交互的能力.一个 典型的应用场景是,开发者可以在客户段程序中嵌入一个内置浏览器,访问特定 HTML 应用,从而集 web 技术与客户端技术两者之所长,开发出具有更丰富功能 和界面的软件. 本文主要包含两个方面的内容:1. 如何在 Java 应用程序中内嵌基于 Mozilla 的浏览器部件.2. 使用 JavaXPCOM bridge 定制浏览器功能

介绍在Java程序中记录日志的最佳实践

本文介绍了在Java程序中记录日志的最佳实践,同时也介绍了如何使用开源软件对日志进行聚合和分析.对于现在的应用程序来说,日志的重要性是不言而喻的.很难想象没有任何日志记录功能的应用程序运行在生产环境中.日志所能提供的功能是多种多样的,包括记录程序运行时产生的错误信息.状态信息.调试信息和执行http://www.aliyun.com/zixun/aggregation/18195.html">时间信息等.在生产环境中,日志是 查找问题来源的重要依据.应用程序运行时的产生的各种信息,都应该通

java开发中基于JDBC连接数据库实例总结_java

本文实例讲述了java开发中基于JDBC连接数据库的方法.分享给大家供大家参考,具体如下: 创建一个以JDBC连接数据库的程序,包含7个步骤:   1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String  className)实现. 例如: try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ;

在Java程序中运行外部类文件

程序 在Java程序中运行外部类文件 一.引言无论是用传统的编程语言(C++.VB等)还是Java语言编程,都经常需要在一个运行的程序中执行另外一个独立的外部程序.例如用Java设计一个IDE程序,那么这个IDE程序就必需能够调式.运行其它独立的外部Java程序.况且直接运行已经存在的外部程序来实现本程序的某些特定的功能,也是提高程序开发效率的一种重要手段.Java2为实现在一个Java程序中运行外部类文件(即Java程序)提供了的两种解决方案,即在同一进程中运行外部类文件和在不同进程中运行外部

java程序中双重检查锁定与延迟初始化

在java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化.此时程序员可能会采用延迟初始化.但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出现问题.比如,下面是非线程安全的延迟初始化对象的示例代码: public class UnsafeLazyInitialization { private static Instance instance; public static Instance getInstance() { if (instanc

教你怎样在java程序中引入neo4j数据库

随着关系型数据库在某些方面的力不从心,了解当下流行的各种数据库模式的特点和性能,无疑会给我们提供更多的选择和方向. neo4j是一种图形数据库,在遍历和关联查询方面具有突出的优势.废话少说,深入了解neo4j之前,先让我们尝试一下怎样在程序中使用neo4j. neo4j采用java语言开发,如果我们要在java程序中以内嵌方式使用neo4j,只需导入neo4j的对应包即可. 首先,我们来创建一个maven项目并修改pom.xml添加对neo4j的依赖. <?xml version="1.0

Java程序中的配置文件的存放和读取

大家可能经常会遇到在Java程序中存取程序配置文件的需求,比如,为了能够 和不同的数据库连接,我们经常把数据库连接的信息存放到属性文件中,这些信 息一般包括数据库驱动程序类名.数据库连接的URL,数据库的用户名和口令等等 .为了便于程序的安装或部署,我们经常会把这些的配置文件存放到程序安装的 根目录中.由于Java程序用包来分组类,有时候将这些配置文件放入到读取它们 的类所在的包目录中会更好一些.比如,在下面的图示中,将数据库配置文件 database.properties放到数据库读取类所在的