【发布时间】:2016-06-16 13:56:09
【问题描述】:
我处于一个奇怪的位置,既是我们项目的 Python 实用程序的开发人员,又是它的测试人员。 该应用程序已准备就绪,现在我想编写几个黑盒测试,连接到它所在的服务器(服务器本身就是我们商业化的产品),然后启动 python 应用程序。
python 应用程序允许编写最少的命令行脚本(一些参数会自动启动功能,否则这些功能需要用户在主菜单上进行交互)。对于残留的用户交互,我通常会尝试这样的 bash 语法:
./app -f <<< $'parameter1\nparameter2\n\n'
最后我将所有内容重定向到 >/dev/null。 如果我在服务器上的命令行(通过 SSH 连接)进行手动检查,一切都会顺利进行。应用启动持续 30 秒,30 秒后我正确返回到提示符。
现在进入黑盒测试部分。这里我也使用 python(Py.test 框架),但测试代码驻留在另一台机器上。 测试运行机器将通过 Paramiko 库连接到被测服务器。我已经在为产品的其他功能编写脚本时大量使用了它,而且效果很好。
但在这种情况下的问题是,我在 python 中编写的被测应用程序在其正常行为(“import curses”)中使用了 NCurses 库,并且显然是在尝试在 Py.test 脚本中启动它时:
import paramiko
...
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.load_system_host_keys()
client.connect(myhost, myuser, mypass, mytimeout)
client.exec_command("./app -f <<< $'parameter1\nparameter2\n\n' >/dev/null")
无论重定向到 /dev/null,.exec_command() 都会将其打印到标准错误中,并显示有关诅咒初始化的消息:
...
File "/my/path/to/app", line xxx, in curses_screen
scr = curses.initscr()
...
_curses.error: setupterm: could not find terminal
最后 py.test 脚本因为应用执行崩溃而失败。
curses(由被测应用程序使用)和 paramiko(由测试脚本使用)之间是否存在冲突?正如我所说,如果我通过 SSH 手动连接到应用程序所在的服务器并手动启动命令行并静默重定向到 /dev/null,它会按我的预期工作。
【问题讨论】:
-
您尝试改用
client.invoke_shell()吗?或者可以使用fabric远程运行命令,它依赖于paramiko并且可以很好地与终端配合。
标签: python bash ssh paramiko curses