pytest 请求测试中使用的夹具参数

问题描述 投票:0回答:1

我已参数化我的装置来调用 API,每次调用时使用不同的输入数据发送到

POST
请求,范围为
class
。因为我需要检查 API 响应与发送的数据。我需要将灯具的请求
params
读取到测试中。

class Test_create_fixture():

    @pytest.fixture(scope="class", params=[0, 1])
    def my_fixture(self, request):
        "Call incident creation api."

        # POST request to API using params value in request data, get data from API      
        my_data = {'abc': 123, 'severity': 0} # this data is from API

        self.data = {'severity': request.param}
        return my_data

    def test_incident_severity(self, my_fixture, request):
        print("self.data", self.data)
        # 'Test_create_fixture' object has no attribute 'data'
        assert my_fixture.get('severity', False) == request.param       
        # AttributeError: 'FixtureRequest' object has no attribute 'param'

但是当我运行这个时,我无法将传递给固定装置的请求参数读取到测试中。我也尝试保存在实例变量中,但它不起作用。我观察到夹具中的

id()
和测试中的
self
self
属性是不同的。为什么会这样呢?有没有办法实现这个目标?

python python-3.6 pytest self web-api-testing
1个回答
3
投票

您可以将

request.param
从夹具传递到测试功能。您可以将其添加到
my_data
对象本身。

class Test_create_fixture():

    @pytest.fixture(scope="class", params=[0, 1])
    def my_fixture(self, request):
        "Call incident creation api."

        # POST request to API using params value in request data, get data from API      
        my_data = {'abc': 123, 'severity': 0, 'req_param': request.param} # this data is from API

        return my_data

    def test_incident_severity(self, my_fixture):
        assert my_fixture.get('severity', False) == my_fixture.get('req_param')

更新:

由于您正在对夹具进行参数化,因此

request.param
仅在定义了参数化的夹具功能中可用。

另一种可能性是引入另一个参数化的夹具并返回参数。当前的夹具和测试功能使用这个新的夹具来获取参数。

class Test_create_fixture():

    @pytest.fixture(scope="class", params=[0,1])
    def req_param(self, request):
        return request.param

    @pytest.fixture(scope="class")
    def my_fixture(self, req_param):
        "Call incident creation api."

        # POST request to API using req_param in request data, get data from API      
        my_data = {'abc': 123, 'severity': 0} # this data is from API

        return my_data

    def test_incident_severity(self, my_fixture, req_param):
        assert my_fixture.get('severity', False) == req_param
© www.soinside.com 2019 - 2024. All rights reserved.