我有一个名为test_case_params
的测试用例。需要将一些参数(从class Mock_data
获取模拟数据)传递给fixture并检查测试用例中的返回值。我还有另一种方法可以在Mock_data.get_mock_data
和测试用例中使用@pytest.mark.parametrize
吗?目的是确保所有测试用例都使用相同的模拟数据。到目前为止我所做的是创建一个mock_data变量,以便我可以在所有测试用例中使用它,因为整个Testsuit都是从TestFixure继承的。但我不确定如何编写pytest.mark.parametrize
部分。
import pytest
class Mock_data:
@staticmethod
def get_mock_data():
return [1,2,3,4,5]
class TestFixure(object):
@pytest.fixture(scope='function')
def func_fixture(self, request):
print('#do something in fixure{}'.format(request.param))
return request.param
def fin():
print('#do something on finalizer')
request.addfinalizer(fin)
@classmethod
def setup_class(cls):
super(TestFixure, cls).setup_class()
cls.mock_data = Mock_data.get_mock_data()
@classmethod
def teardown_class(cls):
super(TestMember, cls).teardown_class()
class TestSuite(TestFixure):
@pytest.mark.parametrize('func_fixture', [Mock_data.get_mock_data()[1], Mock_data.get_mock_data()[2], Mock_data.get_mock_data()[3]], indirect=['func_fixture'])
def test_case_params(self, func_fixture):
print(func_fixture)
assert func_fixture in self.mock_data
答案 0 :(得分:0)
你的全班TestFixure
看起来很糟糕。像super(TestFixure, cls).setup_class()
这样的行表明你打算从某些东西派生出来......?
我第一次遇到这样的事情很困难,所以我重写了你的代码示例。我相信它能满足你的需求,我希望它能帮助你理解夹具和参数化的概念是如何工作的:
import pytest
class __mock_data_class__:
def __init__(self):
self.vector = [2, 3, 4, 5, 6]
def do_something(self, parameter):
return self.vector[parameter] - 2
def fin(self):
self.vector.clear() # demo action at the end ...
@pytest.fixture(scope = 'function')
def mock_data(request):
mock_data_object = __mock_data_class__()
def __finalizer__():
mock_data_object.fin()
request.addfinalizer(__finalizer__)
return mock_data_object
class TestSuite():
@pytest.mark.parametrize('some_parameter', range(0, 5))
def test_case_params(self, mock_data, some_parameter):
print(some_parameter)
assert some_parameter == mock_data.do_something(some_parameter)
您的模拟数据由名为__mock_data_class__
的类生成(或获取或...)。我会在每个测试用例中初始化为mock_data
(在您的示例中只有一个,test_case_params
),感谢scope = 'function'
。该对象将您的数据保存在"字段"名为vector
。 mock_data
对象一直存在,直到为传递给它的每个参数调用测试用例(range(0, 5)
等于[0, 1, 2, 3, 4]
的生成器)。在其生命的最后,它将"销毁"类方法self.vector.clear()
中的fin
数据(仅作为示例)。您的测试用例可以通过调用mock_data
直接在do_something
对象中执行某些操作。