@IvanOne

Как организовать тесты в django на уровне app?

Делаю проект на django и rest framework, хочу сделать тесты на уровне приложений, юзаю pytest. Т.е у меня есть в каждой app директория tests и там лежат уже модули c тестами, вопрос как протестировать view классы на уровне app, без регистрации путей в корневом urls.py. Можно ли например как то самому создать объект request и закинуть его в класс вьюхи? Цель сделать максимально реюзабельные django app's
  • Вопрос задан
  • 584 просмотра
Решения вопроса 1
alternativshik
@alternativshik
Как-то так
def test_product_list_view(user: UserFactory, api_request_factory: APIRequestFactory):
    view = ProductListView.as_view()
    # Make an authenticated request to the view...
    # Урл можно писать любой
    request = api_request_factory.get('/api/v1/products/')
    force_authenticate(request, user=user)
    response = view(request)
    assert response.status_code == 200
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@marazmiki
Укротитель питонов
Чисто субъективно, лучше выбрать что-то из одно: или размещать тесты на уровне приложений, или использовать pytest.

Хранить тесты внутри приложений полезно при использовании стандартного джанговского тест-раннера: он знает и умеет их находить и запускать. Pytest же не является родным инструментом для джанги, соответственно, использует свой механизм дискаверинга тестов.

Если Вы нацелены именно на реюзабельные приложения (я полагаю, это означает вынос их в отдельные пакеты и размещение в индексах типа PyPI или собственных частных?), я бы порекомендовал поступать следующим образом:
  • Создавать приложения в отдельном репозитории, вне Вашего основного проекта;
  • Не забывать про setup.py и setup.cfg; либо познакомиться с замечательным пакетом poetry, который снимет кучу головняка с моментами, связанными с упаковкой и публикацией пакетов. Он и в разработке основного проекта очень поможет, но речь сейчас не об этом :)
  • Писать тесты с использованием pytest. Это гораздо мощнее и удобнее, чем родной джанговский раннер
  • Размещать тесты вне директории питоновского пакета, т.е. вашего django-приложения, и вообще не помещать их в архив пакета. В конце концов, тесты — они про разработку, а не про продуктив, на боевой машине не нужны
  • Создать минималистичный джанго-проект внутри директории тестов и не добавить в его urls ссылку на URLConf Вашего приложения
  • И, как следствие, не бойтесь тестировать вьюхи так, как будто они уже часть проекта (так и есть, собственно). Конечно, никто не запретит конструировать объект request и вызывать вьюхи как обычные функции, передавая этот request в виде первого аргумента, но мы ведь тестируем не для покрытия, а для того, чтобы работало, правда?



Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы