python - 如何防止 pytest 删除测试用例之间的数据库记录?

标签 python django pytest django-testing

我使用预先创建的 postgres 数据库进行测试。这里是 pytest 设置:
pytest.ini:

[pytest]
norecursedirs = frontend static .svn _build tmp*    
DJANGO_SETTINGS_MODULE = src.settings.testing
addopts = --reuse-db

测试.py:

from .base import *

DEBUG = True

DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'db',
        'USER': 'root',
        'PASSWORD': 'pass',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

测试 fixture :

@pytest.fixture(scope='session')
def user():
    return User.objects.create(name='Test', )

测试用例:

import pytest

pytestmark = pytest.mark.django_db


def test_user(user):
    print(user.pk) # returns pk of newly created user
    print(User.objects.all()) # returns queryset with one user


def test_user2(user):
    print(user.pk) # returns the same value as in the previous test 
    print(User.objects.all()) # returns empty queryset

我无法理解 pytest 装置的行为。每个 session 创建一次模型实例,并且在多个测试用例中都是相同的。但实际的 db 值是不同的。 Pytest 删除第一个测试用例后的用户值。
我怎样才能防止这种行为并为所有测试 session 保存我的数据库记录?

最佳答案

这不是 --reuse-db 的问题,因为在同一测试运行中,用户已从一个测试移至下一个测试。

问题是你要通过一个session范围来设置fixture,这意味着fixture将在每次测试运行时执行一次,并且由于Django会在测试之间刷新数据库你的用户实例不再可用于第二个测试。只需从 fixture 装饰器中删除范围:

@pytest.fixture()
def user():
    return User.objects.create(username='Test')

编辑来自pytest-django docs “一旦设置好,数据库就会被缓存以用于所有后续测试,并回滚事务以将测试彼此隔离。这与标准 Django TestCase 使用数据库的方式相同。”

我不明白您为什么要在测试之间使用完全相同的 User 实例,即使您要改变该特定实例,这也意味着测试将相互依赖。为了能够隔离测试,您应该能够按照测试的预期提供用户。

关于python - 如何防止 pytest 删除测试用例之间的数据库记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46033321/

相关文章:

python - 如何初始化 Keras 模型中的偏差?

python - 如何防止 pandas.to_datetime() 函数将 0001-01-01 转换为 2001-01-01

python - 使用 Python Faker 包的不同假数据的最大限制

python - django 将关系添加到用户模型

python - Py.test 修补模块内对象

python - 使用需求 ID 标记 py.test 测试

python - 如何在不初始化 GPU 的情况下使我的包可导入

django - 在Django中自定义项目和应用程序模板

django - 如何使用 CreateView 将用户对象传递到 Modelform

python - Pytest 编译时间太长