测试交互式Python程序

10 投票
3 回答
3137 浏览
提问于 2025-04-16 10:07

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

$ python dummy_program.py 

>> Hi whats your name? Joseph

我想对Joseph进行一些设置,这样我就可以模拟那种互动的行为。

3 个回答

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

2

如果你在测试一个互动程序,可以考虑使用expect。这个工具专门用来和控制台程序互动(不过,它更侧重于自动化任务,而不是测试)。

如果你不喜欢expect使用的语言(tcl),可以试试pexpect,它同样可以让你轻松地和控制台程序互动。

撰写回答