如何在Cucumber 4.0中实现自定义监听器以记录失败方法日志
Cucumber 4.0 自定义失败事件监听器实现方案
本方案基于Cucumber原生事件监听接口实现,不依赖Hooks,可精准捕获方法/步骤级别的测试失败事件。
1. 实现自定义监听器类
实现ConcurrentEventListener接口,注册对应执行结束事件的处理器,判断执行结果状态后输出自定义信息:
import cucumber.api.ConcurrentEventListener; import cucumber.api.event.EventHandler; import cucumber.api.event.EventPublisher; import cucumber.api.event.TestCaseFinished; import cucumber.api.event.TestStepFinished; import cucumber.api.Result; public class CustomTestFailureListener implements ConcurrentEventListener { @Override public void setEventPublisher(EventPublisher publisher) { // 场景级别失败监听:注册场景执行结束事件处理器 publisher.registerHandlerFor(TestCaseFinished.class, testCaseFinishedHandler); // 步骤级别失败监听:不需要可注释掉该行 publisher.registerHandlerFor(TestStepFinished.class, testStepFinishedHandler); } // 场景失败事件处理器 private final EventHandler<TestCaseFinished> testCaseFinishedHandler = event -> { if (event.result.getStatus() == Result.Type.FAILED) { // 此处可自定义输出到控制台/写入测试报告的逻辑 System.out.println("========== 测试场景执行失败 =========="); System.out.println("场景名称: " + event.testCase.getName()); System.out.println("特性文件路径: " + event.testCase.getUri()); System.out.println("失败原因: " + event.result.getErrorMessage()); System.out.println("执行耗时: " + event.result.getDuration() + "ms"); System.out.println("====================================="); } }; // 步骤失败事件处理器 private final EventHandler<TestStepFinished> testStepFinishedHandler = event -> { if (event.result.getStatus() == Result.Type.FAILED) { System.out.println("========== 测试步骤执行失败 =========="); System.out.println("步骤代码位置: " + event.testStep.getCodeLocation()); System.out.println("所属场景: " + event.testCase.getName()); System.out.println("异常堆栈: " + event.result.getError()); System.out.println("====================================="); } }; }
2. 注册监听器
将写好的监听器注册到Cucumber运行配置中即可生效,两种常用注册方式:
- 命令行执行测试时添加参数:
--plugin 你的监听器全类名(例如com.xxx.CustomTestFailureListener) - JUnit集成运行时,在
@CucumberOptions注解中添加plugin配置:
@CucumberOptions( features = "src/test/resources/features", glue = "你的步骤定义包路径", plugin = {"com.xxx.CustomTestFailureListener"} ) public class CucumberTestRunner { }
注意:Cucumber 4.x的事件API和其他版本不兼容,不要导入其他版本的
cucumber-api依赖,避免类找不到异常。
内容的提问来源于stack exchange,提问作者Hari
相关产品推荐
相关产品推荐

