通过Cucumber TestRunner执行测试遇TestNG DTD加载异常求助
你遇到的问题核心在于:直接运行TestRunner类时,Maven Surefire插件的配置不会生效——Surefire的systemPropertyVariables只在通过mvn test等Maven命令执行测试时才会被应用。而当你在IDE中直接右键运行TestRunner类,IDE会直接启动TestNG进程,完全绕过Maven的插件配置,导致testng.dtd.http=true这个系统属性没有被设置。
下面提供两种无需手动添加VM参数的解决方案,优先推荐第一种:
方案一:在TestRunner类中通过静态代码块设置系统属性
在TestRunner类中添加静态代码块,在类加载时自动设置所需的系统属性。这样无论是IDE直接运行TestRunner,还是通过Maven执行,这个属性都会生效:
import io.cucumber.testng.CucumberOptions; import io.cucumber.testng.AbstractTestNGCucumberTests; @CucumberOptions( features = { "src/test/java/Features" }, glue = { "StepDefinitions" }, tags = "@First or @Middle or @Last" ) public class TestRunner extends AbstractTestNGCucumberTests { // 静态代码块:在类初始化时设置系统属性 static { System.setProperty("testng.dtd.http", "true"); } }
这个方法的优势是无需依赖外部配置,只要别人拿到你的代码,直接运行TestRunner类就能正常执行测试,完全不用手动设置VM参数。
方案二:配置IDE的TestNG默认运行参数(辅助方案)
如果团队成员都使用同一款IDE(比如IntelliJ IDEA),可以统一配置IDE的TestNG默认运行参数,避免每个人手动设置:
- 打开IDE的
Run/Debug Configurations - 找到
Defaults下的TestNG配置 - 在
VM options中添加-Dtestng.dtd.http=true - 保存配置后,所有新创建的TestNG运行配置都会自动带上这个参数
不过这个方案只能覆盖IDE场景,不如方案一通用,所以优先推荐方案一。
为什么Surefire的配置没起作用?
你的Surefire插件配置本身是正确的——当你通过mvn test或者IDE中选择Run Maven -> test执行测试时,systemPropertyVariables会被正确注入到TestNG进程中,所以不会报错。但直接运行TestRunner类属于IDE的独立TestNG运行,不走Maven构建流程,因此Surefire的配置无法生效。
内容的提问来源于stack exchange,提问作者ashton.lennon

