Как вызывать атрибуты объектов в функции параметризации Pytest

У меня есть некоторые приспособления, которые просто возвращают объекты класса. Объекты содержат свойство этого класса, которое я пытаюсь проверить в pytest, поэтому код выглядит примерно так:

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

Этот код всегда будет возвращать ошибку атрибута:

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

Однако попытка проверить эти атрибуты с помощью простых тестов, подобных этому, сработает:

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

Могу ли я получить совет по этому вопросу, так как я нигде не мог найти инструкции о том, как правильно вызывать атрибуты объектов в параметризации?

Очень признателен!


person Massina_CF    schedule 17.09.2020    source источник
comment
Вы не можете использовать фикстуру в качестве значения параметра — вместо этого используйте функцию. Фикстуры должны использоваться в качестве тестовых аргументов, как в вашем примере test_simple.   -  person MrBean Bremen    schedule 17.09.2020
comment
Спасибо за это @MrBeanBremen! Я заметил, что приборы не работают с параметризацией, как вы упомянули, но, что странно, функции тоже не работают. Это работает, если я просто инициирую объект, который я хочу использовать вне тела, как функцию/приспособление, например: object1 = My_class("atr1", "atr2"), но не в том случае, если он возвращается функцией   -  person Massina_CF    schedule 18.09.2020
comment
Функции должны работать, если у них есть вся необходимая информация во время загрузки (а не методы, потому что они неизвестны во время загрузки).   -  person MrBean Bremen    schedule 18.09.2020
comment
ты прав! Это был мой недостаток, я неправильно называл свои функции.   -  person Massina_CF    schedule 20.09.2020
comment
Извините, @MrBeanBremen, я нуб, я хочу пометить ваш ответ как решение, но значок рядом с ответом просто не появляется, чтобы я мог его переключить.   -  person Massina_CF    schedule 20.09.2020


Ответы (1)


Фикстуры нельзя использовать как функции — их нужно использовать в качестве аргументов в тестовых функциях или в других фикстурах. Вместо этого в параметрах 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 оценивается во время загрузки, поэтому он не может зависеть от каких-либо изменений во время выполнения.

person MrBean Bremen    schedule 21.09.2020