我想知道python的哪些测试工具支持交互式程序的测试。例如,我有一个由以下人员发起的应用程序:
$ python dummy_program.py
>> Hi whats your name? Joseph
我想设法Joseph
,以便我可以模仿这种互动行为。
答案 0 :(得分:2)
如果您正在测试交互式程序,请考虑使用expect。它专门用于与控制台程序交互(但更多的是用于自动化任务而不是测试)。
如果您不喜欢基于(tcl)的语言,您可以尝试pexpect,这也可以轻松地与控制台程序进行交互。
答案 1 :(得分: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 :(得分:0)
一个很好的例子可能是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)