-
TemporaryFolder
TemporaryFolder
作为Rule,可以运行在测试过程中创建临时文件或者临时目录,当测试结束后,框架会自动删除。见实例:
public static class HasTempFolder { @Rule public TemporaryFolder folder = new TemporaryFolder(); @Test public void testUsingTempFolder() throws IOException { File createdFile = folder.newFile("myfile.txt"); File createdFolder = folder.newFolder("subfolder"); // ... } }
-
TemporaryFolder#newFolder(String... folderNames)
可以根据输入的参数创建目录。如果是多级目录,可以递归创建。 -
TemporaryFolder#newFile()
可以创建一个随机名字的临时文件; -
TemporaryFolder##newFolder()
可以创建一个随机名字的临时目录。
-
-
ExternalResource
ExternalResource
可以设置测试前后需要做的事情(比如:文件、socket、服务、数据库的连接与关闭)。见实例:
public static class UsesExternalResource { Server myServer = new Server(); @Rule public ExternalResource resource = new ExternalResource() { @Override protected void before() throws Throwable { myServer.connect(); }; @Override protected void after() { myServer.disconnect(); }; }; @Test public void testFoo() { new Client().run(myServer); } }
-
ExternalResource#before
会在每个测试之前处理;#after
会在每个测试之后处理; - 关于
ExternalResource
与@Before
已经@After
等标记步骤的执行顺序,我们会在本文后面部分介绍。
-
-
ErrorCollector
ErrorCollector
这个Rule,在出现一个错误后,还可以让测试继续进行下去。他提供三个方法:
checkThat(final T value, Matcher<T> matcher) checkSucceeds(Callable<Object> callable) addError(Throwable error)
前面两个是用来处理断言的,最后一个是添加错误至错误列表中。
看下面例子:
package mytest; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import java.util.concurrent.Callable; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ErrorCollector; public class JUnitCoreErrorControllerRuleTest { private final int multiplesOf2[] = { 0, 2, 4, 7, 8, 11, 12 }; @Rule public ErrorCollector errorCollector = new ErrorCollector(); /* * 下面这个测试,会报告两个failures。这一点和下面的checkSucceeds测试不同 */ @Test public void testMultiplesOf2() { int multiple = 0; for (int multipleOf2 : multiplesOf2) { // Will count the number of issues in this list // - 3*2 = 6 not 7, 5*2 = 10 not 11 : 2 Failures errorCollector.checkThat(2 * multiple, is(multipleOf2)); multiple++; } } /* * 下面代码中有两个断言会失败,但每次运行JUnit框架只会报告一个。这一点和上面的checkThat测试不同,可以对比一下。 */ @Test public void testCallableMultiples() { errorCollector.checkSucceeds(new Callable<Object>() { public Object call() throws Exception { assertThat(2 * 2, is(5)); assertThat(2 * 3, is(6)); assertThat(2 * 4, is(8)); assertThat(2 * 5, is(9)); return null; } }); } /* * 下面运行时,会报告2个错误 */ @Test public void testAddingAnError() { assertThat(2 * 2, is(4)); errorCollector.addError(new Throwable("Error Collector added an error")); assertThat(2 * 3, is(6)); errorCollector.addError(new Throwable( "Error Collector added a second error")); } }
运行结果,类似下面:
Failed tests: testCallableMultiples(mytest.JUnitCoreErrorControllerRuleTest): Expected: is <5> but: was <4> testMultiplesOf2(mytest.JUnitCoreErrorControllerRuleTest): Expected: is <7> but: was <6> testMultiplesOf2(mytest.JUnitCoreErrorControllerRuleTest): Expected: is <11> but: was <10> Tests in error: testAddingAnError(tangzhi.mytest.JUnitCoreErrorControllerRuleTest): Error Collector added an error testAddingAnError(tangzhi.mytest.JUnitCoreErrorControllerRuleTest): Error Collector added a second error
从这个例子,可以看出:
-
ErrorCollector#checkThat
会报告测试中的每一个failures -
ErrorCollector#checkSucceeds
只会检查是否成功,如果不成功,只报告第一个导致不成功的failure -
ErrorCollector#addError
是添加一个错误(error)。
-
-
Verifier
如果,你想在每个测试之后,甚至是在
@After
之后,想检查些什么,就可以使用Verifier
这个Rule.看例子:
private static String sequence; public static class UsesVerifier { @Rule public Verifier collector = new Verifier() { @Override protected void verify() { sequence += " verify "; } }; @Test public void example() { sequence += "test"; } @Test public void example2() { sequence += "test2"; } @After public void after() { sequence += " after"; } } @Test public void verifierRunsAfterTest() { sequence = ""; assertThat(testResult(UsesVerifier.class), isSuccessful()); assertEquals("test after verify test2 after verify ", sequence); }
从上面例子可以看出:
Verifier#verify
针对每个测试都会运行一次,并且运行在@After
步骤之后。需要说明:如果某测试出现失败(fail),那么这个测试之后就不会做
verify
,这一点,可以结合下面的例子看出。 -
TestWatcher
对测试的每个步骤进行监控。
看例子:
package tangzhi.mytest; import static org.junit.Assert.*; import static org.hamcrest.CoreMatchers.*; import org.junit.After; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestRule; import org.junit.rules.TestWatcher; import org.junit.rules.Verifier; import org.junit.runner.Description; import org.junit.runners.model.Statement; public class WatchmanTest { private static String watchedLog; @Rule public TestRule watchman = new TestWatcher() { @Override public Statement apply(Statement base, Description description) { Statement s = super.apply(base, description); watchedLog=""; System.out.println("watch apply."); return s; } @Override protected void succeeded(Description description) { watchedLog += description.getDisplayName() + " " + "success!"; System.out.println("watch succeed:"+watchedLog); } @Override protected void failed(Throwable e, Description description) { watchedLog += description.getDisplayName() + " " + e.getClass().getSimpleName(); System.out.println("watch failed:"+watchedLog); } @Override protected void starting(Description description) { super.starting(description); System.out.println("watch starting."); } @Override protected void finished(Description description) { super.finished(description); System.out.println("watch finished."); } }; @Rule public Verifier collector = new Verifier() { @Override protected void verify() { System.out.println("@Verify:"+watchedLog); } }; @Test public void fails() { System.out.println("in fails"); assertThat("ssss", is("sss")); } @Test public void succeeds() { System.out.println("in succeeds"); } @After public void after() { System.out.println("@After"); } }
运行后,日志如下:
watch apply. watch starting. in succeeds @After watch succeed:succeeds(tangzhi.mytest.WatchmanTest) success! watch finished. @Verify:succeeds(tangzhi.mytest.WatchmanTest) success! watch apply. watch starting. in fails @After watch failed:fails(tangzhi.mytest.WatchmanTest) AssertionError watch finished.
-
TestName
TestName
可以获取当前测试方法的名字。看例子:
public class NameRuleTest { @Rule public TestName name = new TestName(); @Test public void testA() { assertEquals("testA", name.getMethodName()); } @Test public void testB() { assertEquals("testB", name.getMethodName()); } }
如果,是在参数化测试(Parameterized)中,使用了
@Parameters
,那么其name
属性定义的方法名也将会被TestName#getMethodName
获取。 -
Timeout
这个我们在前面介绍过,可以设置某个测试类,所有测试方法的超时时间。详见进阶二。
-
ExpectedException
。
-
ClassRule
注释
@ClassRule
是类级别的,而不是方法级别的。见下面例子:
@RunWith(Suite.class) @SuiteClasses({A.class, B.class, C.class}) public class UsesExternalResource { public static Server myServer= new Server(); @ClassRule public static ExternalResource resource= new ExternalResource() { @Override protected void before() throws Throwable { myServer.connect(); }; @Override protected void after() { myServer.disconnect(); }; }; }
在Suite所打包的几个类测试前后,会执行一遍
ClassRule
。 -
RuleChain
见例子:
public static class UseRuleChain { @Rule public TestRule chain= RuleChain .outerRule(new LoggingRule("outer rule") .around(new LoggingRule("middle rule") .around(new LoggingRule("inner rule"); @Test public void example() { assertTrue(true); } }
执行后,日志如下:
starting outer rule starting middle rule starting inner rule finished inner rule finished middle rule finished outer rule
- 浏览: 107650 次
- 性别:
- 来自: 南京
文章分类
最新评论
发表评论
-
Junit4使用汇总(五)suite
2015-01-19 18:06 420一、Suite测试 进行Suite测试可以将多个待测试的 ... -
Junit4使用汇总(二)assertThat
2015-01-16 16:53 524一、assertThat方法 JUnit4 结合 Ham ... -
Junit4使用汇总(一)基础
2015-01-16 16:52 432看了三天的Junit,基本用法汇如下: 一、基础篇 ... -
JUnit测试预期异常
2014-09-11 08:06 371我们拿下面的代码作为例子,写一个测试,确保canVote() ... -
用testsuite管理junit单元测试用例
2014-09-04 09:01 588package calculor.Calculor;impo ... -
命令行下如何运行JUnit测试用例
2014-09-04 08:57 2502运行JUnit测试脚本: java -cp [jar file ...
相关推荐
此外,JUnit4的Rule与`@ClassRule`配合使用,可以应用于整个测试类,而不仅仅是单个测试方法。这对于设置和清理共享资源,比如数据库连接或临时目录,非常方便。 总结来说,JUnit4的Rule机制提供了一种强大的方式来...
标题“探索JUnit4扩展:使用Rule”涉及到的是Java单元测试框架JUnit的一个高级特性,即`@Rule`。在Java开发中,单元测试是确保代码质量、可维护性和可靠性的重要手段,而JUnit作为最流行的Java单元测试框架之一,...
JUnit4 使用方法 JUnit4 是一个流行的 Java 单元测试框架,提供了许多功能强大且灵活的测试工具。本文将详细介绍 JUnit4 的使用方法和核心概念。 JUnit4 核心概念 JUnit4 的核心概念包括测试类、测试集和测试运行...
## 三、JUnit4的实战应用 在实际项目中,我们可以按照以下步骤编写和运行JUnit4测试: 1. 引入JUnit4依赖:在项目构建文件中(如Maven或Gradle)添加JUnit4的依赖。 2. 创建测试类:创建一个类,并使用`@RunWith...
在Eclipse中使用JUnit4进行单元测试是一种常见的Java开发实践,它可以帮助开发者确保代码的正确性和稳定性。单元测试是软件开发中的重要环节,通过编写针对代码各个独立模块的测试用例,可以验证代码功能是否按预期...
8. **规则(Rules)**:JUnit4引入了规则(Rules)的概念,允许自定义测试行为,如使用`@Rule`注解配合`ExternalResource`实现资源的生命周期管理。 9. **假设(Assumptions)**:`Assume`类提供了方法,可以在测试...
### JUnit4 使用详解 #### 一、JUnit简介与单元测试概念 JUnit 是一个用于 Java 程序的单元测试框架,它可以帮助开发者确保代码的质量和稳定性。单元测试是一种编程方法,通过这种方式开发者可以在开发过程中编写...
JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了强大的工具来编写、组织和执行单元测试。JUnit4引入了许多改进和新特性,极大地提升了测试的灵活性和效率。下面将详细介绍JUnit4的关键概念、...
#### 三、JUnit4 与 JUnit3 的差异 在 JUnit3 中,编写测试用例时有许多限制,比如测试类必须继承 `junit.framework.TestCase` 类,且测试方法必须以 `test` 开头。这些限制在 JUnit4 中已经被取消,取而代之的是...
JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了一种方便、高效的方式来验证代码的正确性。这个“junit4 jar完整包”包含了所有你需要进行单元测试的类和接口,使得测试过程变得简单且易于...
JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了编写可重复执行、易于维护的测试代码的能力。这个“junit4 jar包”包含了运行JUnit4测试所必需的库文件,主要包括两个核心组件:`junit-4.11....
JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了强大的工具来编写可重复执行、可验证的测试代码。本教程将深入讲解JUnit4的使用方法,并附带源码供学习者实践和参考。 一、JUnit4概述 JUnit...
在实际开发中,`@Rule`还可以与其他JUnit注解一起使用,如`@BeforeClass`和`@AfterClass`,以确保测试类级别的资源管理。例如,可以创建一个`ClassRule`来初始化一次性的测试环境,如数据库连接池。 总的来说,通过...
三、JUnit4 中的元数据 在 JUnit4 中,引入了多种元数据,用于描述测试方法的行为。这些元数据包括: * @Before:使用了该元数据的方法在每个测试方法执行之前都要执行一次。 * @After:使用了该元数据的方法在每...
本文将深入探讨JUnit4的核心特性、使用方法以及如何将其应用到实际项目中。 首先,我们要明白单元测试的重要性。在软件开发过程中,单元测试是确保代码质量的第一道防线,它能够帮助开发者尽早发现和修复问题,提高...
eclipse上通过一个简单例子演示使用JUnit4进行测试
本文档介绍了JUnit4的基础知识,包括单元测试的概念、JUnit4的HelloWorld示例、断言机制、注解使用、测试运行方式等。 单元测试的概念 单元测试是指对软件的最小单元进行测试,以确保其正确性和可靠性。单元测试...
jUnit4 在 Eclipse 中的使用教程 jUnit4 是 JUnit 框架有史以来的最大改进,其主要目标便是利用 Java5 的 Annotation 特性简化测试用例的编写。 Annotation 是一种元数据,描述数据的数据。在 Java 里面可以用来和 ...