我正在测试一个包含以下代码片段的Python模块。
r, w = os.pipe()
pid = os.fork()
if pid:
os.close(w) # use os.close() to close a file descriptor
r = os.fdopen(r) # turn r into a file object
# read serialized object from ``r`` and persists onto storage medium
self.ofs.put_stream(bucket, label, r, metadata)
os.waitpid(pid, 0) # make sure the child process gets cleaned up
else:
os.close(r)
w = os.fdopen(w, 'w')
# serialize object onto ``w``
pickle.dump(obj, w)
w.close()
sys.exit(0)
return result
所有测试都通过了,但sys.exit(0)
方面存在难度。
当sys.exit(0)
执行时,它会引发SystemExit
,py.test
被py.test
拦截并在控制台中报告为错误。
我不清楚内部py.test
做了什么,但看起来它继续前进并最终忽略了子进程引发的这种事件。最后,所有测试都通过,这很好。
但是我想在控制台中输出一个干净的输出。
有没有办法让{{1}}产生干净的输出?
供您参考:
谢谢:)
答案 0 :(得分:2)
(回答我自己的问题)
您可以终止执行而不会激发与这些事件相关的信号。
因此,使用sys.exit(n)
代替os._exit(n)
,其中n
是所需的状态代码。
示例:
import os
os._exit(0)
币: Is there a way to prevent a SystemExit exception raised from sys.exit() from being caught?
答案 1 :(得分:0)
这就是我用mock解决问题的方法 - 通过这种方法,你可以利用sys.exit
为我们做的所有清理工作
@mock.patch('your.module.sys.exit')
def test_func(mock_sys_exit):
mock_sys_exit.side_effect = SystemExit("system is exiting")
with pytest.raises(SystemExit):
# run function that supposed to trigger SystemExit
答案 2 :(得分:0)
def test_mytest():
try:
# code goes here
# like
# import my_packaage.__main__
# which can raise
# a SystemExit
except SystemExit:
pass
assert(True)
我发现它here。