繁体   English   中英

测试交互式python程序

[英]testing interactive python programs

我想知道python的哪些测试工具支持交互式程序的测试。 例如,我有一个应用程序启动:

$ python dummy_program.py 

>> Hi whats your name? Joseph

我想对Joseph以便我能够模仿这种互动行为。

如果您正在测试交互式程序,请考虑使用expect 它专门用于与控制台程序交互(但更多的是用于自动化任务而不是测试)。

如果您不喜欢基于(tcl)的语言,您可以尝试使用pexpect ,这也使得与控制台程序交互变得容易。

你最好的选择可能是依赖注入,所以你通常从sys.stdin中获取的东西(例如)实际上是传入的对象。所以你可能会这样做:

import sys

def myapp(stdin, stdout):
    print >> stdout, "Hi, what's your name?"
    name = stdin.readline()
    print >> stdout "Hi,", name

# This might be in a separate test module
def test_myapp():
    mock_stdin = [create mock object that has .readline() method]
    mock_stdout = [create mock object that has .write() method]
    myapp(mock_stdin, mock_stdout)

if __name__ == '__main__':
    myapp(sys.stdin, sys.stdout)

幸运的是,Python使这很容易。 以下是模拟stdin示例的更详细链接: http//konryd.blogspot.com/2010/05/mockity-mock-mock-some-love-for-mock.html

一个很好的例子可能是IPython包的文件test_embed.py

有两种不同的方法:

import subprocess
# ...
subprocess.Popen(cmd, env=env, stdin=subprocess.PIPE,
                stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate(_exit_cmd_string)

pexpect (已经由Brian Oakley提到过

import pexpect
# ...
child = pexpect.spawn(sys.executable, ['-m', 'IPython', '--colors=nocolor'],
                          env=env)
# ...
child.sendline("some_command")
child.expect(ipy_prompt)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM