我正在为下一个函数编写测试:
def foo():
print 'hello world!'
Run Code Online (Sandbox Code Playgroud)
所以,当我想测试这个函数时,代码将是这样的:
import sys
from foomodule import foo
def test_foo():
foo()
output = sys.stdout.getline().strip() # because stdout is an StringIO instance
assert output == 'hello world!'
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用-s参数运行nosetests,测试会崩溃.如何通过unittest或nose模块捕获输出?
为什么这么多assertEquals()
或类似的函数将期望值作为第一个参数而实际的函数作为第二个参数?
这对我来说似乎是违反直觉的,所以这种不寻常的订单有什么特别的原因吗?
我试过了
from mock import Mock
import __builtin__
__builtin__.print = Mock()
Run Code Online (Sandbox Code Playgroud)
但这会引发语法错误.我也试过修补它
@patch('__builtin__.print')
def test_something_that_performs_lots_of_prints(self, mock_print):
# assert stuff
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
这个问题给出了 order assertEqual(expected, actual)
,尽管是 unittest 包。
但是 Pycharm 和 pytest 会根据 order 打印出“Expected:...”和“Actual...” actual==expected
。
这令人困惑。pytest 的正确顺序是什么?源代码和在线文档就不说了。
(我还注意到 JUnit 和 TestNG 不同意这一点。)
python ×3
unit-testing ×2
assert ×1
debugging ×1
mocking ×1
nosetests ×1
pytest ×1
python-2.x ×1
python-nose ×1