параметр запроса Pytest прибора, который будет использоваться в тестах - PullRequest
1 голос
/ 10 октября 2019

Я настроил свой прибор для вызова API с различными входными данными для запроса POST для каждого вызова с областью действия 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'

Но когда я запускаю это, я не могу прочитать параметры запроса, переданные устройству в тесты. Также пытался сохранить в переменной экземпляра, но не сработало. Я заметил, что id() свойство self в приборе и self в тестах отличается. Почему так? Есть ли способ добиться этого?

1 Ответ

1 голос
/ 11 октября 2019

Вы можете передать 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
...