【问题标题】:Blackbox test with python of a ncurses python app via Paramiko通过 Paramiko 使用 ncurses python 应用程序的 python 进行黑盒测试
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 就是这样。 TERM 变量需要设置为某个值。我进行了调查,显然 Paramiko 默认在 exec_command() 调用中取消设置它。相反,在本地终端上我得到 TERM=linux,在 SSH 连接上我得到 TERM=xterm。因此,要启用,您必须调用 client.exec_command(, get_pty=True)。
猜你喜欢
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
相关资源
最近更新 更多