11

我正在使用 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 方法中是否有其他使用参数的方法?

4

2 回答 2

7

你不能。

首先,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

于 2016-10-11T19:24:38.733 回答
-4

您应该通过将属性分配给cls. 您稍后分配给它的所有属性和函数都将成为类属性/方法。

参数化装饰器应该用在类方法上(你想测试方法,不是吗?)

所以:

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 that参数were set toself.n and nowself.n equals toparams`

于 2013-11-01T23:07:31.210 回答