Короткий зміст попередніх лекцій
Тепер ми готові зробити наступний крок — встановити та налаштувати 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-тестування. А поки насолоджуйтеся відчуттям стабільності вашого коду!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ