You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Cucumber TestRunner执行测试遇TestNG DTD加载异常求助

解决TestNG禁用HTTP DTD加载的问题(无需手动添加VM参数)

你遇到的问题核心在于:直接运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 09:13:13