我正在尝试为测试单个api端点的多个测试方案定义初始化数据。我想这样做,这样我就不必为仅数据不同的测试的多次迭代生成样板代码。我似乎无法用内置的pytest固定装置来解决这个问题。本质上,这就是我想要做的事情:

在tests / conftext.py中:

import pytest

@pytest.fixture(scope="module")
def data_for_a():
    return "a_data"

@pytest.fixture(scope="module")
def data_for_b():
    return "b_data"


在tests / tests.py中

import pytest

# this works
def test_a(data_for_a):
    assert "a_data" == data_for_a

# but I want to do this and it fails:
scenarios = [
    { "name": "a", "data": data_for_a },
    { "name": "b", "data": data_for_b },
]

for scenario in scenarios:
    print(scenario.name, scenario.data)

# desired output:
# "a a_data"
# "b b_data"


我收到一个NameError: name 'data_for_a' is not defined异常。我已经尝试了各种方法来使其工作,但是似乎没有办法将夹具作为参数传递给测试方法-因此,要么定义一堆样板测试,要么使用一堆if / else语句在一次测试中,并明确通过每个灯具。我不喜欢这些选项。目前看来,我只需要构建自己的帮助程序模块来提取此测试数据,但是我宁愿使用内置机制来实现这一点。有什么办法吗?

最佳答案

您可以像这样从conftest.py导入:

from conftest import data_for_a, data_for_b


要么

from conftest import *


这样您就可以引用该函数,而无需将其作为参数传递给测试函数。

编辑:
请注意,根据the official pytest documentation,通常不建议这样做


  如果您有不在python软件包目录中的conftest.py文件(例如,包含__init__.py的文件),则“ import conftest”可能会模棱两可,因为您的PYTHONPATH或sys上可能还会有其他conftest.py文件。路径。因此,对于项目而言,最好的做法是将conftest.py置于程序包范围内,或者从不导入任何conftest.py文件。

关于python - 如何动态获取pytest夹具数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39475849/

10-15 00:44