【问题标题】:How to test Python readline completion?如何测试 Python readline 完成?
【发布时间】:2014-04-01 20:01:44
【问题描述】:

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

虽然在交互模式下一切正常,但我想对完成功能运行自动化测试。我幼稚的第一次尝试涉及使用文件作为标准输入:

my_app < command.file

命令文件包含一个选项卡,希望它能调用完成功能。没运气。进行测试的正确方法是什么?

【问题讨论】:

  • 我可能错了,但我相信 readline 会检测 stdin 是否是终端(而不是从文件或管道重定向),如果不是,它将禁用所有交互功能t.
  • @DenilsonSá:你可能有一些东西。制表符显然是文件输入的一部分,但它不会导致调用完成函数。
  • 您可以编写一个测试来调用您的完成函数并验证输出。它更像是一个单元测试,而不是一个端到端的测试。不完全是你要求的,但已经是一些东西了。 (而且,是的,我也很好奇如何测试交互式文本程序,例如使用 readline 或 ncurses 时)

标签: python readline tab-completion


【解决方案1】:

为此,我将使用Pexpect(Expect 的 Python 版本)。 readline 库需要与终端对话以执行交互式制表符补全等——如果它仅从重定向文件获取单向输入,则无法执行此操作。

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

请参阅示例目录中的程序ftp.py,以获取有关如何在期望范围内控制测试程序的良好示例。以下是代码示例:

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

【讨论】:

    【解决方案2】:

    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

    【讨论】:

      【解决方案3】:

      查看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)
      

      并随意传递参数。

      【讨论】:

        【解决方案4】:

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

        但是,这完全是矫枉过正,需要大量额外的依赖项,工作缓慢,并且如果终端字体/颜色发生变化,则会失败。但是,您仍然可以测试实际的用户交互。

        The documentation homepage 链接到a slideshowa FAQ question 关于使用Sikuli 编写测试。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-25
          • 2015-08-10
          • 2014-01-07
          • 1970-01-01
          相关资源
          最近更新 更多