Запуск mockservicerunner.sh в robot framework

Подключаюсь с помощью sshlibrary и запускаю mockservicerunner.sh

Проблем в том что mockservicerunner.sh запускает определенный mock service и “слушает”, ждет появления запросов для обработки, обрабатывает их и ждет дальше.

Выходит что когда я выполняю:

Execute Command ${pathtomockservrunr} -m “${mockservname} MockService” “${pathtosoapproject}”

Кейворд выполняется бесконечно.

В shell я прекращаю работу mockservicerunner.sh путем нажатия Enter.
Как это сделать в роботе?

Попробуйте проделать следующее в linux

nohup pathtomockservrunr -m <params...> > /dev/null 2>&1 & echo $! > /tmp/mock.pid

Запустится mockservice.

Остановить его можно так

kill -15 $(cat /tmp/mock.pid)
3 лайка

Отличное решение.
Насколько я понял & -запустит процесс в фоне, а $! содержит pid запущенного процесса, который передастся в файл mock.pid.

Но еще одна проблема в том что при старте mockservicerunner запускается 2 процесса(mockservicerunner и java).
В принципе я могу их потом найти и убить поочередно.

При запуске в таком формате
выдается ошибка:

[errorlog] java.io.IOException: Not a typewriter (errno:25)

Я использую для запуска и остановки SoapUI следующие shell скрипты:

startServiceRunner.sh:

export SERVICE_RUNNER=/home/webadmin/emulators/ASREmul/soap-ui-4.0.0/bin/mockservicerunner.sh
export PROJECT_FILE=/home/webadmin/emulators/ASREmul/ASREmul/ASR_WS.xml
export PORT=6066
export LOCAL_PATH=/AsrService

OUTPUT=./soapui.log
ERROR=./soapui-errors.log
PIDFILE=./service.pid

${SERVICE_RUNNER} -m"имя_сервиса" -p${PORT} -a${LOCAL_PATH} ${PROJECT_FILE}  >> $OUTPUT 2>> $ERROR &

echo $! > $PIDFILE

kill_by_pid.sh:

cat ./service.pid | xargs kill -9
kill -9 `ps aux | grep ASREmul | awk '{print $2}'`

cat /dev/null > soapui-errors.log
cat /dev/null > soapui.log
cat /dev/null > global-groovy.log
1 лайк

прописал в startServiceRunner.sh пути к PROJECT_FILE, SERVICE_RUNNER, и добавил переменную MOCKSERVICE=“mockservicename MockService”

startServiceRunner.sh:
если заупускаю вручную startServiceRunner.sh то в soapui-errors.log:
Missing SoapUI project file…

export SERVICE_RUNNER=/home/akukha/SoapUI-4.6.4/bin/mockservicerunner.sh
export PROJECT_FILE="/home/akukha/SoapUI-4.6.4/NTF-soapui-project_log_final.xml"
export PORT=8098
export MOCKSERVICE=“NTFNotificationImplPortBinding MockService”

OUTPUT=./soapui.log
ERROR=./soapui-errors.log
PIDFILE=./service.pid

${SERVICE_RUNNER} -m ${MOCKSERVICE} ${PROJECT_FILE} >> $OUTPUT 2>> $ERROR &

echo $! > $PIDFILE

Убери кавычки в PROJECT_FILE, может поможет :slight_smile:

Нет, я и так и так пробовал.
Когда я написал mockservicescript.sh:
./mockservicerunner.sh -m “NTFNotificationImplPortBinding MockService” “/home/akukha/SoapUI-4.6.4/NTF-soapui-project_log_final.xml” &

То при его запуске тоже получаю java.io.IOException: Not a typewriter.
Если в mockservicescript.sh убираю & и запускаю :
./mockservicescript.sh &
то в shell все нормально, процесс продолжает работать в фоне, в soapui.log все пишется нормально.

Но если запускаю в роботе:
${stdout}= Execute Command /home/akukha/SoapUI-4.6.4/bin/mockservicescript.sh &
то ничего не происходит, процесс не запускается, в soapui.log ничего не появляется.

Попробуй скормить shell скрипт напрямую. Как нибудь так: sh /home/akukha/SoapUI-4.6.4/bin/mockservicescript.sh &

И если не секрет, зачем запускать каждый раз сервис? Почему его просто не поднять и не выключать больше?

Такая логика тест-кейсов: сначала создаем запросы, смотрим в бд, потом запускаем процесс, который их обработает/не обработает.

И в любом случае, можно просто запустить процесс вручную, но это тогда не полная автоматизация, хочется чтоб робот делал все сам.

Нашел решение, надо было просто использовать другой кейворд, start command, а не execute command:

Вот так все работает:
Start Command ${pathtomockservrunr} \ -m “${mockservname} MockService” ${pathtosoapproject}
${stdout} Execute Command ps -u ${remotesoaplogin} | grep java
should not be empty ${stdout}
${pid} fetch from left ${stdout} ?
${pid} set variable ${pid.strip()}

Потом выполняю
${stdout} Execute Command kill ${pid}
когда надо будет убить процесс.

Если Вы пошли всё-таки этим путём, то это сэкономит вам 3 строчки кода определения pid

ps -u ${remotesoaplogin} | grep java | awk '{print $1}'

1 лайк