Моделирование взаимодействия с помощью CLI

У меня есть 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"
Ожидать — это инструмент, который можно использовать для тестирования интерактивных команд.
Benjamin W. 29.05.2019 20:44

Что касается exec запуска spawn my-cli start, он не будет взаимодействовать с порожденной интерактивной оболочкой, я думаю, он будет взаимодействовать с процессом, выполняющим код Python.

Tor Tor 29.05.2019 23:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
148
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Я добавил пример, пожалуйста, посмотрите.

Tor Tor 31.05.2019 12:00

когда spawn python3 foo.py Expect должен взаимодействовать с процессом, выполняющим Python, а не с его подпроцессом, я ошибаюсь? они имеют одинаковые идентификаторы файлов?

Tor Tor 07.06.2019 01:15

Другие вопросы по теме