【问题标题】:Simulate the interaction with a CLI模拟与 CLI 的交互
【发布时间】:2019-05-29 18:39:56
【问题描述】:

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

假设执行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 是一个可用于测试交互式命令的工具。
  • 至于exec运行spawn my-cli start不会与生成的交互式shell交互,我认为它会与运行python代码的进程通信。

标签: bash shell terminal functional-testing end-to-end


【解决方案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 命令。否则,我的期望脚本将在发送日期命令后立即退出,并且不会等待响应。

【讨论】:

  • 我加了一个例子,请看一下。
  • spawn python3 foo.py Expect 应该与运行 python 的进程而不是它的子进程交互时,我错了吗?它们共享相同的文件标识符吗?
猜你喜欢
  • 2019-11-07
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 2019-12-06
相关资源
最近更新 更多