【问题标题】:Is it possible to test a function which uses `os._exit()`?是否可以测试使用 `os._exit()` 的函数?
【发布时间】:2017-12-24 09:34:16
【问题描述】:

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

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

make: *** [test] Error 2

这可能是由于函数调用os._exit(2)

【问题讨论】:

  • 万不得已,如果找不到更好的解决方案,只需覆盖 os._exit 方法:repl.it/J82h/0
  • 您只是想测试函数调用 os._exit(2),还是要测试实际退出?如果是前者,您可以按照 bakatrouble 建议的方式模拟该功能。但如果是后者,您可能必须编写一个单独的程序来调用该函数,并使用os.system 或其他方式测试调用该程序以验证它是否使用该代码退出。
  • 我要测试的函数是一个自定义错误函数:一旦调用,它会记录错误消息,然后调用os._exit(2)。我想测试日志记录部分和退出部分。因为我只应该测试这个模块,所以我不能真正接触代码。
  • 附带说明:如果您在函数中使用os._exit,那么您的架构可能有问题。为什么不能引发在顶层捕获的异常?在某个时候杀死某个进程会适得其反,因为您没有最终确定状态。
  • 正如我所说,我只是一个测试人员,我不应该接触被测试的代码。此外,这个项目中使用了叉子,我读过 os._exit() 经常与叉子一起使用。

标签: python unit-testing python-unittest nose


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    os.system() 返回值包含高 8 位的退出代码,因此您可以这样检查外部脚本的退出代码:

    import os
    
    assert os.system('python script.py') >> 8 == 2
    

    你也可以用sys.exit()模拟os._exit()

    import os, sys
    import script
    
    os._exit = sys.exit
    script.tested_method()  # raises SystemExit
    

    【讨论】:

    • 我试过的the solution似乎模拟效果很好。这是我不知道的测试的一个巧妙的小技巧。感谢您的帮助!
    • 模拟可以完成这项工作,但它不会完全复制原始行为。您可能会认为 os._exit() 已经通过解释器测试工具进行了测试。
    猜你喜欢
    • 2019-09-20
    • 2022-08-19
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2019-04-18
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多