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-тестування. А поки насолоджуйтеся відчуттям стабільності вашого коду!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ