模拟与 CLI 的交互

Simulate the interaction with a CLI

我有一个 CLI 可以启动进程,尤其是交互式 shells 并等待它们,它们可以使用相同的 CLI 关闭。我需要使用 bash 为它创建一些端到端测试,但我看不到如何在终端中模拟执行;输出应发送到 "foreground".

中的进程

假设执行 my-cli start 会启动一个 python 脚本来启动一个子进程(运行 一个交互式 shell)并等待它。 在测试脚本中,exec(my-cli start) 会将当前进程替换为进程 运行 python 脚本而不是交互式 shell,因此我无法与交互式 shell 进行交互]之后。

我考虑过使用管道,但我认为可以使用终端模拟的东西会更好,有什么想法吗?

示例:

假设我的 CLI (cli.py) 的代码是:

import subprocess


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

正在使用expect 不知道是否可以用交互shell(/bin/bash -i)

#!/usr/bin/expect -f


spawn python3 cli.py

#expect eof

send -- "echo $$\r"

正如本杰明在评论中提到的那样。我和许多其他人在这种情况下使用了 expect。只要您知道将在终端中显示的文本,您就可以使用以下网页作为创建 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 命令的脚本。否则,我的期望脚本会在发送日期命令后立即退出,不会等待响应。