如何测试Python的readline补全?

13 投票
4 回答
1747 浏览
提问于 2025-04-18 00:55

我正在用Python写一个命令行界面。这个界面使用了readline模块,能提供命令历史和自动补全的功能。

在交互模式下,一切都运行得很好,但我想对自动补全这个功能进行自动化测试。我第一次尝试的方法很简单,就是用一个文件作为标准输入:

my_app < command.file

这个命令文件里包含了一个制表符,我希望这样能触发自动补全功能。但结果并不如我所愿。那我该怎么正确地进行测试呢?

4 个回答

0

你可以试试用 Sikuli 来测试用户和你应用之间的互动。

不过,这个方法有点过于复杂,需要很多额外的东西,而且运行速度会比较慢。如果终端的字体或颜色改变,它可能就会出问题。不过,使用这个工具,你还是能测试到用户的真实操作。

这个文档主页里有链接到 一个幻灯片一个常见问题,这些内容都是关于如何用Sikuli写测试的。

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")

https://docs.python.org/2/library/rlcompleter.html

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> ')

撰写回答