很抱歉,如果这个问题在某些地方已经得到回答,我还没有运气找到解决方案。这是我的第一篇SO帖子,如果信息丢失/不清楚,或者格式很烂,请告诉我,我将更新该帖子。
我正在使用TestNG版本6.13.1(也已通过7.0.0-beta1测试)。我正在运行此命令(不是完整的命令,类路径很大,并且有多个-D选项)
java -cp <classpath stuff...> -DappiumPort=30000 org.testng.TestNG -usedefaultlisteners false /Users/.../adbservice/test-results/3567/test_config/Test_Suite_testT13googleMaps.xml
期望testNG会将第一个参数识别为一个开关,并关闭默认侦听器。这是基于阅读Turning off test-output in TestNG和http://testng.org/doc/documentation-main.html#testng-xml以及其他不太相关的文档。
实际上发生的是testNG似乎将所有参数都当作文件路径对待,并且我收到一条非常有用的错误消息
ProcessResults(exitCode=0, output=java.io.FileNotFoundException: /Users/.../adbservice/-usedefaultlisteners false testng.xml (No such file or directory)
at java.base/java.io.FileInputStream.open0(Native Method)
at java.base/java.io.FileInputStream.open(FileInputStream.java:196)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:139)
at org.testng.xml.Parser.parse(Parser.java:148)
at org.testng.xml.Parser.parse(Parser.java:233)
at org.testng.TestNG.parseSuite(TestNG.java:290)
at org.testng.TestNG.initializeSuitesAndJarFile(TestNG.java:334)
at org.testng.TestNG.initializeEverything(TestNG.java:974)
at org.testng.TestNG.run(TestNG.java:988)
at org.testng.TestNG.privateMain(TestNG.java:1330)
at org.testng.TestNG.main(TestNG.java:1299)
命令本身是从Java发出的,使用ProcessExecutor周围的包装器。代码看起来像
new ProcessExecutor()
.command(cmd)
.readOutput(true)
.timeout(waitForTimeMs, TimeUnit.MILLISECONDS)
.execute();
如果我捕获命令输入并将其粘贴到外壳中,则会遇到相同的错误,因此看来Java代码本身不是问题,但我想我会为了完整性而包括这些信息。
我的问题是,如何使用命令行参数对testNG进行此调用?似乎几乎没有其他选择,因为我打包了在Shell进程中执行的测试。
修改 由于这是一个很常见的情况,因此我坚信我这边出了问题。我通过使用烟雾测试创建一个非常简单的Java项目来测试了该理论,然后使用
java -cp .:testng-6.13.1.jar:jcommander-1.72.jar:build/libs/test-1.0-SNAPSHOT.jar org.testng.TestNG -usedefaultlisteners false testng.xml
与文档中所述完全相同。因此,我认为java的输入以及如何处理它会导致testNG错误的事情。
编辑2 在我这边做了进一步的研究,最终我在命令行上尝试了带有参数(-usedefaultlisteners false)的原始生成的Java命令,并发现它起作用了,或者至少在轰炸之前做了一些工作,而不是抱怨参数是无效的文件路径,这是我在命令行上运行时的原始结果。也许我第一次输入的目录是错误的或类似的目录,但这表明 是与此ProcessExecutor处理命令时出现的问题。
编辑3 财源。事实证明,ProcessExecutor库不会像预期的那样处理带有空格的命令行输入,因此,例如
Lists.newArrayList(
"java", "-cp", ".:", "org.testng.TestNG", "-enabledefaultlisteners false", "testng.xml"
)
会出错,但是
Lists.newArrayList(
"java", "-cp", ".:", "org.testng.TestNG", "-enabledefaultlisteners", "false", "testng.xml"
)
有效。似乎应该在ProcessExecutor库文档中进行记录。