如何测试Python读线完成?

如何测试Python读线完成?,python,readline,tab-completion,Python,Readline,Tab Completion,我正在用Python编写一个命令行界面。它使用readline模块提供命令历史记录和完成 虽然在交互模式下一切都很好,但我想在完成功能上运行自动测试。我天真的第一次尝试涉及使用文件进行标准输入: my_app < command.file my_app

我正在用Python编写一个命令行界面。它使用readline模块提供命令历史记录和完成

虽然在交互模式下一切都很好,但我想在完成功能上运行自动测试。我天真的第一次尝试涉及使用文件进行标准输入:

my_app < command.file
my_app
命令文件包含一个选项卡,希望它能够调用完成功能。不走运。测试的正确方法是什么?

查看:

然后随意传递参数。

您可以尝试使用测试最终用户与应用程序的交互

然而,这完全是一种过激行为,需要大量额外的依赖项,工作速度很慢,如果终端字体/颜色发生变化,则会失败。但是,您仍然能够测试实际的用户交互


关于使用Sikuli编写测试的链接

rlcompleter可能会实现您想要的

从文件中:

rlcompleter模块设计用于Python的交互模式。用户可以将以下行添加到其初始化文件(由PYTHONSTARTUP环境变量标识)中,以获得自动制表符完成:

try:
    import readline
except ImportError:
    print "Module readline not available."
else:
    import rlcompleter
    readline.parse_and_bind("tab: complete")

为此,我将使用(Expect的Python版本)。readline库需要与终端对话以完成交互式选项卡,因此,如果它仅从重定向文件获取单向输入,则无法完成此操作

Pexpect之所以能做到这一点,是因为它创建了一个伪终端,它由两部分组成:从端(您正在测试的程序运行的地方)和主端(Python Pexpect代码运行的地方)。pexpect代码模拟运行测试程序的人员。它负责向从机发送字符,包括换行符和制表符等字符,并对预期输出作出反应(这就是短语“expect”的来源)

有关如何从expect中控制测试程序的示例,请参阅examples目录中的程序。以下是代码示例:

child = pexpect.spawn('ftp ftp.openbsd.org')
child.expect('(?i)name .*: ')
child.sendline('anonymous')
child.expect('(?i)password')
child.sendline('pexpect@sourceforge.net')
child.expect('ftp> ')

我可能错了,但我相信readline会检测到stdin是否是终端(而不是从文件或管道重定向),如果不是,它会禁用所有交互功能。@DenilsonSá:你可能有一些东西。tab字符显然是文件输入的一部分,但它不会导致调用completer函数。您可以编写一个调用completion函数并验证输出的测试。它将更像一个单元测试,而不像端到端测试。不完全是你想要的,但已经有些东西了。(是的,我也很好奇如何测试交互式文本程序,比如在使用readline或ncurses时)
child = pexpect.spawn('ftp ftp.openbsd.org')
child.expect('(?i)name .*: ')
child.sendline('anonymous')
child.expect('(?i)password')
child.sendline('pexpect@sourceforge.net')
child.expect('ftp> ')