Категории

Язык
Окружение
Область
Проект

17 июня 2018 г. 18:42 (ред. 17 июня 2018 г. 18:50)
О новом плагине для pytest, который упростит вам написание и исполнение тестов для подключаемых приложений Django.
На днях написал плагин к замечательному каркасу pytest, позволяющий упростить тестирование приложений для Django. Полагаю, что он будет полезен людям, участвующим в разработке этих самых подключаемых приложений.

Плагин называется pytest-djangoapp и разрабатывается открыто на GitHub — https://github.com/idlesign/pytest-djangoapp

От давно известного плагина pytest-django, его отличает не только набор фикстур в поставке, но и более принципиальные вещи.

1. Механизм активации.
Новый плагин стартует только для тех проектов, в которых вам это нужно. Вы явно указываете в conftest.py, что хотите активировать плагин (и сразу конфигурируете его, если требуется). Это позволяет не ловить неожиданные спецэффекты в тестах для других не относящихся к Django проектов.

from pytest_djangoapp import configure_djangoapp_plugin

pytest_plugins = configure_djangoapp_plugin() # Вот и всё. В тестах можно использовать фикстуры.

2. Доступ к БД.
По умолчанию плагин использует базу данных sqlite в памяти, которая автоматически очищается после прогона очередного теста. Это означает, что кажный новый тест работает с чистой базой и не наткнётся случайно на неожиданные данные от предыдущего. А кроме того, это означает, что вам не нужно, как в pytest-django, маркировать функции, которым требуется доступ в БД, то есть, вы сможете без труда тестировать логику в «толстых» моделях.

Что касается набора фикстур, то среди них есть:

  • для тестирования шаблонных тегов
  • для подмены настроек проекта
  • для создания пользователей
  • для генерирования объектов запросов

Более подробная документаци доступна по адресу http://pytest-djangoapp.readthedocs.io (англ.).

Я уже перевёл на использование этого плагина django-sitemessage и django-sitetree , и пока доволен.
Другие свои приложения тоже планирую перевести. Чего и вам желаю.

Тестировать проще!