`

Junit4.7之rule

阅读更多
Junit4的变化还是挺大的,在4.7版本中有引入了另一特性,那就是Rule。总的来说,Rule是Junit的一种扩展机制。规则可以很灵活的添加或重新定义每个测试方法或类的行为,测试人员能重新利用或扩展junit提供的规则,也可以定义自己的规则。
http://www.infoq.com/cn/news/2009/07/junit-4.7-rules列举过有关的junit提供的规则或4.7的变化:
    *  TemporaryFolder:测试可以创建文件与目录并且会在测试运行结束后将其删除。这对于那些与文件系统打交道且独立运行的测试来说很有用。其实这个功能不常用,但有时候的确又会用到,Rule本身的定为就是为了那些有着复杂要求的测试而准备的。不过使用起来并不复杂:
 @Rule
	public TemporaryFolder folder = new TemporaryFolder();
	
	@Test
	public void shouldLoadFromPropertiesFile() throws IOException {
		File createdFile= folder.newFile("myfile.txt");
		File createdFolder= folder.newFolder("subfolder");
	}

不过需要注意的是,不能在@Before注释的方法内创建文件或文件夹,如果这样,测试完后,并不会删除相应的文件或文件夹,这也让本人郁闷了一些时间才发现的。

    * ExternalResource:这是一种资源使用模式,它会提前建立好资源并且会在测试结束后将其销毁。这对于那些使用socket、嵌入式服务器等资源的测试来说很有用。
    * ErrorCollector:可以让测试在失败后继续运行并在测试结束时报告所有错误。这对于那些需要验证大量独立条件的测试来说很有用(尽管这本身可能是个“test smell”)。见下:
@Rule
public ErrorCollector collector= new ErrorCollector();
	
	@Test
	public void example() {
		collector.addError(new Throwable("first thing went wrong"));
		collector.addError(new Throwable("second thing went wrong"));
		collector.checkThat(6, is(5));
		collector.checkThat(5, is(4));
	}
	
	@Test
	public void noErrorCollector(){
		Assert.assertThat(6, is(5));
		Assert.assertThat(4, is(5));
	}

正常情况下,测试一旦遇见错误,就会终止测试,像noErrorCollector方法一样,不过example方法就不一样,即使遇见错误,它也会把方法剩下的代码执行完。
    * ExpectedException:可以在测试中指定期望的异常类型与消息。以前已经可以在@Test的expected中指定需要抛出的异常,但是不能验证message,因此此功能得到了进一步的完善,而且此规则可以重复利用。
    * Timeout:为类中的所有测试应用相同的超时时间。
    * Verifier:ErrorCollector之类的Rule的基类,即使验证失败,测试也能通过。
    * TestWatchman:那些观测测试的运行而不会对结果进行修改的Rule的基类。
    * 匹配器(matcher)的一些变化,关于匹配,主要依赖于Hamcrest 1.2,虽然有集成了hamcrest核心的junit混合包,但此包并没有完全集成hamcrest,所以有些方法不能使用,如Assert.assertThat等,所以建议使用junit4.7独立的包,然后再从外部添加hamcrest-all.jar包。
    * 显示超时测试的堆栈信息;这有助于诊断超时的原因。
    * 改进了javadoc并修复了几个bug。

经过4.7版本后,junit的功能得到了进一步的增强,但也开始变得有点复杂了,希望以后还是少添加点功能吧,这样就不用天天关注这些新功能了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics