默认情况下,TestNG禁止从不安全的URL加载DTD。

30

我正在使用testng maven和selenium来运行我的测试,目前我有以下的testng.xml文件

看起来问题出在 &listeners 和 &classes 这两行,如果我用这些行所引用的文件中的xml内容替换它们,就可以正常运行。我之前在另一个项目中使用过这个方法,也可以正常运行,不确定为什么会出现这个错误。

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"   [
        <!ENTITY listeners SYSTEM "listeners.xml">
        <!ENTITY classes SYSTEM "classes.xml">
        ]>
<suite name="Local Execution" verbose="5">
    &listeners;
    <test name="Core Integration Tests" time-out="800000">
        <groups>
            <run>
                <include name="failed"/>
            </run>
        </groups>
        &classes;
    </test>
</suite>

Listener.xml的内容如下:

<listeners>
    <listener class-name="com.myclass.Listeners.TestListener"/>
</listeners>

类文件是

<classes>
    <class name="com.orders.tc_class1"/>
    <class name="com.orders.tc_class2"/>
</classes>

这是我收到的错误的一部分

org.testng.TestNGException: 
TestNG by default disables loading DTD from unsecure Urls. If you need to explicitly load the DTD from a http url, please do so by using the JVM argument [-Dtestng.dtd.http=true]
    at org.testng.xml.TestNGContentHandler.resolveEntity(TestNGContentHandler.java:102)

1
这是安全性的新实现 https://github.com/cbeust/testng/pull/2023/files。正如消息所说,设置JVM参数[-Dtestng.dtd.http=true]。 - Rahul L
谢谢@RahulL,但如果我从IntelliJ运行测试,右键单击xml然后运行,我该如何添加该参数? - msiles
在虚拟机中添加参数 https://testng.org/doc/idea.html 或搜索。 - Rahul L
同样地,如果您添加了Maven依赖项但忘记将testng.jar文件作为外部库添加,将会发生相同的错误。 - TeachMeJava
IntelliJ正在修复这个问题:https://youtrack.jetbrains.com/issue/IDEA-234765 - PHPGuru
15个回答

44

是的,这是TestNG的默认行为,并且我通过该拉取请求引入了它以修复错误 https://github.com/cbeust/testng/issues/2022

要在IntelliJ中设置JVM参数,请选择Run > Edit Configurations,并在VM选项部分在-ea之后添加此JVM参数。(默认情况下会有)

有关编辑配置的更多信息,请参阅官方文档here

添加截图以便在Intellij中轻松找到

参数值

-ea -Dtestng.dtd.http=true

enter image description here

如果上述方法不起作用,请在模板级别执行以下操作,这将解决问题:

Run--> Edit configuration --> template --> testng

enter image description here


我如何在没有互联网访问的情况下执行测试?使用该参数时,我会收到“连接超时”错误。 - Boss Man
1
添加哪个JVM参数? - Joe Coder
2
这不应该被接受作为答案,因为它是不完整的,另一个答案有正确的解决方案,包括“-Dtestng.dtd.http=true”。 - Csa77
7
无论如何,这都是一个解决方法。正确的解决方案是在<!DOCTYPE>中将URL更改为https。根据@Amerousful的回答。 - Alissa
对我很有帮助。谢谢。 - Rashad Nasirli
让某人的一天变得更美好。谢谢。 - Rashad Nasirli

42

只需更改你们所有的内容

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"

在https上:

<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd"


很好!就是这么简单!没有讽刺的意味。对我有用。 - Prostak
这是更为恰当的答案。 - Hola Soy Edu Feliz Navidad
7
这比让团队所有成员添加一些东西来运行配置要好得多。@msiles,您介意将接受的答案更改为此吗?其他答案更像是一个解决方法... - Alissa
今天这个对我起作用了。然后刷新文件,重新构建和运行。谢谢! - Debra Bula
但是我的项目中没有这个DOCTYPE的东西,我仍然遇到了这个错误。 - RomanKousta

13
  1. 右键点击类,选择运行 --> 运行配置
  2. 默认情况下,将在testng选项下生成一个与该类名相同的testNg类
  3. 选择该类并转到"Arguments"选项卡
  4. 在VM参数中提供 -Dtestng.dtd.http=true

就这样。


10

为了避免混淆和让新手更容易使用配置编辑选项等,附上 IntelliJ 中进行操作的快照。

如由 Krishnan M. 所回答:

进入 Cucumber TestNGRunner 类的 Edit Config,然后我们需要在 VM 选项中添加另一个参数,如下所示 -

  1. 如何编辑运行配置 How to Edit Run Config

  2. 如何添加 >VM 参数: "-Dtestng.dtd.http=true" How to add >VM argument: "-Dtestng.dtd.http=true"


我是这样添加的。当我使用工具栏上的按钮运行时,它可以正常工作。但是,如果我右键单击类文件并运行,则会创建另一个运行配置而没有参数,并且它将使用该配置运行,因此再次出现错误。 - anandhu

7
  1. 如果您只从eclipse/其他IDE运行项目,请更新TestNG首选项并在JVM_args中添加语句-Dtestng.dtd.http=true
  2. 如果您正在寻找一般修复程序,其中包括从CLI运行maven,则需要更新所有TestNG.xml文件。
 <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

TO:

<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >

我个人更喜欢更新DOCTYPE。


2
即使创建者不确定修复方法,还是感谢您的努力。 - PDHide

6

添加这些VM选项:-ea -Dtestng.dtd.http=true解决了这个问题。
但如果您想为每次运行解决任何类或方法的问题,则需要在TestNG模板中添加相同的内容,请参阅此屏幕截图。 Intelij TestNg模板屏幕截图


1
绝对是最佳答案:修复模板可以解决所有测试运行的问题。 - ochedru
最佳答案。 - RoyalTiger
你复制了我的答案 https://dev59.com/I1MI5IYBdhLWcg3wBGqC#63517935 - IPlato

5

如果希望在任何测试运行时都起作用,不管它们来自哪里,可以通过在pom文件中设置系统属性来实现。 在maven-surefire-pluginmaven-failsafe-plugin中添加以下内容:

                    <configuration>
                        <systemPropertyVariables>
                            <testng.dtd.http>true</testng.dtd.http>
                        </systemPropertyVariables>
                    </configuration>

谢谢您指出这一点 - 我不希望我的项目参与者经历设置IntelliJ testng运行配置的痛苦,这个选项确实很有帮助。 - Changgull Song
谢谢。你用这种简单的方法救了我的一天。 - Deepak

3

请在您的套件文件中将"http://testng.org/testng-1.0.dtd"更改为"https://testng.org/testng-1.0.dtd"。


3
在TestNG文件中,将<!DOCTYPE>参数内的值(http)更改为https,如下图所示。就是这样。

TestNG File


1
这是解决方案,不知道为什么没有人点赞它。 - Gaj Julije

2

以下是详细的异常信息:

org.testng.TestNGException: TestNG默认禁用从不安全 URL 加载 DTD。如果需要显式从 http URL 加载 DTD,请使用 JVM 参数 [-Dtestng.dtd.http=true]

解决此异常需要设置 JVM 参数。在 Eclipse 中设置 JVM 参数的步骤如下:

  1. 打开 Eclipse,点击 Window -> Preferences
  2. 在左侧扩展栏中展开 TestNG 并点击 Run/Debug
  3. 在右侧文本框中输入以下文本到 JVM args 文本框中: -Dtestng.dtd.http=true
  4. 点击 Apply and Close 按钮 enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接