通过 Paramiko 使用 ncurses python 应用程序的 python 进行黑盒测试

Blackbox test with python of a ncurses python app via Paramiko

我处于一个奇怪的位置,既是我们项目的 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() 都会将其打印到标准错误,并附上一条有关 curses 初始化的消息:

...
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 真的很想 input/output 到 终端 /dev/null 不是终端,在这种情况下某些终端 I/O 模式更改将失败。偶尔有人将 I/O 连接到套接字,ncurses 将(通常)在这种情况下工作。

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