gpt4 book ai didi

django - Pytest 使用 django_db 和 rest 框架

转载 作者:行者123 更新时间:2023-12-04 12:06:38 25 4
gpt4 key购买 nike

我正在尝试进行一个简单的测试来对抗真实的 django_db不是使用 django rest framework 的测试数据库.

基本测试设置:

import pytest
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APIClient

@pytest.mark.django_db
def test_airport_list_real():
client = APIClient()
response = client.get(reverse('query_flight:airports-list'))
assert response.status_code == 200
assert len(response.json()) > 0

运行这个测试我得到:
___________________________ test_airport_list_real ____________________________

@pytest.mark.django_db
def test_airport_list_real():
client = APIClient()
response = client.get(reverse('query_flight:airports-list'))
assert response.status_code == 200
> assert len(response.json()) > 0
E assert 0 > 0
E + where 0 = len([])
E + where [] = functools.partial(<bound method Client._parse_json of <rest_framework.test.APIClient object at 0x000001A0AB793908>>, <Response status_code=200, "application/json">)()
E + where functools.partial(<bound method Client._parse_json of <rest_framework.test.APIClient object at 0x000001A0AB793908>>, <Response status_code=200, "application/json">) = <Response status_code=200, "application/json">.json

query_flight\tests\query_flight\test_api.py:60: AssertionError

当使用 pipenv run python manage.py shell 在 shell 中运行时我得到了预期的结果:
在 [1]:从 django.urls 导入反向
In [2]: from rest_framework.test import APIClient

In [3]: client = APIClient()

In [4]: response = client.get(reverse('query_flight:airports-list'))

In [5]: len(response.json())
Out[5]: 100

使用以下软件包:
pytest-django==3.2.1
pytest [required: >=2.9, installed: 3.5.1]
djangorestframework==3.8.2
django [required: >=1.8, installed: 2.0.5]

有没有办法拿到 pytest以这种方式访问​​真正的数据库?

最佳答案

django_db标记只负责为标记的测试提供到测试数据库的连接。 django 设置传递给 pytest-django全权负责选择用于测试运行的数据库。

您可以覆盖 pytest-django 中的数据库使用情况通过定义 django_db_setup fixture 。创建一个 conftest.py如果您还没有项目根目录中的文件并覆盖数据库配置:

# conftest.py
import pytest

@pytest.fixture(scope='session')
def django_db_setup():
settings.DATABASES['default'] = {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'path/to/dbfile.sqlite3',
}

但是,您不应该在测试中使用真实的数据库。转储当前数据库以获取测试数据的快照 ( python manage.py dumpdata > testdata.json ) 并将其加载到空的测试数据库中以在测试运行之前填充它:
# conftest.py
import pytest
from django.core.management import call_command

@pytest.fixture(scope='session')
def django_db_setup(django_db_setup, django_db_blocker):
with django_db_blocker.unblock():
call_command('loaddata', 'testdata.json')

现在,你不可能在运行测试时破坏你的真实数据库;真实数据库中的任何 future 更改都不会导致测试失败(例如,当某些数据被删除时),并且每次测试运行时始终具有确定性状态。如果您需要一些额外的测试数据,请将其以 JSON 格式添加到 testdata.json你的测试很顺利。

来源: Examples in pytest-django docs .

关于django - Pytest 使用 django_db 和 rest 框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50381739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com