使用TestNG与Cucumber运行Selenium代码触发空指针异常如何解决
TestNG+Cucumber运行触发AbstractTestNGCucumberTests空指针的解决方法
问题根源
空指针出现在AbstractTestNGCucumberTests的features方法调用阶段,核心触发原因是Cucumber新旧版本包导入错配:
- 当前代码中继承的测试基类
AbstractTestNGCucumberTests来自旧版Cucumber(cucumber.api.testng包,对应Cucumber 2.x及更早版本) - 但使用的
@CucumberOptions注解来自新版io.cucumber包(对应Cucumber 4.x及之后版本) - 两套包不兼容,旧版测试基类无法读取到注解配置,内部持有的测试执行器实例未完成初始化,调用方法时直接抛出空指针。
分步修正方案
- 统一Cucumber依赖与导入逻辑,避免新旧包混杂
- 移除所有JUnit相关冗余导入:
org.junit.runner.RunWith、io.cucumber.junit.Cucumber,删除注释掉的@RunWith(Cucumber.class)(该注解为JUnit专属,TestNG执行场景下无实际作用,留着只会引发类加载冲突) - 替换旧版测试基类导入为同版本的TestNG适配类:把
cucumber.api.testng.AbstractTestNGCucumberTests替换为io.cucumber.testng.AbstractTestNGCucumberTests,配套的@CucumberOptions使用同包下的io.cucumber.testng.CucumberOptions - 删除无实际逻辑的冗余导入:
org.testng.annotations.BeforeClass、cucumber.api.testng.CucumberFeatureWrapper、cucumber.api.testng.TestNGCucumberRunner
修正后的Runner类示例:
package com.BDD.Runner; import io.cucumber.testng.AbstractTestNGCucumberTests; import io.cucumber.testng.CucumberOptions; import org.testng.annotations.DataProvider; @CucumberOptions(features = "src/test/resources/Features", glue = {"com.BDD.StepDef"}, monochrome = true, plugin = {"pretty", "html:target/HtmlReports/index.html", "json:target/JsonReports/report.json"}, tags = "@test") public class CucumberRunner extends AbstractTestNGCucumberTests { // 如需并行执行测试,可调整parallel参数值,单线程执行可保留默认父类逻辑 @Override @DataProvider(parallel = false) public Object[][] scenarios() { return super.scenarios(); } } - 移除所有JUnit相关冗余导入:
- 校验Features路径与配置有效性
- 确认
src/test/resources/Features目录下存在.feature后缀的用例文件,无路径大小写、拼写错误 - 确认用例上标注的
@test标签无拼写偏差,避免因无匹配用例导致执行器初始化失败 - 确认开发工具已将
src/test/resources标记为测试资源根目录,避免类加载时找不到路径下的资源文件
- 确认
- TestNG配置文件无需调整
当前testng.xml的类引用配置逻辑正确,修正Runner类后可直接运行该套件,无需额外添加监听器、初始化方法等配置。
内容的提问来源于stack exchange,提问作者Suhas Kulkarni
相关产品推荐
相关产品推荐

