JUnit ErrorCollector @Rule 示例
在正常情况下,每当你在测试执行期间发现任何错误时,你都会停止测试,修复错误并重新运行测试。
但 JUnit 有一个略微不同的方法。借助 JUnit 错误收集器,即使发现问题或测试失败,你仍然可以继续执行测试。错误收集器会收集所有错误对象,并在测试执行结束后仅报告一次。
为什么要使用错误收集器?
在编写测试脚本时,即使任何一行代码因网络故障、断言失败或任何其他原因而失败,你也希望执行所有测试。在这种情况下,你可以使用 JUnit 提供的特殊功能“错误收集器”继续执行测试脚本。
为此,JUnit 使用 @Rule 注解,用于创建错误收集器对象。一旦错误收集器对象被创建,你可以使用方法 addError (Throwable error) 轻松地将所有错误添加到该对象中。如你所知,Throwable 是 Java 中 Exception 和 Error 类的超类。当你以这种方式添加错误时,这些错误将被记录在 JUnit 测试结果中。
将所有错误添加到错误收集器的好处是,你可以一次性验证所有错误。此外,如果脚本在中间失败,它仍然可以继续执行。
注意:在使用简单的 assert 或 try/catch 块的情况下,无法使用错误收集器方法。
示例代码
要进一步了解错误收集器,请参阅下面的代码示例,它演示了如何创建 Error Collector 对象并将所有错误添加到该对象以跟踪问题。
package guru99.junit; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ErrorCollector; public class ErrorCollectorExample { @Rule public ErrorCollector collector = new ErrorCollector(); @Test public void example() { collector.addError(new Throwable("There is an error in first line")); collector.addError(new Throwable("There is an error in second line")); collector.checkThat(getResults(), not(containsString("here is an error"))); // all lines of code will execute and at the end a combined failure will be logged in. } }
jUnit 中的 @Rule 是什么?
JUnit 通过使用 @rule 注解 提供了一种特殊的测试处理方式,例如测试用例或测试套件。使用 @rule,你可以轻松添加或重新定义测试的行为。
JUnit API 提供了几种内置规则供测试人员使用,甚至你可以编写自己的规则。
请看下面的代码行,它展示了如何将 @rule 注解与错误收集器一起使用。
@Rule public ErrorCollector collector= new ErrorCollector();
使用 ErrorCollector 的示例
为了理解错误收集器,让我们创建一个类和一条规则来收集所有错误。你将在这里使用 addError(throwable) 添加所有错误。
请看下面的代码,它只是创建了一个规则,即创建了一个“错误收集器对象”。该对象进一步用于添加所有错误,以便在最后报告问题。
ErrorCollectorExample.java
package guru99.junit; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ErrorCollector; public class ErrorCollectorExample { @Rule public ErrorCollector collector = new ErrorCollector(); @Test public void example() { collector.addError(new Throwable("There is an error in first line")); collector.addError(new Throwable("There is an error in second line")); System.out.println("Hello"); try { Assert.assertTrue("A " == "B"); } catch (Throwable t) { collector.addError(t); } System.out.println("World!!!!"); } }
TestRunner.java
让我们将上述测试类添加到测试运行器中并执行它以收集所有错误。请看下面的代码。
package guru99.junit; import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner { public static void main(String[] args) { Result result = JUnitCore.runClasses(ErrorCollectorExample.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println("Result=="+result.wasSuccessful()); } }
输出
请查看故障跟踪,它将所有错误集中在一处。
JUnit ErrorCollector 的优点
你可以使用 JUnit 断言进行功能或 GUI 验证,例如:
- assertEquals(String message, Object expected, Object actual) 用于比较两个对象是否相等。
- 类似地,assertTrue(Boolean condition) 断言条件为真。
使用断言,验证测试变得容易。但一个主要问题是,即使单个断言失败,测试执行也会停止。
测试连续性和恢复处理对于测试自动化成功至关重要。错误收集器是处理此类场景的最佳方法。
摘要
- JUnit 错误收集器允许测试在发现第一个问题后仍继续进行,并在最后报告测试失败。
- 错误收集器收集所有错误对象,并在所有测试执行结束后才报告。
- 将所有错误添加到错误收集器的好处是,你可以一次性验证所有错误。
- 错误收集器只需使用 ErrorCollector.java 提供的 addError(throwable err) 方法添加错误。