docker 在pytest-django中,每次测试后数据库不会被清理

wljmcqd8  于 11个月前  发布在  Docker
关注(0)|答案(1)|浏览(97)

我在docker中使用pytest-django与Postgres数据库时遇到了一个问题。问题是pytest在将数据添加到数据库后不会删除数据。当你再次运行相同的测试时,它们仍然可见。我不知道这是pytest,docker还是数据库配置的错误:(

@pytest.fixture
def django_db_setup():
    settings.DATABASES['default'] = {
        'ENGINE': 'django.db.backends.postgresql',
        'HOST': 'postgres',
        'NAME': 'name',
    }
@pytest.mark.django_db
@pytest.mark.parametrize("parm1,parm2,expected1,expected2", [
    (
            '000-01', 'NEW', 'NEW', '000-01'
    ),
    (
            '000-02', 'NEW2', 'NEW2', '000-02'
    ),

])
def test_add_model(parm1,parm2,expected1,expected2):
    obj = AddModel(
        field1=parm1, field2=parm2
    )
    new = obj.create()
    assert new.field1 == expected1
    assert new.field2 == expected2

字符串
重新运行此测试会产生错误:重复键值违反唯一约束

ddrv8njm

ddrv8njm1#

这里只缺少transaction=True

@pytest.mark.django_db(transaction=True)

字符串
有可能你不想在插入数据后删除它,你想要的是在事务中运行测试(结果相同)
https://pytest-django.readthedocs.io/en/latest/database.html#testing-transactions
测试交易
Django本身有一个TransactionTestCase,它允许你测试transactions,并在测试之间刷新数据库以隔离它们。这样做的缺点是,由于需要刷新数据库,这些测试的设置速度要慢得多。pytest-django也支持这种类型的测试,你可以使用django_db标记的参数来选择:

@pytest.mark.django_db(transaction=True)
def test_spam():
    pass  # test relying on transactions


编辑:也有可能你不想在运行之间重用测试数据库,而希望每次都创建一个新的数据库:
https://pytest-django.readthedocs.io/en/latest/database.html#reuse-db-reuse-the-testing-database-between-test-runs
我认为前者可能是你想要的,而不是后者,虽然

相关问题