我正在编写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中如何工作,解决这个问题的任何帮助都