
[英]How to initialize the database with your test data for each module? Pytest-django
[英]Database is cleaned up after each test in pytest-django
我想要达到的目标。
我正在 Django 项目中测试 rest API。 我想用相关的测试函数创建测试类(以下每个测试函数都依赖于前一个) - 第一次失败意味着全部失败。 在第一个测试函数中,我创建了一个带有“发布”请求的对象。 在下一个测试用例中,我想使用“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)
是的,pytest-django 在每次测试运行后都会清除您的数据库。
为了解决这个问题,在你的根目录中添加一个名为pytest.ini
的 pytest 配置文件,并添加如下
[pytest]
addopts = --reuse-db
正如这个配置文件所暗示的,它重用当前数据库而不创建新数据库。
所以如果你需要为你的测试创建一个数据库,你必须在命令中指定它pytest --create-db
您可能不想在测试用例之间保留数据。 您应该努力让测试用例能够以任意顺序运行。 如果您希望在测试用例之间共享数据,请在夹具中对其进行初始化并在测试用例中重用它,或者将您的测试用例组合为一个以确保该测试用例中的所有内容按顺序运行。
您的测试用例结构似乎错误。 测试用例不应该相互依赖。 在测试用例中可能有一些资源,例如模型对象(例如,通过在 setUpClass 中初始化它们),但是在一个测试用例中创建的资源不应该在另一个测试用例中使用
而不是您设置测试用例的方式,您可以这样做:
要测试您的 POST 端点:
1.1。 像在test_create_object
中一样发出 POST 请求并断言响应信息
1.2. 断言该对象实际存在,最好通过发出 GET 请求检查它是否存在于数据库中
要测试您的 GET 端点:
2.1。 最好直接在数据库中创建对象或通过发出 POST 请求
2.2. 像在test_get_object
中一样发出 GET 请求并断言响应信息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.