当前位置: 首页 > 面试题库 >

在pytest中模拟模块导入

万知
2023-03-14
问题内容

我正在编写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为此用例提供了一个固定装置: monkeypatch.syspath_prepend

您可以sys.path在导入位置列表之前添加路径。编写一个伪造品fwlib.py并将其包括在测试中,并根据需要附加目录。像其他测试模块一样,它不需要包含在发行版中。

在自己玩完这个游戏之后,我实际上无法弄清楚如何使夹具从库代码正确模拟模块级别的导入。在测试运行时,已经导入了库代码,因此修补为时已晚。

不过,我可以提供不同的解决方案,它的工作原理:您可以从内注入的名字conftest.py,其中最先被引进。被测代码中的后续import语句将仅重用中已经存在的对象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


 类似资料:
  • 问题内容: 我想了解如何从导入的模块执行功能。 这是我到目前为止的位置。 app / mocking.py: app / my_module / init.py: 测试/模拟测试.py: 这不 符合 我的预期。“已修补”模块仅返回的未模拟值。如何模拟要导入到被测名称空间中的其他包中的方法? 问题答案: 当您从包中使用装饰器时,您 未在 修补名称空间(从本例中导入模块),而是在被测试的名称空间中对其

  • 我正在用Python开发一个包。我使用虚拟环境。我在我的虚拟环境中的. pth路径中设置了模块的根路径,这样我就可以在开发代码和进行测试的同时导入包的模块(问题1:这是一个好方法吗?)。这工作正常(这里有一个例子,这是我想要的行为): 但是,如果我尝试使用PyTest,则会收到一些导入错误消息: 我有点困惑,看起来这表明了一个导入错误,但是Python做得很好,那么为什么PyTest会有问题呢?对

  • null 如上所示,它导出了一些命名函数,而且重要的是 使用了 。 开玩笑地说,当我为 编写单元测试时,我希望模拟 函数,因为我不希望 中的错误影响我为 编写的单元测试。我的问题是我不确定最好的方法是: 如有任何帮助/洞察力,我们将不胜感激。

  • 问题内容: 我遵循pytest的良好做法,或者至少我 认为自己是 。但是,pytest找不到我的模块。它似乎没有在其中包含当前目录。 源文件: 测试文件: 并使用称为“ p3”的Python 3虚拟环境输出shell。 但是,运行以下命令确实可以正常工作。 我究竟做错了什么? 问题答案: 只需将一个空文件放在项目根目录中: 您的项目结构应变为: 此处发生的情况:发现a时,它将进行修改,以便可以从c

  • 问题内容: 我开始认为这是不可能的,但是无论如何我都想问。 我想测试我的一个ES6模块以特定方式调用另一个ES6模块。有了茉莉花,这非常容易- 应用程式码: 和测试代码: 笑话相当于什么?我觉得这是一件很想做的简单的事,但是我一直在努力尝试弄清头发。 我最接近的是将s 替换为s,并将其移入测试/函数中。都不是我想做的事情。 为了获得加分,我希望在其中的功能为默认导出时使整个工作正常进行。但是,我知

  • 问题内容: 我正在编写一个小脚本,该脚本从目录获取文件名,并将其传递给另一个模块,然后该模块导入文件。 因此流程类似于1)获取模块名称(将其存储在变量中)2)将此变量名称传递给模块3)导入名称存储在变量名称中的模块 我的代码就像 问题在于,当它到达import语句时,它将modulename读取为真实的模块名称,而不是存储在此变量中的值。我不确定这在python中如何工作,解决这个问题的任何帮助都