`

打造自己的单元测试容器——Junit Runner扩展举例

    博客分类:
  • Test
阅读更多
最近对java的annotation和junit的Runner深入学习了一把, 下面是在实际项目中结合二者的一个实战。
应用场景是这样的: 我有一个测试工具类(DataGenerator)用来帮助初始化测试数据和清除测试数据。该工具类需要两个配置文件, 一个是数据源的配置文件, 一个是用来初始化数据的excel数据表, 我希望通过借助java的annotation和自定义Runner来实现这个功能。 于是我写了下面的两个类, 一个是annotation类:
@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.TYPE})
public @interface DataGeneratorConfig {
	/**
	 * jdbc配置文件
	 * 
	 * @return
	 */
	String dbConfig() default "db.config";

	/**
	 * excel文件列表
	 * 
	 * @return
	 */
	String[] excelFiles() ;
}

很明显, 该类就是用来获取配置文件信息的。接下来是在junit运行起来之后, 且在执行测试方法之前根据配置文件初始化一些数据, 于是我从JUnit4ClassRunner继承, 写了下面的类:
public class DataGeneratorJUnit4ClassRunner extends JUnit4ClassRunner {

	public DataGeneratorJUnit4ClassRunner(Class<?> clazz)
			throws InitializationError {
		super(clazz);
	}

	@Override
	public void run(RunNotifier notifier) {
		// 在运行前对DataGenerator进行初始化
		initGenerator();
		super.run(notifier);
	}

	/**
	 * 初始化DataGenerator
	 */
	private void initGenerator() {
		Class<?> clazz = getTestClass().getJavaClass();
		while (clazz != null) {
			DataGeneratorConfig annotation = clazz
					.getAnnotation(DataGeneratorConfig.class);

			if (annotation != null) {
				String dbConfig = annotation.dbConfig();
				String[] excelFiles = annotation.excelFiles();

				try {
					DataGenerator.initCache(getAbsoluteExcelPaths(excelFiles),
							getAbsolutePath(dbConfig));
				} catch (Exception e) {
					throw new RuntimeException("使用注解初始化DataGenerator失败", e);
				}
				break;
			}

			clazz = clazz.getSuperclass();
		}
	}

	/**
	 * 取得excel文件绝对路径
	 * @param excelPaths
	 * @return
	 */
	private String[] getAbsoluteExcelPaths(String[] excelPaths) {
		String[] realPaths = new String[excelPaths.length];
		for (int i = 0; i < excelPaths.length; i++) {
			realPaths[i] = getAbsolutePath(excelPaths[i]);
		}
		return realPaths;
	}

	/**
	 * 根据文件名取得文件绝对路径
	 * 
	 * @param fileName
	 * @return
	 */
	private String getAbsolutePath(String fileName) {
		return DataGeneratorJUnit4ClassRunner.class.getClassLoader().getResource(fileName)
				.getFile();
	}
}

就这样我就可以借助annotation来完成初始化了, 在需要用到DataGenerator的testcase, 我可以这样写:
@RunWith(DataGeneratorJUnit4ClassRunner.class)
@DataGeneratorConfig(dbConfig = "config.properties", excelFiles = "xxx/yyy.xls")

就这么简单, 再也不需要写java代码来进行初始化了, 通过配置就可以搞定
小结
如果你有一些特殊的测试工具需要与Junit结合的话, 一般都可以通过定制自己的Junit Runner加入进来.比如这里将DataGenerator与Junit整合, spring也是一个很好的例子, 他就是在junit的Runner中完成了spring的ApplicationContext初始化工作, 而不需要我们手动来处理.
分享到:
评论
1 楼 davice_li 2013-07-13  
DataGenerator.initCache(getAbsoluteExcelPaths(excelFiles), 
                            getAbsolutePath(dbConfig));
DataGenerator   文件在那里?导入工程找不到呢

相关推荐

    软件单元测试——JUnit使用

    "软件单元测试——JUnit使用" 软件单元测试是软件开发过程中的一种测试方法,它是指对软件中的最小单元进行测试,以确保软件的可靠性和正确性。JUnit是一个流行的Java测试框架,广泛应用于软件单元测试中。 在本...

    单元测试之道Java版——使用Junit

    在Java世界里,Junit是广泛使用的单元测试框架,它为开发者提供了方便、高效的测试工具。本篇文章将深入探讨如何利用Junit进行单元测试,并分享一些最佳实践。 首先,我们需要了解什么是单元测试。单元测试是对软件...

    Junit 单元测试完整案例

    【Junit单元测试完整案例】深入解析 在软件开发中,单元测试是验证代码功能是否正确、独立单元是否按预期工作的关键步骤。Junit作为Java领域最常用的单元测试框架,为开发者提供了简单易用的API来进行测试。本案例...

    自动饮料机Junit测试(软件测试与质量保证实验).rar

    本实验“自动饮料机Junit测试”旨在帮助学生深入理解和应用单元测试,特别是在Java编程环境下。单元测试是一种针对程序代码最小可测试单元进行验证的方法,通常这个单元是函数或方法。Junit是Java领域广泛使用的单元...

    Java单元测试JUnit4.7

    8. **扩展性**:JUnit支持扩展,可以通过编写自己的测试装饰器或监听器来自定义测试行为。 在实际使用中,开发人员通常会结合构建工具如Maven或Gradle,以及IDE如Eclipse、IntelliJ IDEA来运行JUnit测试。这些工具...

    Junit单元测试文档

    junit3 junit4 api,单元测试的利器

    Eclipse安装插件——junit

    为了进一步增强其功能,Eclipse支持安装各种插件,Junit是其中一个非常重要的插件,用于进行单元测试。 Junit是Java编程语言的一个开源测试框架,由Ernst Kuipers和Kent Beck在早期版本的JUnit基础上发展起来的。它...

    单元测试代码以及junit使用介绍

    5. 容器测试:JUnit还支持测试套件(@Suite),可以组合多个测试类或测试方法一起运行,方便进行大规模的测试。 6. 插件与扩展:JUnit具有良好的可扩展性,可以通过JUnit扩展如TestWatcher、Rule等来实现自定义的...

    在Eclipse中使用JUnit4进行单元测试

    在Eclipse中使用JUnit4进行单元测试是一种常见的Java开发实践,它可以帮助开发者确保代码的正确性和稳定性。单元测试是软件开发中的重要环节,通过编写针对代码各个独立模块的测试用例,可以验证代码功能是否按预期...

    JavaSE测试类必备的两个jar包 ——junit-4.12.jar、hamcrest-core-1.3.jar

    此外,JUnit还支持异常测试、参数化测试、假设测试等功能,极大地简化了单元测试的编写过程。 接下来是`hamcrest-core-1.3.jar`,这是一个匹配对象的库,它是JUnit扩展的一个重要部分。Hamcrest提供了一组丰富的...

    单元测试之道Java版使用JUnit

    JUnit 5引入了新的测试引擎和扩展机制,使得测试更加灵活,比如参数化测试、条件测试、异步测试等。 总的来说,掌握JUnit对于Java开发者来说至关重要,它可以帮助我们在编码阶段发现和修复问题,提高代码质量,减少...

    ALevin配置环境所需要的基础包——JUnit

    ALevin配置环境所需要的基础包——JUnit5.8.2版 适合人群: 对虚拟网络嵌入算法感兴趣的人 能学到什么: 可以帮助大家更快的配置好ALevin运行环境 阅读建议: ALevin作为一个很好的虚拟网络仿真平台,它的开源给我们...

    spring MVC junit 单元测试(controller)

    这篇博客主要探讨了如何使用JUnit进行Spring MVC Controller的单元测试。在实际开发中,单元测试可以帮助我们尽早发现潜在的问题,提高软件的可靠性和可维护性。 首先,让我们了解Spring MVC的基本概念。Spring MVC...

    SpringJUnit4ClassRunner 单元测试

    单元测试—— Spring 环境下测试,所需要的jar包: spring-test-4.3.29.RELEASE.jar、junit-4.13.1.jar、hamcrest-core-1.3.jar。

    软件测试技术JUnit和单元测试入门简介

    JUNIT软件测试软件测试技术JUnit和单元测试入门简介软件测试1、几个相关的概念白盒测试——把测试对象看作一个打开的盒子,程序内部的逻辑结构和其他信息对测试人员是公开的。回归测试——软件或环境的修复或更正后...

    junit单元测试实验

    junit单元测试实验 JUnit是Java语言中一种流行的单元测试框架,它可以帮助开发者编写稳健、可靠的代码。本文将通过一个经典的案例,讲解如何使用JUnit结合Eclipse进行单元测试。 知识点1:什么是单元测试 单元...

    Junit4单元测试必备入门教程

    JUnit4单元测试必备入门教程 JUnit4概述 -------- JUnit4是JUnit框架有史以来最大的改进,其主要目标是利用Java5的Annotation特性简化测试用例的编写。Annotation是一种元数据,用于描述数据。在Java中可以用来和...

Global site tag (gtag.js) - Google Analytics