python - 如何在python中模拟/单元测试以下代码?
问题描述
我将如何对以下内容进行单元测试?
def sigterm_handler(signum, frame):
pid = os.getpid() # type: int
sys.exit(0)
signal.signal(signal.SIGTERM, sigterm_handler)
我应该模拟并确保调用模拟吗?
解决方案
我会编写一个测试,在一个子进程中运行你的代码,它可以检查你是否成功终止。
例如,假设您的问题代码位于名为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
并获取返回值。通过使用包装脚本,您可以控制代码的加载和运行方式。您不需要模拟任何东西,只需确保您的包设置正确,并且您的测试运行程序不会尝试将包装脚本作为测试。
推荐阅读
- python - Python - 在后台监听键绑定
- python - python 2.7:如何 grep/拆分包含模式的行
- vba - 使用VBA更改Word文档表字符串中单个单词的颜色以匹配单元格颜色
- perl - 找不到 OpenSSL 如果已经安装,请相应设置 OPENSSL_PREFIX 环境变量
- mysql - AWS RDS MySQL 检索某些表的数据超时
- java - 使用给定坐标创建三角形图像
- django - Firefox 发送的每个请求都会触发 ConnectionResetError
- html - 如果可以在没有画布的情况下为图像像素化设置动画,则仅使用 CSS
- google-bigquery - 计算具有 2 个 where 条件的唯一条目 - bigquery
- bootstrap-datepicker - bootstrap-datepicker 在移动设备上使用时缺少列