pytest: как передать параметр класса в setup_class

Я использую аннотации параметризации pytest для передачи параметров в класс. Я могу использовать параметры в методах тестирования, однако я не могу понять, как использовать параметры в методе setup_class.

import pytest

params = ['A','B','C']

@pytest.mark.parametrize('n', params)
class TestFoo:

    def setup_class(cls):
        print ("setup class:TestFoo")
        # Do some setup based on param

    def test_something(self, n):
        assert n != 'D'

    def test_something_else(self, n):
        assert n != 'D'

Я попытался добавить «n» в качестве параметра, такого как методы тестирования, например:

def setup_class(cls, n):
        print ("setup class:TestFoo")
       # Do some setup based on param

Что приводит к ошибке:

self = <Class 'TestFoo'>

    def setup(self):
        setup_class = xunitsetup(self.obj, 'setup_class')
        if setup_class is not None:
            setup_class = getattr(setup_class, 'im_func', setup_class)
            setup_class = getattr(setup_class, '__func__', setup_class)
>           setup_class(self.obj)
E           TypeError: setup_class() takes exactly 2 arguments (1 given)

Есть ли другой способ использования параметра в методе setup_class?


person user2945303    schedule 01.11.2013    source источник


Ответы (2)


Вы не можете.

Во-первых, setup_class вызывается только один раз для каждого класса, даже если используется parametrize фикстура - класс устанавливается только один раз.

Во-вторых, он не предназначен для приема каких-либо других параметров, кроме cls. Он не будет принимать параметры от paramterize и других приборов.

В качестве решения вы можете использовать параметризованный прибор с областью действия "класс":

import pytest

params = ['A', 'B', 'C']


@pytest.fixture(
    scope="class",
    params=params,
)
def n(request):
    print('setup once per each param', request.param)
    return request.param


class TestFoo:

    def test_something(self, n):
        assert n != 'D'

    def test_something_else(self, n):
        assert n != 'D'

Для получения дополнительной информации см. http://docs.pytest.org/en/latest/fixture.html#fixture-parametrize

person prmtl    schedule 11.10.2016

Вы должны передать атрибуты своему тестовому классу, назначив его cls. Все атрибуты и функции, которые вы ему назначите позже, станут атрибутами/методами класса.

Параметризованный декоратор следует использовать в методах класса (вы хотите протестировать методы, не так ли?)

So:

import pytest

params = ['A','B','C']

class TestFoo:

    def setup_class(cls):
        cls.n = params

    @pytest.mark.parametrize('n', params)
    def test_something(self, n):
        assert n != 'D'

    @pytest.mark.parametrize('n', params)
    def test_something_else(self, n):
        assert n != 'D'

    def test_internal(self):
        assert self.n != params

Тест не будет выполнен на test_internal. It illustrates thatparamswere set toself.nand nowself.nequals toparams`

person nickzam    schedule 01.11.2013
comment
Это на самом деле не решает то, что я пытаюсь сделать. В каждом тесте «n» — это элемент из списка параметров. В вашем примере вы назначаете весь список cls.n. Делая это на уровне класса, я хочу, чтобы для элемента «A» запускалась настройка, специфичная для элемента «A», а затем запускались тесты для элемента «A». - person user2945303; 04.11.2013
comment
Кроме того, что это? Например, он даже не использует декоратор для метода установки в классе, не имеет соответствующего разрыва и так далее. - person lpapp; 02.09.2014