Testng: [BUG] 默认情况下,TestNG 禁止从不安全的 Urls 加载 DTD。

创建于 2020-10-09  ·  10评论  ·  资料来源: cbeust/testng

测试版

<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>7.3.0</version>
</dependency>

预期行为

从资源读取 testng-1.0.dtd 文件抛出异常
image

实际行为

testng-1.0.dtd 文件无法从资源中读取

该问题是否可以在 runner 上重现?

IntelliJ v2020.2.3(TestNG IDE 插件版本 202.7660.26)

最有用的评论

是的,它看起来像是来自https://github.com/cbeust/testng/commit/cf22ccfcb2a34f9b0bb4fa8cbedae5297ddd2049的意外“全部替换”

所有10条评论

我认为您只需要添加一个 VM 参数“-Dtestng.dtd.http=true”,或者使用 HTTPS 资源。 目前,TestNG 需要在套件文件中默认使用 HTTPS。

@kobebryant2007 代码中有一个明显的错误。

  1. 我不想添加参数,也不想通过网络获取文件testng-1.0.dtd
  2. 如果添加标志,那么根据代码,我将文件放在资源中是没有意义的。

@juherr请注意。

@shaburov -

我不想添加参数,也不想通过网络获取文件 testng-1.0.dtd。

根据我的理解,TestNG 从网络中查找 DTD 的原因是为了确保它检索到最新/正确的 DTD。 TestNG 将尝试仅通过 https 协议从 TestNG 网站检索 DTD,如果未找到,您将看到该错误。 禁用它的唯一方法是使用@kobebryant2007建议的 JVM 参数。

如果添加标志,那么根据代码,我将文件放在资源中是没有意义的。

您能帮我理解这种期望背后的原因是 TestNG 是从您的本地资源读取文件吗? 如果它在某个地方以这种方式提到,请指向我相关的文档。 总而言之,如果存在网络故障,则当前默认情况下 TestNG 中止。 这已被整理为 PR https://github.com/cbeust/testng/pull/2386 的一部分,它将回退到嵌入在 TestNG jar 中的 DTD。 我猜一旦 PR 被合并,那么你最终可以在你的 CLASSPATH 中创建你的 testng dtd 文件,它可以作为资源获取。

@shaburov

TestNG jar 已经包含 DTD,它是应该使用的那个。

@juherr看看我附在屏幕截图上的代码,并意识到情况并非如此。
在从资源中读取文件之前将抛出异常。

我认为问题在于 IntelliJ 没有使用 HTTPS:
image

或者非 HTTPS 的 URL 不在URLS列表中(注意TESTNG_DTD_URLHTTPS_TESTNG_DTD_URL是完全一样的)。
image

@algotastic第二,我相信。

@shaburov是对的,这是一个错误:
https://github.com/cbeust/testng/blob/7.3.0/src/main/java/org/testng/xml/Parser.java#L33
它应该是public static final String TESTNG_DTD_URL = "http://testng.org/" + TESTNG_DTD;

而这个https://github.com/cbeust/testng/blob/7.3.0/src/main/java/org/testng/xml/Parser.java#L28
应该是public static final String OLD_TESTNG_DTD_URL = "http://beust.com/testng/" + TESTNG_DTD;

是的,它看起来像是来自https://github.com/cbeust/testng/commit/cf22ccfcb2a34f9b0bb4fa8cbedae5297ddd2049的意外“全部替换”

我可以添加“-Dtestng.dtd.http=true”,但这使得在 IntelliJ(右键单击并运行)中离线运行测试类/方法是不可能的。

此页面是否有帮助?
0 / 5 - 0 等级