Python pytest如何测试Django的数据库操作_使用pytest-django插件

千墨君_4282

千墨君_4282

2026-05-30

690人浏览

原创

pytest-django更合适,因其自动处理django配置加载、数据库生命周期和事务隔离,避免手动调用django.setup()或重复写testcase;必须安装并配置django_settings_module,测试文件需符合命名规范。

python pytest如何测试django的数据库操作_使用pytest-django插件

pytest-django 为什么比直接用 unittest.TestCase 更合适

因为 pytest-django 自动处理了 Django 的配置加载、数据库生命周期(如创建测试库、迁移、清空)和事务隔离,避免你手动调用 django.setup() 或反复写 TestCase 类。不装它,pytest 默认根本识别不了 settings.py,跑测试会直接报 DjangoSettingNotConfigured 错误。

实操建议:

  • 必须通过 pip install pytest-django 安装,不能只装 pytest
  • 在项目根目录放 pytest.ini 或 pyproject.toml,显式指定 DJANGO_SETTINGS_MODULE,例如:
    [tool:pytest]
    DJANGO_SETTINGS_MODULE = "myproject.settings.test"
  • 测试文件名必须以 test_ 开头或以 _test.py 结尾,否则 pytest 不自动发现

如何让测试用上真实数据库结构(而不是只靠 migrate)

pytest-django 默认使用 --keepdb 或 --create-db 控制数据库行为,但更关键的是:它默认执行 migrate 而非 syncdb —— 这意味着你的 migrations/ 必须是干净的,且不能依赖 sqlmigrate 手动执行的 SQL。

常见错误现象:测试里 MyModel.objects.create() 报 OperationalError: no such table。

原因和解决:

  • 没运行 python manage.py makemigrations,导致迁移文件缺失 → 补全迁移
  • 测试 settings 里 INSTALLED_APPS 比正式环境少,漏了 app → 检查 settings.test.py
  • 用了 pytest --nomigrations 但又没提前建表 → 删掉该参数,或改用 --migrations(默认就启用)

测试中怎么安全地操作数据库而不污染其他测试

pytest-django 默认为每个测试函数开启一个事务,并在退出时 rollback,所以你不需要手动写 TransactionTestCase。但这个机制有前提:数据库后端必须支持 savepoint(SQLite、PostgreSQL、MySQL InnoDB 都支持;MySQL MyISAM 不行)。

python学习
python学习

Python 编程学习助手 skill,面向零基础用户。 当用户表达以下意图时触发: - 学习 Python 基础概念(变量、数据类型、循环、函数、类等) - 请求 Python 练习题或测验 - 请求审查或调试 Python 代码 - 请求 Python 项目实战指导(爬虫、数据分析、Web 开发等入门项目) - 泛化表述如"教我 Python""我想学编程""Python 怎么写""帮我学 Python" 此 skill

下载

实操要点:

  • 避免在测试里调用 transaction.commit() 或 transaction.set_autocommit(False),会破坏自动 rollback
  • 如果真要测 commit 行为(比如信号触发、外部进程读取),得用 @pytest.mark.django_db(transaction=True),此时整个测试用真实 commit,但需自己清理数据
  • 批量插入慎用 bulk_create:它绕过 model 的 save() 方法和信号 → 如需触发 post_save,得逐个 save()

fixture 怎么正确注入模型实例(别再手动 new Model())

直接 MyModel(title="x") 创建对象不会走验证、不触发 __init__ 逻辑,也不进数据库。应该用 django_db fixture + model_bakery 或 factory_boy,或者最简单的:用 pytest.fixture 配合 @pytest.mark.django_db。

示例(不用第三方库):

@pytest.mark.django_db
def test_article_published():
    from myapp.models import Article
    article = Article.objects.create(
        title="Test",
        slug="test",
        is_published=True
    )
    assert article.is_published

注意点:

  • 必须加 @pytest.mark.django_db,否则 Article.objects 报错
  • 不要在 conftest.py 里定义带 @pytest.mark.django_db 的 fixture 并 autouse=True —— 这会让所有测试都连 DB,拖慢速度
  • 想复用数据?写成普通 fixture,但把 @pytest.mark.django_db 放在具体测试函数上,而不是 fixture 上

最容易被忽略的是:Django 测试数据库默认用内存 SQLite,但某些 SQL 特性(如窗口函数、JSON 字段操作)不支持。一旦测试在本地过、CI 失败,先确认 CI 用的是否是和开发一致的 DB 后端 —— pytest-django 不会帮你抹平这个差异。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

django python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1771

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4644

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1749

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

27537

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3327

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3327

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1203

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2583

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 6.1 官方文档
Django 6.1 官方文档

共0课时 | 0人学习

Django 教程
Django 教程

共28课时 | 9.9万人学习

Django DRF 源码解析
Django DRF 源码解析

共21课时 | 2万人学习