Имитирующий вызов API в модульном тестировании Python 3

#python-3.x #api #unit-testing

#python-3.x #API #модульное тестирование

Вопрос:

Мне было поручено написать модульные тесты для функции, которая в конечном итоге выполняет вызов API requests.post. Меня попросили использовать mocking в Python. Я довольно новичок в этом и читал много статей, связанных с ним. Я также написал модульный тест, следующий за документом. Но у меня есть несколько вопросов, на которые ни один из документов, с которыми я столкнулся, не ответил-

  1. В функции модульного тестирования я также вызываю исходную функцию, которая выполняет вызов API. И на данный момент я издеваюсь над ответом, используя mock.return_value. Итак, в конечном итоге это также вызывает вызов API из функции модульного тестирования??Если это произойдет, то это приведет к сбою моего варианта использования, когда я не должен регулярно вызывать API на сторонний сервер.
  2. Если он не выполняет вызов API, что именно он проверяет? Я сам отправил ответ и, скажем, код состояния вызова API. Итак, без вызова API, как эти два могут быть проверены?
 @patch('post.requests.get')
def test_api_function(self, mock_incident):
    mock_incident.return_value.json.return_value = [{'mock':'json'}]
    mock_incident.return_value.status_code = 200
    response = api_fucntion()

    assert response.status_code == 200
 

Если вы видите, я все еще выполняю этот вызов функции (api_response). Как это служит моей цели модульного тестирования с помощью mocking?? И как он проверяет 200 ответов без выполнения фактического вызова API, если он его не выполняет??

Ответ №1:

Итак, похоже, я нашел ответы на вопрос.

  1. Это не вызывает вызов API из тестовой функции, потому что мы используем макет python. С помощью mock мы используем @patch и указываем python, где мы фактически выполняем вызов API, чтобы он знал, что нужно имитировать.
  2. Он проверяет код, если он может обработать ответ. По этой причине мы не хотим вызывать API для внешней службы каждый раз, когда мы проводим модульное тестирование.

Подводя итог —

  • Когда вы выполняете фактический вызов API, вы не проводите модульное тестирование, это больше похоже на интеграционное тестирование
  • Когда вы хотите выполнить модульное тестирование, вы проверяете, может ли ваш код принимать и обрабатывать ожидаемый ответ на вызов API без фактического выполнения вызова. Вы делаете это с помощью библиотеки-макета (например, библиотеки ‘responses’, которая вводит фиктивные ответы на вызовы, выполняемые запросами.