如何模拟 pyunit 的 stdin 输入?
我正在尝试测试一个从 stdin
获取输入的函数,我目前正在使用类似这样的内容进行测试:
cat /usr/share/dict/words | ./spellchecker.py
以测试自动化的名义,有什么方法可以使 pyunit
code> 可以伪造 raw_input()
的输入吗?
I'm trying to test a function that takes input from stdin
, which I'm currently testing with something like this:
cat /usr/share/dict/words | ./spellchecker.py
In the name of test automation, is there any way that pyunit
can fake input to raw_input()
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
简短的答案是monkey patch
raw_input()
。如何在中显示重定向的标准输入的答案中有一些很好的例子Python?
这是一个简单、琐碎的示例,使用 lambda 丢弃提示并返回我们想要的内容。
被测系统
测试用例:
The short answer is to monkey patch
raw_input()
.There are some good examples in the answer to How to display the redirected stdin in Python?
Here is a simple, trivial example using a
lambda
that throws away the prompt and returns what we want.System Under Test
Test case:
更新——使用unittest.mock.patch
从python 3.3开始,有一个名为mock的
unittest
新子模块,它完全可以完成您需要做的事情。对于使用 python 2.6 或更高版本的用户,可以在 此处mock 的反向移植>。先前的答案 - 替换 sys.stdin
我认为 sys 模块可能就是您正在寻找的。
您可以执行类似
raw_input 的操作,现在无论何时调用它,都会从simulatedInput.txt 中读取它。如果simulatedInput的内容是
,那么第一次调用raw_input将返回“hello”,第二个“bob”和第三个将抛出EOFError,因为没有更多文本可供读取。
Update -- using unittest.mock.patch
Since python 3.3 there is new submodule for
unittest
called mock that does exactly what you need to do. For those using python 2.6 or above there is a backport ofmock
found here.Previous answer -- replacing sys.stdin
I think the sys module might be what you're looking for.
You can do something like
raw_input will now read from simulatedInput.txt whenever it is called. If the contents of simulatedInput was
then the first call to raw_input would return "hello", the second "bob" and third would throw an EOFError as there was no more text to read.
您没有描述
spellchecker.py
中的代码类型,这让我可以自由推测。假设它是这样的:
为了提高
check_stdin
函数的可测试性,我建议像这样重构它:现在大部分逻辑都在
check
函数中,你可以手动 -制作您可以想象的任何输入,以便正确测试它,而无需处理stdin
。我的2分钱。
You didn't describe what sort of code is in
spellchecker.py
, which gives me freedom to speculate.Suppose it's something like this:
To improve testability of
check_stdin
function, I propose to refactor it like so:Now most of your logic is in
check
function, and you can hand-craft whatever input you can imagine in order to test it properly, without any need to deal withstdin
.My 2 cents.
将
sys.stdin
替换为StringIO
实例,并使用您想要通过sys.stdin< 返回的数据加载
。StringIO
实例/代码>。此外,sys.__stdin__包含原始的sys.stdin对象,因此在测试后恢复sys.stdin就像sys一样简单.stdin = sys.__stdin__Fudge 是一个很棒的 python 模拟模块,具有方便的装饰器,可以为您进行此类修补,并具有自动清理功能。你应该检查一下。
Replace
sys.stdin
with an instance ofStringIO
, and load theStringIO
instance with the data you want returned viasys.stdin
. Also,sys.__stdin__
contains the originalsys.stdin
object, so restoringsys.stdin
after your test is as simple assys.stdin = sys.__stdin__
.Fudge is a great python mock module, with convenient decorators for doing patching like this for you, with automatic cleanup. You should check it out.
如果您使用 mock 模块(由 Michael Foord 编写),按顺序要模拟 raw_input 函数,您可以使用如下语法:
If you are using mock module (written by Michael Foord), in order to mock raw_input function you can use syntax like: