如何使用'pytest-django`在一些测试中重用数据库?

kognpnkq  于 2022-12-27  发布在  Go
关注(0)|答案(1)|浏览(154)

根据文档,应该使用--reuse-dbpytest.ini中的addopts = --reuse-db。我尝试了两种方法,它们都不起作用。当前的测试必须在每个测试开始时注册并验证新用户,以便能够访问需要登录的功能。这使得测试运行缓慢,并且随着测试数量的增长,这变得越来越不方便。下面是一个示例来演示:

@pytest.mark.django_db
class TestSignIn:
    def test_valid_user(self, client, valid_user_data, django_user_model, django_db_keepdb):
        client_signup(client, valid_user_data, django_db_keepdb)
        response = activate_user(client)
        assert 'sign out' in get_text(response)

    def test_sign_in(self, client, valid_user_data, django_user_model, django_db_keepdb):
        client_signup(client, valid_user_data)
        activate_user(client)
        response = client.post(reverse('signout'), follow=True)
        assert 'sign in' in get_text(response)
        response = client_sign_in(client, valid_user_data)
        assert 'sign out' in get_text(response)

test_valid_user中,创建了一个新用户,激活用户后,用户将显示:

>>> django_user_model.objects.count()
1

我使用以下方法进行验证:

>>> django_db_keepdb
True

我想重用上一个测试中创建的用户,而不是创建一个新用户。在指定了--reuse-db的情况下,我希望第二个测试test_sign_in检测到完全相同的用户。

>>> django_user_model.objects.count()
0
oxiaedzo

oxiaedzo1#

问题是django_db_keepdb fixture用于指示数据库在测试完成后不应被销毁。它不阻止数据库在测试之间被重置。为了在测试之间重用同一用户,您需要使用django_db_reset_sequences fixture。此fixture将重置数据库并保留数据,允许您在后续测试中重用相同的数据。
django_db_reset_sequences固定装置在运行中:

@pytest.mark.django_db
class TestSignIn:
    def test_valid_user(self, client, valid_user_data, django_user_model, django_db_reset_sequences):
        client_signup(client, valid_user_data)
        response = activate_user(client)
        assert 'sign out' in get_text(response)

def test_sign_in(self, client, valid_user_data, django_user_model, django_db_reset_sequences):
    client_signup(client, valid_user_data)
    activate_user(client)
    response = client.post(reverse('signout'), follow=True)
    assert 'sign in' in get_text(response)
    response = client_sign_in(client, valid_user_data)
    assert 'sign out' in get_text(response)

您还需要在每个测试函数的参数列表中包含django_db_reset_sequences fixture,这将重置数据库并保留测试之间的数据,允许您在两个测试中重用同一个用户。

相关问题