【发布时间】:2021-04-12 13:16:26
【问题描述】:
我使用 pytest 为我的 django 项目编写与 db 相关的测试。我使用 db 夹具在数据库中创建记录。测试工作正常,但如何从真正的 Postgres 数据库中选择这些记录。当我尝试通过 PgAdmin 选择这些记录时,我得到空列表。能否请您解释一下 db fixture 的工作原理以及它在哪里存储记录?
【问题讨论】:
标签: django pytest pytest-django
我使用 pytest 为我的 django 项目编写与 db 相关的测试。我使用 db 夹具在数据库中创建记录。测试工作正常,但如何从真正的 Postgres 数据库中选择这些记录。当我尝试通过 PgAdmin 选择这些记录时,我得到空列表。能否请您解释一下 db fixture 的工作原理以及它在哪里存储记录?
【问题讨论】:
标签: django pytest pytest-django
pytest.mark.django_db 将整个测试包装在一个事务中(在测试结束时回滚),这在 pgadmin 中是不可见的。
您可以尝试使用@pytest.mark.django_db(transaction=True) 在您的测试中启用测试事务。但是,它速度较慢,并且在测试后刷新数据库
【讨论】:
在运行测试时,Django 会创建第二个临时数据库并在其中运行测试,因此它不会影响您的生产/开发数据库,并且您将始终获得相同的预测结果。
最重要的是,根据每个测试的配置方式,Django 可以将测试包装在一个事务中,该事务将在特定测试完成后回滚,因此测试不会相互影响。
如果你想在你的真实数据库中看到这些数据,在测试完成后,你必须配置你的测试,你希望它持久化,不被包装在事务中。当您使用pytest-django 时,有两种可能的方法来处理它,具体取决于您使用的测试套件的“风格”:
django.test 使用TestCase 或TransactionTestCase,则切换到SimpleTestCase。请注意,与此事务回滚一起,您将失去更多与数据库相关的功能。pytest.mark.django_db,只需将其删除即可。对于单独的数据库,您可以在测试期间直接连接到它,也可以在运行测试时在命令行中添加--reuse-db,这样pytest-django 在测试完成后不会破坏它。这个单独的数据库只会在您的常规数据库名称中添加 test_ 前缀。
【讨论】: