黑盒测试与python的ncurses python应用程序通过Paramiko
我处于一个奇怪的位置,既是我们的项目的python实用程序的开发人员,也是它的测试人员。 该应用程序已准备就绪,现在我想编写几个连接到它驻留的服务器的黑盒测试(服务器本身就是我们商业化的产品),并启动python应用程序。黑盒测试与python的ncurses python应用程序通过Paramiko
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,它将按我的预期工作。
ncurses真的想输入/输出到终端。 /dev/null
不是终端,在这种情况下,某些终端I/O模式更改将失败。偶尔有人将I/O连接到套接字,并且ncurses将(通常)在这种情况下工作。
在您的环境中,除了缺少终端外,TERM
可能未被设置。这将使setupterm
失败。
就是这样。 TERM变量需要设置为某些东西。我调查并显然Paramiko默认情况下UNSET它在exec_command()调用。相反,在本地终端,我得到TERM = linux和SSH连接,我得到TERM = xterm。因此,要启用您必须调用client.exec_command(
你尝试用'client.invoke_shell()'呢?或者可以使用依赖paramiko并与终端良好搭配的结构远程运行命令。 – fernandezcuesta