`

打造自己的单元测试容器——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   文件在那里?导入工程找不到呢

相关推荐

Global site tag (gtag.js) - Google Analytics