Skip to content

Тестирование в Django

Запуск всех тестов

python manage.py test project/ --keepdb  

Как переопределить настройки?

from django.test import TestCase


class AnyTestCase(TestCase):
    def test_call(self):
        with self.settings(USE_TELEGRAM_BOT=True):
            ...

Источник

Как сгенерировать DRF-Request?

rest_framework.test.APIRequestFactory возвращает джанговский WSGIRequest, а хочется DRF-Request

from rest_framework.parsers import JSONParser
from rest_framework.request import Request
from rest_framework.test import APIRequestFactory

req_f = APIRequestFactory()
url: str
params: dict
raw_req = req_f.post(url, params, format='json')
req = Request(raw_req, parsers=[JSONParser()])

assert hasattr(req, 'data')

Источник

Работа со временем

Как получить текущее время с таймзоной?

from django.utils import timezone

timezone.now()

Как сделать дейттайм с таймзоной?

from django.utils import timezone

timezone.make_aware(dt.datetime(2022, 6, 5, 23, 59, 59, 999000))

Как парсить время?

from rest_framework.fields import DateTimeField

assert (
    DateTimeField().run_validation('2022-06-05T23:59:59.999') ==
    timezone.make_aware(dt.datetime(2022, 6, 5, 23, 59, 59, 999000))
)

Как сериализовать время?

from rest_framework.fields import DateTimeField

assert (
    DateTimeField().to_representation(dt.datetime(2022, 6, 5, 23, 59, 59, 999000)) ==
    '2022-06-05T23:59:59.999'
)

Как тестировать код, который пишет логи?

Использовать multi_db = True:

class TestSendErisEmias(TestCase):
    multi_db = True

pytest

pytest-django - pytest-плагин для Джанго

Конфиг

[pytest]
;Тестоывые настройки
DJANGO_SETTINGS_MODULE = root.test_settings
;Переиспользование бд, аналогично флагу keep-db
addopts = --reuse-db

Как тестить запросы?

@pytest.mark.django_db
def test_ok(client):
    resp: HttpResponse = client.post(
        '/api/...',
        {
            # json
        },
        content_type='application/json',
    )

    assert resp.status_code == 200