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