Есть бекенд простого приложения с курсами и списком студентов. Вся логика для бекенда уже есть в заготовке, но совершенно нет тестов.
Вам необходимо написать тесты для текущей логики приложения.
Заведите фикстуры:
- для api-client'а
- для фабрики курсов
- для фабрики студентов
В качестве библиотеки для фабрик используйте model_bakery
(https://github.com/model-bakers/model_bakery).
Добавьте следующие тест-кейсы:
- проверка получения 1го курса (retrieve-логика)
- создаем курс через фабрику
- строим урл и делаем запрос через тестовый клиент
- проверяем, что вернулся именно тот курс, который запрашивали
- проверка получения списка курсов (list-логика)
- аналогично – сначала вызываем фабрики, затем делаем запрос и проверяем результат
- проверка фильтрации списка курсов по
id
- создаем курсы через фабрику, передать id одного курса в фильтр, проверить результат запроса с фильтром
- проверка фильтрации списка курсов по
name
- тест успешного создания курса
- здесь фабрика не нужна, готовим JSON-данные и создаем курс
- тест успешного обновления курса
- сначала через фабрику создаем, потом обновляем JSON-данными
- тест успешного удаления курса
Все тесты должны явно проверять код возврата.
Не забывайте использовать декоратор @pytest.mark.django_db
, чтобы тесты использовали базу.
Запуск тестов делается через команду:
$ pytest
Перед началом работы убедитесь, что все зависимости установлены (dev-зависимости указаны в requirements-dev.txt
) и тесты успешно запускаются. Вы должны увидеть:
$ pytest
======== test session starts =====
...
collected 1 item
tests/students/test_courses_api.py F [100%]
====== FAILURES ====
_____ test_example ____
def test_example():
> assert False, "Just test example"
E AssertionError: Just test example
E assert False
tests/students/test_courses_api.py:2: AssertionError
=== short test summary info ===
FAILED tests/students/test_courses_api.py::test_example - AssertionError: Just test example
===== 1 failed in 0.21s =====
Этот тест можете удалить и написать в этом файле свои тесты.
APIClient
в DRF является расширением ДжанговскогоClient
. Для того, чтобы передать GET-параметры в запросе, используйте аргументdata
: https://docs.djangoproject.com/en/3.1/topics/testing/tools/#django.test.Client.get
pytest: https://docs.pytest.org/en/stable/
pytest-django: https://pytest-django.readthedocs.io/en/latest/
тестирование DRF: https://www.django-rest-framework.org/api-guide/testing/
Добавьте валидацию на максимальное число студентов на курсе – 20. Подумайте, как протестировать это ограничение, не создавая 20 сущностей в базе данных.
Подсказка: задайте максимальное число студентов в settings.py
: MAX_STUDENTS_PER_COURSE
. В тестах используйте parametrize
и фикстуру settings
(https://pytest-django.readthedocs.io/en/latest/helpers.html#settings), чтобы переопределить параметр.
Протестируйте как неудачный исход, так и успешный.
Для запуска проекта необходимо:
Установить зависимости:
pip install -r requirements-dev.txt
Вам необходимо будет создать базу в postgres и прогнать миграции:
manage.py migrate
Выполнить команду:
pytest