我正在使用pytest的参数化注释将params传递给一个类.我能够在测试方法中使用参数,但是,我无法弄清楚如何在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'
Run Code Online (Sandbox Code Playgroud)
我尝试添加'n'作为参数,如测试方法,如下所示:
def setup_class(cls, n):
print ("setup class:TestFoo")
# Do some setup based on param
Run Code Online (Sandbox Code Playgroud)
这会导致错误:
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)
Run Code Online (Sandbox Code Playgroud)
是否有其他方法在setup_class方法中使用该参数?
你不能。
首先,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'
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅http://docs.pytest.org/en/latest/fixture.html#fixture-parametrize
nic*_*zam -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
Run Code Online (Sandbox Code Playgroud)
测试将在参数self.n self.n test_internal. It illustrates thatparams上失败were set toand nowequals to
| 归档时间: |
|
| 查看次数: |
5780 次 |
| 最近记录: |