JUnit ErrorCollector @Rule 示例

⚡ 智能摘要

JUnit ErrorCollector 是一条规则,它允许测试在失败后继续运行,收集所有错误对象,并在测试方法完成后将它们一起报告,而不是停止测试。ping 第一个问题。

  • 🔘 目的: 如果断言、网络或 GUI 检查失败,则继续测试,然后一次性报告收集到的所有错误。
  • ☑️ 宣言: 对公共非静态 ErrorCollector 字段的 @Rule 指示 JUnit 将规则附加到每个测试中。
  • 收集: addError(Throwable) 会存储任何 Error 或 Exception,因为 Throwable 是 Error 和 Exception 的父级。
  • 🧪 检查: checkThat() 会评估匹配器并记录不匹配情况,而不会中止剩余语句。
  • 🛠️ 报告: 失败 trace 列出了所有收集到的投掷物,并为其分配了单独的行号。 JUnit 视图。
  • 📌 JUnit 5: 由于 Jupiter 中没有规则,因此 assertAll() 或 AssertJ SoftAssertions 扮演着相同的角色。

JUnit ErrorCollector 规则用于收集一次测试运行中的多个错误

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

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

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

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

为了这, JUnit 使用 @Rule 注解该方法用于创建错误收集器对象。创建错误收集器对象后,您可以使用该方法轻松地将所有错误添加到该对象中。 addError(可抛出的错误)。 如你所知, 可投掷 是超类 特殊课程误差 课程 Java以这种方式添加错误时,这些错误将被记录在日志中。 JUnit 测试结果。

将所有错误添加到错误收集器的好处在于,您可以一次性验证所有错误。此外,即使脚本在执行过程中失败,它仍会继续执行到测试方法的结束。

注意:如果使用简单的断言或 try/catch 块,则无法使用错误收集器方法。

样例代码

要了解更多关于错误收集器的信息,请参阅下面的代码示例,该示例演示了如何创建一个错误收集器对象并将所有错误添加到该对象中。 trac这个问题:

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.		
    }		
}	

注意: 这是一个示例性的例子tract,这不是一个可编译的文件。它的尾部注释换行到第二行,没有以 // 开头,并且 getResults() 函数和 Hamcrest 匹配器没有显示。完整的可运行版本如下。 使用 ErrorCollector 的示例.

@Rule 是什么? JUnit?

JUnit 提供了一种特殊的测试处理方式, 测试用例 或使用以下方式测试套件 @Rule 注解使用 @Rule,您可以轻松地添加或重新定义测试的行为。

系统内置了若干规则。 JUnit 测试人员可以使用 API,您也可以编写自己的规则。规则字段必须是公共的、非静态的,并且类型必须实现了 TestRule 接口。

请看下面的代码行,它展示了如何将 @Rule 注解与错误收集器一起使用:

@Rule				
public ErrorCollector collector= new ErrorCollector();

JUnit 5 年备注: Jupiter 用扩展 API 取代了规则,因此 org.junit.jupiter 中不再存在 @Rule 和 ErrorCollector。最接近的等效项是 Assertions.assertAll() 和 AssertJ SoftAssertions。 JUnit 这里显示的4个代码仍然在老式发动机中运行。参见 JUnit 注释 完整地图教程ping.

使用 ErrorCollector 的示例

为了理解错误收集器,我们来创建一个类和一个规则来收集所有错误。您将使用 `addError(throwable)` 方法添加所有错误。

请参见以下代码,它创建了一条规则,该规则实际上就是一个“错误收集器对象”。它用于将所有错误添加到列表中,以便在最后报告问题:

错误收集器示例.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!!!!");					
    }		
}		

测试运行器.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());							
   }		
}      

输出:

看看失败之处 trac例如,哪个 trac将所有错误集中在一处。 JUnit 查看计数显示运行一次,但报告两个错误和一个失败,每个错误和失败都有自己的行号:

Eclipse JUnit 失败 trace 列出了在一次运行中收集到的两个 Throwable 错误和一个 AssertionError 错误

的好处 JUnit 错误收集器

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

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

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

测试连续性和恢复处理对于测试自动化的成功至关重要,而且在长期测试中尤为重要。 Selenium 在某些流程中,每次检查失败后都重启浏览器会消耗大量资源。错误收集器是处理此类情况的最佳方案。

常见问题

`addError(Throwable)` 会记录一个你已捕获或创建的错误。`checkThat(value, matcher)` 会评估一个 Hamcrest 匹配器,并自动记录不匹配项,因此它看起来像一个断言,但仍然允许其余语句运行。

是的。该方法会一直运行到完成。 JUnit 标记为失败,并打印失败中收集到的所有可抛物项。 trace. 示例屏幕截图显示单个测试方法出现两个错误和一个失败。

JUnit 扫描测试类中带有 `@Rule` 注解的公共实例字段,并为每个测试方法应用相应的注解。私有字段或静态字段将被忽略。 JUnit 抛出初始化错误而不是运行测试。

不。Jupiter 版本移除了规则机制,因此 org.junit.rules.ErrorCollector 仅存在于…… JUnit 4. 使用 Assertions.assertAll() 进行分组断言,或者在需要更丰富的匹配器时添加 AssertJ SoftAssertions。

是的,这是一种常见的模式。包含多个字段的页面可以一次性验证完毕,收集所有不匹配项,而不是在发现第一个不匹配项时就中止验证,这样就避免了每次发现缺陷都重启浏览器会话。

两者都会延迟报告错误,但 SoftAssert 需要在测试结束时显式调用 assertAll(),而 ErrorCollector 会在方法返回时自动报告错误。忘记调用 assertAll() 会导致错误。 TestNG 悄无声息地掩盖失败。

人工智能助手群体长期失败 trac通过根本原因分析,可以将收集到的二十个可排除缺陷简化为少数几个不同的缺陷。它们还表明哪些检查应该放在一次运行中,而不是放在单独的测试中。

GitHub 副驾驶 它会立即写入 @Rule 字段,但经常会将其混入 Jupiter 测试类中,而该类中并不存在相应的规则。运行测试套件之前,请确认导入的库是 org.junit。

总结一下这篇文章: