Тест-драйв Django: APIRequestFactory vs APIClient

Будучи новичком в тестировании, я хочу проверить свой API в Django (Django-rest-framework).

Я настраиваю тесты для своих просмотров, это мои конечные точки API. Теперь, просматривая документацию, я могу использовать APIRequestFactory или APIClient. Оба, похоже, делают то же самое.

В чем разница между этими двумя, и почему/когда я должен использовать один или другой?

Ответ 1

Если вы посмотрите на инструменты и помощники для тестирования стандартных представлений в Django, вы найдете что-то очень аналоговое, TestClient и RequestFactory.

RequestFactory использует тот же API, что и тестовый клиент. Однако, вместо того, чтобы вести себя как браузер, RequestFactory предоставляет способ для генерации экземпляра запроса, который может использоваться в качестве первого аргумента на любую точку зрения. Это означает, что вы можете проверить функцию просмотра так же, как вы проверили бы любую другую функцию - как черный ящик с точно известным входы, тестирование конкретных выходов.

TestClient позволяет вам взаимодействовать с вашим сайтом с точки зрения пользователя, просматривающего ваш сайт (... хотя тестирование Javascript - это еще одна история). Многие вещи приходят в игру при тестировании вашего сайта, как это (сеансы, Middlewares, URL-Routing и т.д.). Таким образом, это, как правило, более интеграционные тесты, имитирующие взаимодействие реального мира с вашим сайтом или API.

A RequestFactory позволяет вам проверять ваши взгляды очень изолированным образом. Вы можете создать запрос и протестировать свое мнение без необходимости настраивать свои URL-адреса или заботиться о вещах, происходящих в middlewares и т.д. Таким образом, это ближе к типичному unit test.

Тем не менее, оба типа тестов полезны. Чтобы получить общее представление о том, работает ли ваш API как ожидалось, я бы, вероятно, начал использовать APIClient и использовать RequestFactories, когда речь заходит о более сложных представлениях. Но правильное сочетание сильно зависит от вашего конкретного приложения.