从info.cukes迁移至io.cucumber时ExtentReport集成失败求助
Cucumber迁移至io.cucumber 4.2.6后ExtentReport插件加载失败问题解决
我最近在把Cucumber自动化项目从旧的info.cukes版本迁移到io.cucumber 4.2.6版本时,碰到了ExtentReport插件加载失败的问题。先把我的配置、代码和报错贴出来,再说说怎么解决:
我的依赖配置(pom.xml)
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-java</artifactId> <version>4.2.6</version> <scope>test</scope> </dependency> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-junit</artifactId> <version>4.2.6</version> <scope>test</scope> </dependency> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-core</artifactId> <version>4.2.6</version> </dependency> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-html</artifactId> <version>0.2.7</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.26-incubating</version> </dependency> <dependency> <groupId>com.vimalselvam</groupId> <artifactId>cucumber-extentsreport</artifactId> <version>3.0.2</version> </dependency> <dependency> <groupId>com.aventstack</groupId> <artifactId>extentreports</artifactId> <version>4.0.9</version> </dependency>
我的Runner类代码
package CucumberWithAfterStep.AfterStepPOC; import java.io.File; import org.junit.AfterClass; import org.junit.runner.RunWith; import com.cucumber.listener.Reporter; import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber; @RunWith(Cucumber.class) @CucumberOptions( features = "src/test/resources/features", glue = { "testSteps" }, plugin = { "pretty", "html:target/cucumber", "json:target/cucumber.json" , "com.cucumber.listener.ExtentCucumberFormatter:target/cucumber-reports/report.html" }, monochrome = true, tags = {"@WAC003 "}, dryRun = false ) public class MainRunnerTest { @AfterClass public static void writeExtentReport() { Reporter.loadXMLConfig(new File(FileReaderManager.getInstance().getConfigReader().getReportConfigPath())); } }
报错信息
cucumber.runtime.CucumberException: Couldn't load plugin class: com.cucumber.listener.ExtentCucumberFormatter. It does not implement cucumber.api.Plugin at cucumber.runtime.formatter.PluginFactory.loadClass(PluginFactory.java:176) at cucumber.runtime.formatter.PluginFactory.pluginClass(PluginFactory.java:163) at cucumber.runtime.formatter.PluginFactory.getPluginClass(PluginFactory.java:220) at cucumber.runtime.formatter.PluginFactory.isStepDefinitionReporterName(PluginFactory.java:203) at cucumber.runtime.RuntimeOptions$ParsedPluginData.addPluginName(RuntimeOptions.java:386) at cucumber.runtime.RuntimeOptions.parse(RuntimeOptions.java:165) at cucumber.runtime.RuntimeOptions.(RuntimeOptions.java:108)
问题核心原因
这个报错的本质是依赖版本不兼容:
- 你用的
com.vimalselvam:cucumber-extentsreport:3.0.2是为旧版Cucumber(info.cukes)开发的,它的ExtentCucumberFormatter实现的是旧的cucumber.api.Plugin接口; - 而
io.cucumber 4.2.6版本的插件接口已经升级为io.cucumber.plugin.Plugin,旧插件类无法被新版本识别。
解决步骤
1. 升级cucumber-extentsreport依赖
把cucumber-extentsreport版本换成适配io.cucumber的4.0.0,这个版本刚好和你当前的ExtentReports 4.0.9匹配:
<dependency> <groupId>com.vimalselvam</groupId> <artifactId>cucumber-extentsreport</artifactId> <version>4.0.0</version> </dependency>
2. 修改Runner类中的插件路径
将原来的旧插件类com.cucumber.listener.ExtentCucumberFormatter替换为新版本的适配器类:
@CucumberOptions( // 其他配置保持不变 plugin = { "pretty", "html:target/cucumber", "json:target/cucumber.json" , "com.aventstack.extentreports.cucumber.adapter.ExtentCucumberAdapter:target/cucumber-reports/report.html" }, // 其他配置保持不变 )
3. 替换Reporter类并修改报告配置代码
旧的com.cucumber.listener.Reporter在新版本中已被弃用,改用com.aventstack.extentreports.cucumber.adapter.ExtentCucumberAdapter加载配置:
package CucumberWithAfterStep.AfterStepPOC; import java.io.File; import org.junit.AfterClass; import org.junit.runner.RunWith; import com.aventstack.extentreports.cucumber.adapter.ExtentCucumberAdapter; import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber; @RunWith(Cucumber.class) @CucumberOptions( features = "src/test/resources/features", glue = { "testSteps" }, plugin = { "pretty", "html:target/cucumber", "json:target/cucumber.json" , "com.aventstack.extentreports.cucumber.adapter.ExtentCucumberAdapter:target/cucumber-reports/report.html" }, monochrome = true, tags = {"@WAC003 "}, dryRun = false ) public class MainRunnerTest { @AfterClass public static void writeExtentReport() { ExtentCucumberAdapter.loadXMLConfig(new File(FileReaderManager.getInstance().getConfigReader().getReportConfigPath())); // 还可以在这里添加自定义系统信息,比如: // ExtentCucumberAdapter.addSystemInfo("Environment", "QA"); // ExtentCucumberAdapter.addSystemInfo("Browser", "Chrome"); } }
4. 可选:升级JUnit版本
你当前用的JUnit 3.8.1过于老旧,建议升级到JUnit 4.13.2,和Cucumber 4.2.6兼容性更好:
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency>
完成这些修改后,重新运行测试,ExtentReport应该就能正常生成了。
内容的提问来源于stack exchange,提问作者Anil Kumar P
相关产品推荐
相关产品推荐

