如何在@ pytest.mark.parametrize上使用类变量

时间:2017-12-08 15:26:39

标签: python pytest

我有一个名为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

1 个答案:

答案 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'。该对象将您的数据保存在"字段"名为vectormock_data对象一直存在,直到为传递给它的每个参数调用测试用例(range(0, 5)等于[0, 1, 2, 3, 4]的生成器)。在其生命的最后,它将"销毁"类方法self.vector.clear()中的fin数据(仅作为示例)。您的测试用例可以通过调用mock_data直接在do_something对象中执行某些操作。