测试交互式Python程序

10

我想知道Python中哪些测试工具支持交互式程序的测试。例如,我有一个通过以下方式启动的应用程序:

$ python dummy_program.py 

>> Hi whats your name? Joseph

我想要对 Joseph 进行工具化,以便我可以模拟那种交互式的行为。

3个回答

2
如果您正在测试交互式程序,请考虑使用expect。它专门设计用于与控制台程序进行交互(虽然更多是用于自动化任务而不是测试)。
如果您不喜欢基于TCL的Expect语言,可以尝试pexpect,它也可以轻松地与控制台程序进行交互。

1
你最好的选择可能是依赖注入,这样你通常从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


1
确实,依赖注入是正确的方法。尽管如此,如果由于某种奇怪的原因他无法更改代码,他可以直接使用 sys.stdin = mock_stdinsys.stdout = mock_stdout 更改标准输入和输出。如果在测试期间需要原始值,他可以使用 sys.__stdin__sys.__stdout__ 来保留原始值。 - PaoloVictor

0
一个很好的例子可能是IPython包中的文件test_embed.py
这里使用了两种不同的方法: subprocess
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接