pytest,如何保持测试之间的数据库更改

时间:2019-12-05 12:46:41

标签: django pytest

我在conftest.py

中使用以下内容
@pytest.fixture(scope='session')
def django_db_setup():
    settings.DATABASES['default'] = {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'my_db',
        'HOST': 'localhost',
    }

它从现有的数据库数据库中读取数据。 现在,我要运行两个测试,并希望在之前的测试中所做的更改能够一直保留到test2(直到文件中的整个测试完成)

def test_1():

    user = User.objects.get(email='a@example.com')
    user.username = 'hello'
    user.save()


def test_2():

    user = User.objects.get(email='a@example.com')
    print(user.username)        # expect 'hello' but it's not
  • 这里有`session / module'的作用域,想知道它是什么意思,session意味着整个测试运行?

以下是我尝试过的操作,但是无效。 (从https://github.com/pytest-dev/pytest-django/blob/master/docs/database.rst的底部开始)

在race.py

@pytest.fixture(scope='session')
def django_db_setup():
    settings.DATABASES['default'] = {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'my_db',
        'HOST': 'localhost',
    }

@pytest.fixture
def db_no_rollback(request, django_db_setup, django_db_blocker):
    # https://github.com/pytest-dev/pytest-django/blob/master/docs/database.rst
    django_db_blocker.unblock()
    request.addfinalizer(django_db_blocker.restore)

在test.py

def test_1(db_no_rollback):

    user = User.objects.get(email='a@example.com')
    user.username = 'hello'
    user.save()


def test_2(db_no_rollback):

    user = User.objects.get(email='a@example.com')
    print(user.username)        # expect 'hello' but it's not

3 个答案:

答案 0 :(得分:1)

您可以使用pytest的“夹具”

import pytest

@pytest.fixture()
@pytest.mark.django_db(transaction=True)
def test_1():

    user = User.objects.get(email='a@example.com')
    user.username = 'hello'
    user.save()

@pytest.mark.django_db(transaction=True)
def test_2(test_1):

    user = User.objects.get(email='a@example.com')
    assert user.username == 'hello'

在这种情况下,test_2将具有来自test_1(夹具)的所有数据库数据

答案 1 :(得分:0)

您可以使用test --keepdb选项防止测试数据库被破坏。这将在两次运行之间保留测试数据库。如果数据库不存在,将首先创建它。任何迁移都将被应用,以使其保持最新状态。 查看this链接。

答案 2 :(得分:0)

您可以使用 --reuse-db 选项重用数据库