#python-3.x #api #unit-testing
#python-3.x #API #модульное тестирование
Вопрос:
Мне было поручено написать модульные тесты для функции, которая в конечном итоге выполняет вызов API requests.post. Меня попросили использовать mocking в Python. Я довольно новичок в этом и читал много статей, связанных с ним. Я также написал модульный тест, следующий за документом. Но у меня есть несколько вопросов, на которые ни один из документов, с которыми я столкнулся, не ответил-
- В функции модульного тестирования я также вызываю исходную функцию, которая выполняет вызов API. И на данный момент я издеваюсь над ответом, используя mock.return_value. Итак, в конечном итоге это также вызывает вызов API из функции модульного тестирования??Если это произойдет, то это приведет к сбою моего варианта использования, когда я не должен регулярно вызывать API на сторонний сервер.
- Если он не выполняет вызов 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:
Итак, похоже, я нашел ответы на вопрос.
- Это не вызывает вызов API из тестовой функции, потому что мы используем макет python. С помощью mock мы используем @patch и указываем python, где мы фактически выполняем вызов API, чтобы он знал, что нужно имитировать.
- Он проверяет код, если он может обработать ответ. По этой причине мы не хотим вызывать API для внешней службы каждый раз, когда мы проводим модульное тестирование.
Подводя итог —
- Когда вы выполняете фактический вызов API, вы не проводите модульное тестирование, это больше похоже на интеграционное тестирование
- Когда вы хотите выполнить модульное тестирование, вы проверяете, может ли ваш код принимать и обрабатывать ожидаемый ответ на вызов API без фактического выполнения вызова. Вы делаете это с помощью библиотеки-макета (например, библиотеки ‘responses’, которая вводит фиктивные ответы на вызовы, выполняемые запросами.