编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

TestNG7.3.0版本,运行时DTD不安全报错问题

wxchong 2024-10-05 02:20:58 开源技术 12 ℃ 0 评论

我之前在eclipse上,idea上运行过testng的几个版本,最近一段时间没有使用。今天在一台新电脑的idea用了下testng框架,写了一个方法的demo,运行时遇到了问题,错误提示如下:

org.testng.TestNGException:

TestNG by default disables loading DTD from unsecured 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]

大致的意思是加载了不安全的dtd导致断开,若要坚持运行可以加jvm的参数来解决。

在网上搜了下相关的内容,基本上都是回答要降低版本。确实,我之前运行都是没问题的,最近也没使用testng框架,也没留意版本,今天的问题是使用testng新版本7.3.0出现的,所以降低版本肯定是一个解决方案,那不降低版本是否可以解决呢,请往下看文章。

今天就试试运行提示里的给jvm加参数是否可行,记录如下。

我的IDE是idea,给testng的模板加jvm参数的路径是“Run--> Edit configuration --> template --> testng”,如图

然后重新运行报错的方法,奇怪,怎么还是报错,难道提示给的解决方法无效?

再次进入testng的模板设置才发现,左侧菜单栏还有一个testng及运行方法菜单,但这个方法的jvm是没有参数的,就是说,运行过后已经应用了模板,就不再重新应用了。问题清楚了,解决就简单了,把这个测试方法删除再次运行让它重新应用带jvm参数的模板或者在这个已经应用完的模板方法里在加一次jvm参数,两个方法都试了下,都是ok的。见图

由于已经修改好了模板,后续再加新的测试方法,就不会报错了。

其实问题到这里就都解决完了,但比较奇怪为什么新版本就认为加载的dtd不安全了呢,那是不是加https就能解决呢。dtd是对项目xml的描述规范,我的项目testng.xml是用插件生成的,然后进入testng.xml里面发现dtd链接真的是http,而不是https,改为https,把之前方法的jvm参数去掉,然后运行testng.xml。ok,确实也是不报错了。我到testng的官网查了下,给的testng的示例确实也是https的。见图

到这该结束了吧。错!文章没有结束,由于我刚才的试验是去掉了testng模板上jvm参数的,尽管运行testng.xml成功了,但单独运行测试方法又开始报不安全的错误了,意味着单独运行测试方法是不走testng.xml里定义的dtd的。

咱们先看看新版本的源码为什么一直报不安全,我从报错提示进入源码TestNGContentHandler.java文件中,位置如图

分别进入方法,发现原来是有个判断,当协议等于http时,直接返回不安全链接的异常信息。

那就是说,单独运行一个测试方法,也是有一步取dtd的url的,那这个url不是取testng.xml里定义的,那是取哪里呢。

我又到IDE的引用dtd定义的地方看了看,路径:File–>Settings–>Languages & Frameworks–>Schemas and DTDs

在这里也是没有找到和dtd默认定义相关的内容。最终我也是没找到运行单独的一个测试方法到底是去哪里引用的dtd,猜测是IDE里默认访问dtd时并没有展示配置的地方,我单位用的是idea2018运行testng7.3.0时发生的报错问题,我家里用的idea是2020版本,在使用idea2020版本里,同样引用testng7.3.0,直接运行单个测试方法时就不再报dtd不安全的错误了,可能是新版本的IDE工具里默认访问dtd都用了https吧。文章到这里就结束了,通过这些问题的排查操作过程,个人感觉也是收获满满。

总结下:

1、新版本的testng源码中加入了dtd协议判断,使用http访问dtd会有不安全的报错。

2、解决办法按照提示,直接使用jvm加参数能完全解决。

3、testng.xml中的dtd修改为https协议,只能解决使用testng.xm来运行用例,用新版本的IDE工具可以兼容单独运行测试方法报错问题。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表