在 pytest-django 中每次测试后都会清理数据库

Mac*_*iek 2 python django-rest-framework pytest-django

我正在努力实现什么目标。
我正在 Django 项目中测试 REST API。我想创建具有相关测试函数的测试类(以下每个测试函数都依赖于前一个测试函数) - 第一次失败意味着全部失败。在第一个测试函数中,我使用“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"
Run Code Online (Sandbox Code Playgroud)

我的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)
Run Code Online (Sandbox Code Playgroud)

Nit*_*han 6

是的,pytest-django 在每次测试运行后都会清除您的数据库。

为了解决这个问题,pytest.ini在你的根目录下添加一个名为 pytest 配置文件,并添加如下

[pytest]
addopts = --reuse-db
Run Code Online (Sandbox Code Playgroud)

正如此配置文件所示,它重用当前数据库而不创建新数据库。

因此,如果您需要为测试创建数据库,则必须在命令上指定它pytest --create-db

  • 在这种情况下,请尝试从固定装置更改会话范围。使用“@pytest.fixture()” (2认同)

Bre*_*gin 5

您可能不想在测试用例之间保留数据。您应该努力拥有可以按任意顺序运行的测试用例。如果您希望在测试用例之间共享数据,请在夹具中对其进行初始化并在测试用例之间重复使用该数据,或者将测试用例合并为一个测试用例以确保该测试用例中的所有内容都按顺序运行。