黑盒测试与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,它将按我的预期工作。

+0

你尝试用'client.invoke_shell()'呢?或者可以使用依赖paramiko并与终端良好搭配的结构远程运行命令。 – fernandezcuesta

ncurses真的想输入/输出到终端/dev/null不是终端,在这种情况下,某些终端I/O模式更改将失败。偶尔有人将I/O连接到套接字,并且ncurses将(通常)在这种情况下工作。

在您的环境中,除了缺少终端外,TERM可能未被设置。这将使setupterm失败。

+0

就是这样。 TERM变量需要设置为某些东西。我调查并显然Paramiko默认情况下UNSET它在exec_command()调用。相反,在本地终端,我得到TERM = linux和SSH连接,我得到TERM = xterm。因此,要启用您必须调用client.exec_command(,get_pty = True)。 – CaptainPhlegm