首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在pytest-django中的每次测试之后,数据库都会被清理。

在pytest-django中的每次测试之后,数据库都会被清理。
EN

Stack Overflow用户
提问于 2020-02-21 10:05:24
回答 3查看 5.3K关注 0票数 2

我想要达到的目标.

我正在Django项目中测试rest。我想要创建带有相关测试函数的测试类(下面的每个测试函数都依赖于前面的测试函数)--首先失败意味着所有失败。在第一个测试函数中,我创建了一个带有'post‘请求的对象。在下一个测试用例中,我希望使用'get‘请求检查这个对象是否确实存在。

是如何工作的

看起来Django-pytest在每次测试后从所有记录中清除数据库。

在pytest文档中提到了它:https://pytest-django.readthedocs.io/en/latest/helpers.html#pytest-mark-django-db-request-database-access

有什么办法来改变这个吗?

我的代码:

我的conftest.py

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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)
EN

回答 3

Stack Overflow用户

发布于 2021-08-09 20:56:08

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

票数 5
EN

Stack Overflow用户

发布于 2020-02-25 12:54:15

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

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

代码语言:javascript
运行
复制
[pytest]
addopts = --reuse-db

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

因此,如果您需要为您的测试创建一个DB,则必须通过pytest --create-db命令指定它。

票数 4
EN

Stack Overflow用户

发布于 2022-05-26 07:05:59

您的测试用例结构似乎错了。测试用例不应相互依赖。可以有一些资源,例如在测试用例中常见的模型对象(例如。(通过在setUpClass中初始化它们),但是在一个测试用例中创建的资源不应该在另一个测试用例中可用。

与设置测试用例的方式不同,您可以这样做:

测试POST端点的

1.1。发出POST请求,就像在test_create_object中一样,并断言响应信息

1.2。断言该对象确实存在,最好通过发出GET请求来检查它是否存在于DB中。

测试GET端点的

2.1。最好是直接在DB中创建对象,或者通过发出POST请求来创建对象。

2.2。提出一个GET请求,就像在test_get_object中一样,并断言响应信息

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60336287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档