Имитация взаимодействия с CLI - PullRequest
0 голосов
/ 29 мая 2019

У меня есть 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"

1 Ответ

0 голосов
/ 30 мая 2019

Как упомянуто в комментарии Бенджамина. Я и многие другие использовали expect в этом сценарии. Пока вы можете сказать текст, который будет представлен в терминале, вы можете использовать следующие веб-страницы в качестве руководства для создания сценария ожидаемого.

Обновление на основе предоставленного примера. Для этого у меня есть файл foo.py:

import subprocess


process = subprocess.Popen(['/bin/bash', '-i'], shell=False)
process.communicate()

Файл ожидания (ожидаемый-пример.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 в конце скрипта. В противном случае мой ожидаемый сценарий завершится, как только отправит команду date, и не будет ждать ответа.

...