如何查询django-pytest的db fixture创建的Postgres库中的测试数据
db fixture 的核心运行机制 db是 pytest-django 提供的会话级测试 fixture,核心设计目标是完全隔离测试环境和正式业务数据库,从根源上避免测试数据污染正式生产/开发库。- 它的完整运行流程和Django自带的
manage.py test命令的数据库逻辑完全一致:- 读取项目settings中配置的数据库连接参数(主机、端口、账号、密码)
- 在对应Postgres实例上创建一个独立的测试专用数据库,默认自动在原业务库名前加
test_前缀(比如原库叫ecommerce_dev,生成的测试库就是test_ecommerce_dev) - 在这个临时测试库上执行所有Django模型的表结构迁移,完成测试环境初始化
- 切换Django ORM的数据库连接到这个临时测试库,所有测试过程中通过ORM写入的数据,全部落到这个临时库中,不会同步到正式业务库
- 整个测试套件执行完成后,fixture的清理阶段会直接执行
DROP DATABASE命令,将这个临时测试库完全删除,不留任何痕迹
- 单个测试用例的隔离逻辑:测试用例执行时,fixture会在临时测试库中开启独立事务,用例结束后直接回滚事务,保证不同测试用例之间的数据完全无干扰,不会出现A用例写入的数据被B用例读到的情况。
在PgAdmin查询不到测试数据的根本原因
- 你通过PgAdmin连接查询的是配置中的正式业务库,而测试期间写入的数据全部存在带
test_前缀的临时测试库中,本身就不在你查询的目标库里 - 测试全量执行完成后,这个临时测试库已经被fixture的清理逻辑自动删除了,Postgres实例上根本不存在这个库,自然检索不到任何记录
- 就算在测试运行中途打开PgAdmin,也需要先定位到对应
test_前缀的库才能查到内容,否则默认打开的正式库必然是空结果。
通过PgAdmin查看测试期间记录的实操方法
如果只是临时排查测试数据、验证ORM的落库效果,不需要长期留存测试库,可以按以下步骤操作:
- 运行pytest时增加
--reuse-db参数,这个参数会禁用测试结束后的自动删库逻辑,测试跑完后会把临时测试库保留在Postgres实例上,下次运行测试时会直接复用这个库,不再重复建表迁移 - 在需要查看数据的测试用例或fixture代码中,在测试数据写入完成的位置添加
breakpoint(),当测试执行到这行代码时会暂停进程进入Python交互调试模式,此时临时测试库处于存活状态,没有被删除 - 打开PgAdmin,在对应Postgres实例的数据库列表中找到带
test_前缀的临时库,直接执行SQL查询就能看到fixture创建的所有测试记录 - 排查完成后,回到调试终端输入
c(continue命令)让测试继续执行即可 - 如果后续不需要保留这个临时库,再次运行pytest时去掉
--reuse-db参数,测试跑完后fixture就会自动删除这个临时库;也可以直接在PgAdmin中手动drop掉这个库
自定义优化:如果觉得默认
test_前缀的库名不好识别,可以在项目的conftest.py中自定义测试库名称,避免和正式库混淆:import pytest from pytest_django.fixtures import django_db_blocker @pytest.fixture(scope="session") def django_db_setup(django_db_blocker): with django_db_blocker.unblock(): from django.conf import settings # 自定义测试库名称 settings.DATABASES["default"]["TEST"]["NAME"] = "ecommerce_sandbox_test"
内容的提问来源于stack exchange,提问作者user1590561
相关产品推荐
相关产品推荐

