如何在 Pytest 参数化功能中调用对象的属性

How to call objects' attributes in Pytest parametrize feature

我有一些装置只是 return class 的对象。这些对象包含我试图在 pytest 中验证的那个 class 的 属性,所以代码看起来像这样:

from main import My_class
import pytest

@pytest.fixture()
def fixt1():
    object1 = My_class("atr1", "atr2")
    return object1

@pytest.fixture()
def fixt2():
    object2 = My_class("atr3", "atr4")
    return object2

@pytest.mark.parametrize('inputs, results',
                         [
                            (fixt1, 10.0),
                            (fixt2, 22.5)
                         ]
                         )
def test_fixts(inputs, results):
    assert inputs.price == results

此代码将始终return属性错误:

AttributeError: 'function' object has no attribute 'price'

但是,尝试使用像这样的简单测试来测试这些属性是可行的:

def test_simple(fixt1):
    assert fixt1.price == 10.0

我能就这个问题得到一些建议吗,因为我在任何地方都找不到关于如何在参数化中正确调用对象属性的说明?

非常感谢!

夹具不能像函数一样使用 - 它们必须用作测试函数或其他夹具中的参数。在 mark.parametrize 的参数中,您可以使用普通函数代替:

def param1():
    return My_class("atr1", "atr2")

def param2():
    return My_class("atr3", "atr4")

@pytest.mark.parametrize('inputs, results',
                         [
                            (param1(), 10.0),
                            (param2(), 22.5)
                         ]
                         )
def test_fixts(inputs, results):
    assert inputs.price == results

请注意,您只能使用可以在加载时执行的函数,因为 mark.parametrize 装饰器是在加载时评估的,因此它不能依赖于任何 run-time 更改。