首页 > 解决方案 > 如何在python中模拟/单元测试以下代码?

问题描述

我将如何对以下内容进行单元测试?

def sigterm_handler(signum, frame):
    pid = os.getpid()  # type: int
    sys.exit(0)

signal.signal(signal.SIGTERM, sigterm_handler)

我应该模拟并确保调用模拟吗?

标签: pythonunit-testing

解决方案


我会编写一个测试,在一个子进程中运行你的代码,它可以检查你是否成功终止。

例如,假设您的问题代码位于名为signals.py. 您可以编写如下所示的测试包装模块:

test_signals_wrapper.py

from time import sleep
from sys import exit

# import this last to ensure it overrides any prior settings
import signals

while True:
    sleep(1)

exit(1)  # just in case the loop ends for other reasons

现在您可以编写如下所示的单元测试:

test_signals.py

from subprocess import run, TimeoutExpired
from sys import executable

def test_sigterm_handler():
    try:
        status = run([executable, '-m', 'test_signals_wrapper'], timeout=30)
    except TimeoutExpired:
        assert False, 'Did not trigger assertion in 30 seconds'

    assert status.returncode == 0, f'Wrong return code: {status.returncode}'

这需要一些额外的基础设施来进行测试,但它解决了测试此代码的所有问题。通过在子进程中运行,可以自由执行sys.exit并获取返回值。通过使用包装脚本,您可以控制代码的加载和运行方式。您不需要模拟任何东西,只需确保您的包设置正确,并且您的测试运行程序不会尝试将包装脚本作为测试。


推荐阅读