Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以测试使用“os.\u exit()”的函数?_Python_Unit Testing_Python Unittest_Nose - Fatal编程技术网

Python 是否可以测试使用“os.\u exit()”的函数?

Python 是否可以测试使用“os.\u exit()”的函数?,python,unit-testing,python-unittest,nose,Python,Unit Testing,Python Unittest,Nose,我想测试一个函数是否在失败时执行os.\u退出(2)。我已经看到了许多使用sys.exit()和SystemExit的解决方案。我已经阅读了和文档,似乎os.\u exit()没有使用SystemExit 尽管如此,我已经试过了,以防我对文档有误解,但这只是测试,甚至不是测试失败: make: *** [test] Error 2 这可能是由于函数调用了操作系统。_exit(2)os.system()返回值包含8位以上的退出代码,因此可以通过以下方式检查外部脚本的退出代码: import os

我想测试一个函数是否在失败时执行
os.\u退出(2)
。我已经看到了许多使用
sys.exit()
SystemExit
的解决方案。我已经阅读了和文档,似乎
os.\u exit()
没有使用
SystemExit

尽管如此,我已经试过了,以防我对文档有误解,但这只是测试,甚至不是测试失败:

make: *** [test] Error 2
这可能是由于函数调用了操作系统。_exit(2)

os.system()
返回值包含8位以上的退出代码,因此可以通过以下方式检查外部脚本的退出代码:

import os

assert os.system('python script.py') >> 8 == 2
您还可以使用
sys.exit()
模拟
os.\u exit()


unittest.mock.MagicMock
对象可以轻松检查函数是否已被调用,而无需它们执行默认行为

from unittest import mock
import os

def funcToTest():
    os.exit(2)

def test_func():
    os._exit = mock.MagicMock()
    funcToTest()
    assert os._exit.called

作为最后手段,如果您找不到更好的解决方案,只需覆盖
os.\u exit
方法:您只想测试函数调用
os.\u exit(2)
,还是要测试实际退出?如果是前者,您可以按照bakatrouble的建议模拟函数。但是如果是后者,您可能必须编写一个单独的程序来调用该函数,并使用
os.system
或其他方法测试调用该程序,以验证它是否与该代码一起退出。我要测试的函数是一个自定义错误函数:一旦调用,它将记录错误消息,然后调用
os。_exit(2)
。我想测试日志部分和退出部分。因为我只需要测试这个模块,所以我不能真正接触代码。顺便说一句:如果在函数中使用
os.\u exit
,那么您的架构可能有问题。为什么不能引发在顶级捕获的异常?在某个时候终止某个进程会适得其反,因为您没有完成状态。正如我所说的,我只是一个测试人员,我不应该接触测试过的代码。此外,在这个项目中使用了fork,我已经读到os.\u exit()经常用于fork子项。我试过,这个mock似乎可以很好地使用。这是一个我不知道的测试小技巧。谢谢你的帮助!模仿可以做到这一点,但它不能完全复制原始行为。您可能会假设
os.\u exit()
已经通过解释器测试工具进行了测试。
from unittest import mock
import os

def funcToTest():
    os.exit(2)

def test_func():
    os._exit = mock.MagicMock()
    funcToTest()
    assert os._exit.called