JUnit ErrorCollector @Rule 示例

在正常情况下,每当你在测试执行期间发现任何错误时,你都会停止测试,修复错误并重新运行测试。

但 JUnit 有一个略微不同的方法。借助 JUnit 错误收集器,即使发现问题或测试失败,你仍然可以继续执行测试。错误收集器会收集所有错误对象,并在测试执行结束后仅报告一次。

为什么要使用错误收集器?

在编写测试脚本时,即使任何一行代码因网络故障、断言失败或任何其他原因而失败,你也希望执行所有测试。在这种情况下,你可以使用 JUnit 提供的特殊功能“错误收集器”继续执行测试脚本。

为此,JUnit 使用 @Rule 注解,用于创建错误收集器对象。一旦错误收集器对象被创建,你可以使用方法 addError (Throwable error) 轻松地将所有错误添加到该对象中。如你所知,Throwable 是 Java 中 ExceptionError 类的超类。当你以这种方式添加错误时,这些错误将被记录在 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());							
   }		
}      

输出

请查看故障跟踪,它将所有错误集中在一处。

TestRunner.Java Output

JUnit ErrorCollector 的优点

你可以使用 JUnit 断言进行功能或 GUI 验证,例如:

  1. assertEquals(String message, Object expected, Object actual) 用于比较两个对象是否相等。
  2. 类似地,assertTrue(Boolean condition) 断言条件为真。

使用断言,验证测试变得容易。但一个主要问题是,即使单个断言失败,测试执行也会停止。

测试连续性和恢复处理对于测试自动化成功至关重要。错误收集器是处理此类场景的最佳方法。

摘要

  • JUnit 错误收集器允许测试在发现第一个问题后仍继续进行,并在最后报告测试失败。
  • 错误收集器收集所有错误对象,并在所有测试执行结束后才报告。
  • 将所有错误添加到错误收集器的好处是,你可以一次性验证所有错误。
  • 错误收集器只需使用 ErrorCollector.java 提供的 addError(throwable err) 方法添加错误。