如何测试Python的readline补全?
我正在用Python写一个命令行界面。这个界面使用了readline模块,能提供命令历史和自动补全的功能。
在交互模式下,一切都运行得很好,但我想对自动补全这个功能进行自动化测试。我第一次尝试的方法很简单,就是用一个文件作为标准输入:
my_app < command.file
这个命令文件里包含了一个制表符,我希望这样能触发自动补全功能。但结果并不如我所愿。那我该怎么正确地进行测试呢?
4 个回答
0
看看这个网站 ScriptTest:
from scripttest import TestFileEnvironment
env = TestFileEnvironment('./scratch')
def test_script():
env.reset()
result = env.run('do_awesome_thing testfile --with extra_win --file %s' % filename)
你可以随意尝试传递参数,玩得开心点。
1
rlcompleter可能可以实现你想要的功能
根据文档:
rlcompleter模块是为Python的交互模式设计的。用户可以在自己的初始化文件中添加以下几行代码(这个文件由PYTHONSTARTUP环境变量指定),这样就可以实现自动的Tab键补全功能:
try:
import readline
except ImportError:
print "Module readline not available."
else:
import rlcompleter
readline.parse_and_bind("tab: complete")
5
为了这个目的,我会使用Pexpect(这是Expect在Python中的版本)。readline库需要和终端进行互动,才能实现像自动补全这样的功能。如果只是从一个重定向的文件中获取单向输入,它就无法做到这一点。
Pexpect之所以能做到这一点,是因为它创建了一个伪终端,这个伪终端分为两个部分:一个是从属端(slave),也就是你要测试的程序运行的地方;另一个是主端(master),也就是运行Pexpect代码的地方。Pexpect代码就像一个人一样在运行测试程序。它负责向从属端发送字符,包括换行符和制表符等,并对预期的输出做出反应(这就是“expect”这个词的来源)。
你可以查看ftp.py
这个示例程序,里面有一个很好的例子,展示了如何在expect中控制你的测试程序。以下是代码的一个示例:
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> ')