У меня есть CLI, который может запускать процессы, особенно интерактивные оболочки и ждет их, их можно закрыть с помощью того же CLI. Мне нужно создать для него сквозные тесты с помощью bash, но я не вижу, как имитировать выполнение в терминале; вывод должен быть отправлен в процесс на «переднем плане».
Предположим, что выполнение my-cli start
запускает скрипт Python, который запускает подпроцесс (запускает интерактивную оболочку) и ожидает его.
в сценарии тестирования exec(my-cli start)
заменит текущий процесс процессом, выполняющим скрипт Python, а не интерактивной оболочкой, поэтому после этого я не могу взаимодействовать с интерактивной оболочкой.
Я думал об использовании каналов, но я думаю, что что-то, что может имитировать использование терминала, будет лучше, есть идеи?
Пример:
Предположим, код моего CLI (cli.py
):
import subprocess
process = subprocess.Popen(['/bin/bash', '-i'], shell=False)
process.communicate()
Используя expect
Не знаю, можно ли общаться с интерактивной оболочкой (/bin/bash -i
)
#!/usr/bin/expect -f
spawn python3 cli.py
#expect eof
send -- "echo $$\r"
Что касается exec
запуска spawn my-cli start
, он не будет взаимодействовать с порожденной интерактивной оболочкой, я думаю, он будет взаимодействовать с процессом, выполняющим код Python.
Как упоминалось в комментарии Бенджамина. Я и многие другие использовали expect
в этом сценарии. Пока вы можете сказать текст, который будет представлен в терминале, вы можете использовать следующие веб-страницы в качестве руководства по созданию сценария ожидания.
Обновление на основе предоставленного примера. Для этого у меня есть файл foo.py:
import subprocess
process = subprocess.Popen(['/bin/bash', '-i'], shell=False)
process.communicate()
Ожидаемый файл (expect-example.exp):
#!/usr/bin/expect
spawn python3 foo.py
expect "*bash*"
send "date\r"
send "exit\r"
interact
Когда я запускаю это expect expect-example.exp
, я получаю следующее:
$ expect expect-example.exp
spawn python3 foo.py
bash-3.2$ date
Mon 3 Jun 2019 14:03:37 BST
bash-3.2$ exit
exit
$
Стоит отметить, что, учитывая, что я запускаю одну команду date
и хочу увидеть ее результат, я должен включить команду interact
в конец скрипта. В противном случае мой сценарий ожидания завершится, как только он отправит команду даты, и не будет ждать ответа.
Я добавил пример, пожалуйста, посмотрите.
когда spawn python3 foo.py
Expect должен взаимодействовать с процессом, выполняющим Python, а не с его подпроцессом, я ошибаюсь? они имеют одинаковые идентификаторы файлов?