Извините, если где-то на этот вопрос уже был дан ответ, мне не повезло найти решение.Это мой первый пост 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 распознает первый аргумент как ключ, иотключить прослушиватели по умолчанию .Это основано на чтении Отключение тестового вывода в 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 работать, используя аргументы командной строки?Кажется, есть несколько альтернатив, потому что у меня есть упакованные тесты, которые выполняются в процессе оболочки.
Редактировать Поскольку это такой распространенный случай, я убежден, что с моей стороны что-то не так,Я проверил эту теорию, создав действительно простой 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.
Edit 2 Провел какое-то дополнительное расследование на моей стороне, в конце концовЯ попробовал оригинальную сгенерированную команду java с параметрами (-usedefaultlisteners false) в командной строке, и вот, она сработала, или, по крайней мере, она сделала некоторые вещи перед бомбардировкой, вместо того, чтобы жаловаться на то, что параметры являются неверными путями к файлам,который был мой оригинальный результат при запуске в командной строке.Возможно, у меня был неправильный каталог или что-то подобное в первый раз, но это говорит о том, что - это проблема с обработкой команды с этим ProcessExecutor.
Редактировать 3 Paydirt,Оказывается, библиотека ProcessExecutor не обрабатывает ввод командной строки с пробелами, как можно было бы ожидать, поэтому, например,
Lists.newArrayList(
"java", "-cp", ".:", "org.testng.TestNG", "-enabledefaultlisteners false", "testng.xml"
)
приведет к ошибке, но
Lists.newArrayList(
"java", "-cp", ".:", "org.testng.TestNG", "-enabledefaultlisteners", "false", "testng.xml"
)
работает.Похоже, что это должно быть задокументировано в документации к библиотеке ProcessExecutor.