gpt4 book ai didi

python - 如何在pytest中导入函数

转载 作者:行者123 更新时间:2023-12-01 02:02:44 25 4
gpt4 key购买 nike

我正在尝试为 Python 2.x 脚本可执行文件创建一个 pytest ,其名称中包含破折号。我尝试以通常的方式导入它,但我不知道如何使其与破折号一起使用。

我的项目结构如下:

package
-- tests
-- bin
-- subpackage
-- ...py

具体来说,我需要测试一个名为 master_disaster() 的函数,该函数存在于 bin/let-me-out 中(是的,- )。 let-me-out 是一个可执行的 .py 文件,而我的文件夹没有 setup.py 文件或类似文件。

如何在我的测试中导入这个函数?我的测试将是一个简单的装置,用于检查时间:

@pytest.fixture
def now():
return timezone.now()

然后,它使用 now() 函数创建一个新文件,let-me-out 将在特定时间后删除该文件。

最佳答案

首先,破折号使 Python 中的 let-me-out 单词成为无效标识符。要解决这个问题,您必须调用 imp (Python 2.7) 或 importlib (Python 3.5+) 机制。

Python 3.5+

以下是导入具有限定名称 let_me_out 的新模块的示例,但使用 bin/let-me-out 作为源文件:

import importlib


def test_master_disaster():
loader = importlib.machinery.SourceFileLoader('let_me_out', 'bin/let-me-out')
spec = importlib.util.spec_from_loader(loader.name, loader)
let_me_out = importlib.util.module_from_spec(spec)
loader.exec_module(let_me_out)
# this is only a stub, to show an example of calling the master_disaster function
assert let_me_out.master_disaster() == 'spam'

您可以将此代码提取到固定装置中以使其可重用:

import importlib
import pytest


@pytest.fixture(scope='session')
def let_me_out():
loader = importlib.machinery.SourceFileLoader('let_me_out', 'bin/let-me-out')
spec = importlib.util.spec_from_loader(loader.name, loader)
let_me_out = importlib.util.module_from_spec(spec)
loader.exec_module(let_me_out)
return let_me_out


def test_master_disaster(let_me_out):
assert let_me_out.master_disaster() == 'spam'

Python 2.7

使用 Python 2.7 事情变得更加容易:

import imp
import pytest


@pytest.fixture(scope='session')
def let_me_out():
return imp.load_source('let_me_out', 'bin/let-me-out')


def test_master_disaster(let_me_out):
assert let_me_out.master_disaster() == 'spam'

关于python - 如何在pytest中导入函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49433234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com