如何从 django-pytest db fixture 创建的真实数据库中查询数据

问题描述

我使用 pytest 为我的 django 项目编写了与数据库相关的测试。我使用 db fixture 在数据库中创建记录。测试工作正常,但如何从真正的 Postgres 数据库中选择这些记录。当我尝试通过 PgAdmin 选择这些记录时,我得到了空列表。您能否阐明 db fixture 的工作原理以及它存储记录的位置?

解决方法

pytest.mark.django_db 将整个测试包装在一个事务中(在测试结束时回滚),该事务在 pgadmin 中不可见。

您可以尝试使用 @pytest.mark.django_db(transaction=True) 在您的测试中启用测试交易。但是比较慢,测试后刷新数据库

,

在运行测试时,Django 会创建第二个临时数据库并在其中运行测试,因此它不会影响您的生产/开发数据库,​​并且您将始终获得相同的预测结果。

最重要的是,根据每个测试的配置方式,Django 可以将测试包装在一个事务中,该事务将在特定测试完成后回滚,因此测试不会相互影响。

如果你想在你的真实数据库中看到这些数据,在测试完成后,你必须配置你的测试,你想让它持久化,不包含在事务中。当您使用 pytest-django 时,有两种可能的方法来处理该问题,具体取决于您使用的是哪种“风格”的测试套件:

  • 如果您使用 TestCase 中的 TransactionTestCasedjango.test,请切换到 SimpleTestCase。请注意,与此事务回滚一起,您将失去更多与数据库相关的功能。
  • 如果您使用的是 pytest.mark.django_db,只需将其删除即可。

对于单独的数据库,您可以在测试期间直接连接到它,也可以在运行测试时在命令行中添加一个 --reuse-db,这样 pytest-django 不会在测试完成后销毁它已完成。这个单独的数据库只会在您的常规数据库名称中添加 test_ 前缀。