Краткое содержание предыдущих лекций
Теперь мы готовы сделать следующий шаг — установить и настроить pytest, а также его интеграцию с Django через библиотеку pytest-django. Вперед, к миру протестированного кода!
Зачем использовать pytest и pytest-django?
Если бы фреймворки для тестирования были героями кино, то pytest наверняка стал бы Джеймсом Бондом: элегантный, быстрый и мощный. Pytest позволяет писать лаконичные и понятные тесты, поддерживает фикстуры, параметризацию, а также предоставляет обширную экосистему плагинов. Кроме того, pytest совместим с Django, что делает его отличным выбором для наших нужд.
А что дает pytest-django? pytest-django — это расширение для pytest, которое обеспечивает тесную интеграцию с Django. С его помощью вы можете легко использовать тестовую базу данных, модули конфигурации Django, а также встроенные фикстуры, такие как db. Это упрощает процесс тестирования и избавляет от необходимости писать тонны boilerplate-кода.
Установка pytest
Шаг 1: убедимся, что у нас обновлённый pip
Прежде чем устанавливать что-либо через pip, давайте убедимся, что он в актуальной версии:
pip install --upgrade pip
Шаг 2: установим pytest
Для начала установим сам pytest:
pip install pytest
Проверим, что всё установлено корректно, запустив команду:
pytest --version
Вы должны увидеть текущую версию pytest. Если всё так, то поздравляю — первый шаг сделан!
Установка и настройка pytest-django
Шаг 1: устанавливаем pytest-django
Теперь добавим наш главный инструмент для интеграции с Django:
pip install pytest-django
Отлично! Теперь давайте убедимся, что он работает корректно. Для этого запустим:
pytest --help
Если в списке параметров появился раздел pytest-django, значит, библиотека успешно установлена.
Шаг 2: подключаем pytest-django к нашему проекту
Для правильной работы pytest-django необходимо указать некоторые базовые настройки. Нам нужно создать файл pytest.ini в корневой директории нашего проекта (там, где лежит manage.py):
touch pytest.ini
Заполним его следующим содержимым:
[pytest]
DJANGO_SETTINGS_MODULE = my_project.settings
python_files = tests.py test_*.py *_tests.py
Расшифровка настроек:
DJANGO_SETTINGS_MODULE: мы указываем модуль с настройками нашего Django-проекта. Заменитеmy_project.settingsна путь к вашему модулю настроек.python_files: это шаблоны для поиска тестовых файлов. Например, файлы с именамиtests.py,test_models.pyилиviews_tests.pyбудут автоматически распознаны pytest.
Шаг 3: проверяем, работает ли pytest с Django
Запустите команду:
pytest
Если вы видите сообщение вроде: collected 0 items, это значит, что ни одного теста пока не найдено, но pytest уже готов к работе.
Настройка базы данных для тестов
Когда вы запускаете тесты в Django, проект автоматически использует тестовую базу данных. Django создаёт новую копию основной базы данных, выполняет миграции и использует её для всех тестов. После завершения тестов тестовая база удаляется.
Чтобы проверить действие тестовой базы, создадим один тестовый файл.
Простой тестовый пример
Создайте файл test_example.py в директории проекта (например, в tests/):
# test_example.py
import pytest
@pytest.mark.django_db
def test_example():
assert 1 + 1 == 2
Здесь происходит магия:
@pytest.mark.django_db— это декоратор pytest-django, который позволяет тесту взаимодействовать с тестовой базой данных.
Запустите тесты:
pytest
Если все настройки выполнены правильно, вы увидите зелёную галочку рядом с результатом выполнения теста. Поздравляем! Вы успешно интегрировали pytest и pytest-django.
Конфигурация фикстур
Одной из мощных фишек pytest являются фикстуры. Они позволяют создавать начальные условия для тестов (например, предварительно добавлять записи в базу данных). Pytest-django предоставляет удобные фикстуры, такие как db и client.
Использование фикстуры db
Давайте модифицируем наш тест, чтобы показать работу фикстуры db. Для этого добавим модель в проект и протестируем её.
Шаг 1: создаём модель
Откройте файл models.py в одном из ваших Django приложений и создайте простую модель:
# models.py
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
Не забудьте выполнить миграции:
python manage.py makemigrations
python manage.py migrate
Шаг 2: пишем тест с использованием модели
В нашем тестовом файле test_example.py добавим новый тест:
import pytest
from myapp.models import Post # Замените myapp на имя вашего приложения
@pytest.mark.django_db
def test_post_creation():
post = Post.objects.create(title="Pytest", content="Integrating pytest-django is fun!")
assert post.title == "Pytest"
assert Post.objects.count() == 1
Запустите тесты снова:
pytest
Теперь pytest с лёгкостью проверяет создание записи в тестовой базе данных. После завершения теста база автоматически очищается, чтобы вы могли работать дальше.
Подсказки и типичные ошибки
Ошибка:
django.core.exceptions.ImproperlyConfigured: Requested setting DJANGO_SETTINGS_MODULE, but settings are not configuredЭто означает, что pytest не может найти настройки Django. Убедитесь, что вы указалиDJANGO_SETTINGS_MODULEвpytest.ini.Ошибка:
No module named pytest_djangoПроверьте, что вы установилиpytest-djangoи активировали виртуальное окружение, где он установлен.Тесты запускаются, но не находят результатов убедитесь, что тесты расположены в файлах, которые соответствуют шаблонам
python_filesвpytest.ini.Замедление тестов используйте SQLite как тестовую базу данных для ускорения, если ваш проект позволяет это.
Что дальше?
Теперь, когда вы подготовили pytest и pytest-django, можно углубляться в написание более сложных тестов. В следующих лекциях мы разберём создание тестов для эндпоинтов, сериализаторов и представлений, а также затронем такие интересные аспекты, как Mock-тестирование. А пока наслаждайтесь ощущением стабильности вашего кода!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ