gpt4 book ai didi

django - 如何在使用 pytest-django 的测试之间将数据保存到数据库?

转载 作者:行者123 更新时间:2023-12-04 19:02:41 27 4
gpt4 key购买 nike

在 Django 应用程序的测试运行中使用 pytest/pytest-django 时,如何将数据保存到数据库?

我用 py.test --nomigrations --reuse-db -s 运行 pytest和 Postgres 数据库 test_<configued_db_name>按预期创建,但是在测试之间似乎没有任何内容持久保存到数据库中,并且在测试运行结束时,数据库为空。

import pytest
from django.contrib.auth.models import User


@pytest.mark.django_db(transaction=False)
def test_insert_user():
user = User.objects.create_user(username="test_user", email="test_user@test.com", password="test")
users = User.objects.all()
assert len(users) > 0

@pytest.mark.django_db(transaction=False)
def test_check_user():
users = User.objects.all()
assert len(users) > 0

第一个测试通过,第二个测试并没有让我怀疑是否有任何东西被持久化到 DB。根据 pystest-django 文档 @pytest.mark.django_db(transaction=False)不会回滚受装饰测试影响的任何内容。

谢谢,

/大卫

最佳答案

另一种用每个函数的数据预填充数据库的方法是这样的:

import pytest

from django.contrib.auth.models import User

@pytest.fixture(scope='module')
def django_db_setup(django_db_setup, django_db_blocker):
print('setup')
with django_db_blocker.unblock():
User.objects.create(username='a')
assert set(u.username for u in User.objects.all()) == {'a'}

@pytest.mark.django_db
def test1():
print('test1')
User.objects.create(username='b')
assert set(u.username for u in User.objects.all()) == {'a', 'b'}

@pytest.mark.django_db
def test2():
print('test2')
User.objects.create(username='c')
assert set(u.username for u in User.objects.all()) == {'a', 'c'}

这种方法的好处是 setup 函数只被调用一次:
plugins: django-3.1.2
collected 2 items

mytest.py setup
test1
.test2
.
=================== 2 passed in 1.38 seconds ====================

不好的是,对于这样一个简单的测试来说,1.38 秒有点太多了。 --reuse-db是一种更快的方法。

关于django - 如何在使用 pytest-django 的测试之间将数据保存到数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33928274/

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