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

Ami*_* K. 5 python self pytest web-api-testing python-3.6

我已参数化我的装置来调用 API,每次调用时使用不同的输入数据来发送请求,范围为class. 因为我需要检查 API 响应与发送的数据。我需要将灯具的请求参数读取到测试中。

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'
Run Code Online (Sandbox Code Playgroud)

但是当我运行这个时,我无法将传递给固定装置的请求参数读取到测试中。还尝试保存在实例变量中,但没有成功。我观察到固定装置中和测试中id()的属性是不同的。为什么会这样呢?有办法实现这一点吗?selfself

yen*_*niv 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')
Run Code Online (Sandbox Code Playgroud)

更新:

由于您正在参数化夹具,因此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
Run Code Online (Sandbox Code Playgroud)

  • _request 对象是为完整的测试运行而维护的,可以在需要参数的其他测试中访问。_但我说,`request.param` 在测试函数(带有参数化装置)中不可用,这就是你得到 AttributeError 的原因当尝试在测试功能中使用它时。 (3认同)