JavaRush /Курсы /Модуль 3: Django /Установка pytest и pytest-django

Установка pytest и pytest-django

Модуль 3: Django
22 уровень , 1 лекция
Открыта

Краткое содержание предыдущих лекций

Теперь мы готовы сделать следующий шаг — установить и настроить 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 с лёгкостью проверяет создание записи в тестовой базе данных. После завершения теста база автоматически очищается, чтобы вы могли работать дальше.

Подсказки и типичные ошибки

  1. Ошибка: django.core.exceptions.ImproperlyConfigured: Requested setting DJANGO_SETTINGS_MODULE, but settings are not configured Это означает, что pytest не может найти настройки Django. Убедитесь, что вы указали DJANGO_SETTINGS_MODULE в pytest.ini.

  2. Ошибка: No module named pytest_django Проверьте, что вы установили pytest-django и активировали виртуальное окружение, где он установлен.

  3. Тесты запускаются, но не находят результатов убедитесь, что тесты расположены в файлах, которые соответствуют шаблонам python_files в pytest.ini.

  4. Замедление тестов используйте SQLite как тестовую базу данных для ускорения, если ваш проект позволяет это.

Что дальше?

Теперь, когда вы подготовили pytest и pytest-django, можно углубляться в написание более сложных тестов. В следующих лекциях мы разберём создание тестов для эндпоинтов, сериализаторов и представлений, а также затронем такие интересные аспекты, как Mock-тестирование. А пока наслаждайтесь ощущением стабильности вашего кода!

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ