python - 在 pytest 中模拟模块导入

标签 python pytest

我正在编写一个 pytest 插件,它应该测试旨在在一组特定环境中工作的软件。

我正在编写的软件在一个更大的框架内运行,这使得某些 Python 模块只有在框架内运行我的 Python 软件时才可用。

为了测试我的软件,我需要“模拟”或伪造整个模块(实际上,相当多)。我需要以某种类似的方式实现它的功能,但我的问题是我应该如何使用 py.test 插件使这个假 Python 模块可用于我的软件代码?

例如,假设我的源文件之一中有以下代码:

import fwlib

def fw_sum(a, b):
    return fwlib.sum(a, b)

然而,fwlib模块仅由我运行软件的框架提供,我无法在其中进行测试。

我如何从 pytest 插件中确保名为 fwlib 的模块已在 sys.modules 中定义?当然,我需要实现 fwlib.sum我。我正在寻找有关如何做到这一点的建议。

最佳答案

pytest 为这个用例提供了一个 fixture : monkeypatch.syspath_prepend .
您可以在 sys.path 前面加上路径进口地点 list 。写假 fwlib.py并将其包含在您的测试中,并根据需要附加目录。与其他测试模块一样,它不需要包含在发行版中。
在自己玩这个之后,我实际上无法弄清楚如何让 fixture 从库代码中正确地模拟模块级导入。到测试运行时,库代码已经导入,现在修补已经太晚了。
但是,我可以提供一个不同的解决方案:您可以从 conftest.py 中注入(inject)名称。 , which gets imported first .被测代码中的后续导入语句将仅重用已存在于 sys.modules 中的对象。 .
封装结构:

$ tree .
.
├── conftest.py
├── lib
│   └── my_lib.py
└── tests
    └── test_my_lib.py

2 directories, 3 files
文件内容:
# conftest.py
import sys

def fwlib_sum(a, b):
    return a + b

module = type(sys)('fwlib')
module.sum = fwlib_sum
sys.modules['fwlib'] = module
库文件:
# lib/my_lib.py
import fwlib

def fw_sum(a, b):
    return fwlib.sum(a, b)
测试文件:
# lib/test_my_lib.py
import my_lib

def test_sum():
    assert my_lib.fw_sum(1, 2) == 3

关于python - 在 pytest 中模拟模块导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58226796/

相关文章:

python - cProfile 在调用 numba jit 函数时会增加大量开销

python - Matplotlib:绘制数据然后进行时间序列预测

python - 使用 pytest 时出现 “indirect fixture” 错误。怎么了?

python - 无法从命令行调用 py.test <module_name>.py?

Python:压缩目录中的所有文件夹

Python:列表理解无法正常工作

python-3.x - 使用 pytest 运行 trace.py

python - 我可以指定在 .coveragerc 中运行哪些测试文件吗?

python - python读取大数据的不同方式

python - Moto 警告 : Use ec2_backend. describe_images() 为您的测试找到合适的图像