База данных очищается после каждого теста в pytest- django - PullRequest
0 голосов
/ 21 февраля 2020

Чего я пытаюсь достичь.
Я тестирую остальные API в проекте Django. Я хочу создать тестовый класс со связанными тестовыми функциями (каждая следующая тестовая функция опирается на предыдущую) - первый сбой означает, что все провалились. В первой тестовой функции я создаю объект с запросом post. В следующем тестовом примере я хочу проверить, что этот объект действительно существует, используя запрос 'get'.

Как это работает
Похоже, Django -pytest очищает базу данных от всех записей после каждого теста.
В документации pytest упоминается: https://pytest-django.readthedocs.io/en/latest/helpers.html#pytest -mark- django -db-request-database-access
Есть ли способ изменить это?

Мой код:
Мой conftest.py:

import pytest


@pytest.fixture(scope='session')
def django_db_setup():
    from django.conf import settings
    settings.DATABASES['default'] = {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'db_name.sqlite3',
    }


@pytest.fixture
def object_data():
    return {"some keys": "some values"}


@pytest.fixture
def object_name():
    return "some name"

Мой tests.py:

import pytest

from rest_framework.test import APIClient
from rest_framework import status


@pytest.mark.django_db
class TestAPI:
    def setup(self):
        self.client = APIClient()

    def test_create_object(self, object_data, object_name):
        post_response = self.client.post("/api/object/", data=object_data, format="json")
        assert status.is_success(post_response.status_code)
        # make sure that report was created
        get_response = self.client.get(f"/api/object/{object_name}/")
        assert status.is_success(get_response.status_code)
        # object exists here (test passes)

    def test_get_object(self, object_name):
        get_response = self.client.get(f"/api/object/{object_name}/")
        assert status.is_success(get_response.status_code)
        # object does not exists here (test failes)

1 Ответ

0 голосов
/ 25 февраля 2020

Да, pytest- django очищает вашу БД после каждого запуска теста.

Чтобы решить эту проблему, добавьте файл конфигурации pytest с именем pytest.ini в каталог root и добавьте следующее

[pytest]
addopts = --reuse-db

Как предполагает этот файл конфигурации, он использует текущий БД без создания новой БД.

Поэтому, если вам нужно создать БД для вашего теста, вам нужно будет указать ее в команде с помощью pytest --create-db

...