0

0

Python 集成测试的数据库管理方案

舞夢輝影

舞夢輝影

发布时间:2026-02-19 17:31:03

|

107人浏览过

|

来源于php中文网

原创

最稳妥的数据库隔离方式是事务级回滚,pytest-django或sqlalchemy的test_transaction模式可自动在setup开启、teardown回滚事务,速度快且不写磁盘;但需注意其对commit后外部连接不可见,且无法拦截触发器或存储过程的硬写操作。

python 集成测试的数据库管理方案

pytest 做集成测试时,数据库怎么清空才不串数据

测试之间必须隔离,否则前一个测试改了 users 表,后一个测试查不到预期记录,错误就藏在“看起来跑通了”的假象里。最稳妥的方式不是靠人工删表,而是让每个测试用独立数据库或事务回滚。

推荐优先用事务级隔离:pytest + pytest-djangosqlalchemytest_transaction 模式能自动在 setUp 开事务、tearDown 回滚,不碰磁盘,快且干净。但注意:它对 COMMIT 后的外部连接(比如另一个进程查库)不可见,也拦不住触发器或存储过程里的硬写操作。

  • PostgreSQL 用户慎用 TRUNCATE 清表——它不走事务,会破坏回滚逻辑
  • SQLite 内存数据库(sqlite:///:memory:)适合单测,但集成测试若依赖 DB 特性(如外键行为、并发锁),内存库表现可能和真实环境不一致
  • MySQL 8.0+ 支持 CREATE DATABASE test_db_123 动态建库,配合随机后缀可彻底隔离,但启动慢、占资源,CI 里得配好连接池超时

alembic 升级脚本在测试环境怎么跳过或重定向

集成测试要跑在“已迁移完成”的库上,但你不能每次跑测试都真执行一遍 alembic upgrade head——它可能耗时、依赖网络、甚至因历史版本 bug 卡住。

正确做法是把测试数据库直接迁到目标版本,跳过中间步骤。用 alembic stamp head 把当前库标记为最新版(不执行 SQL),再让测试代码从干净状态重建 schema。前提是你的模型定义和 alembic 版本严格对齐,否则 stamp 后的表结构和 ORM 映射会错位。

立即学习Python免费学习笔记(深入)”;

ecshop
ecshop

本版本全面兼容php5.6+,并且修复了许多官方程序的低级代码bug。在apache 2.4.17+php5.6.15环境下测试通过,人格保证无毒无木马,仅仅是一名ecshop热爱者心血来潮之作。ecshop编译更新日志:1、加入最新官方补丁。2、修改数据库连接底层为mysqli, 现在完美无缺了。3、再次对所有代码进行细节修复。4、adminers更新至1.1.2, 在线管理数据库的神器。5、测

下载
  • 别在 conftest.py 里无条件调 alembic upgrade——CI 多并行任务会抢同一张 alembic_version 表,报 duplicate key value violates unique constraint
  • 如果测试需要特定旧版本 schema(比如验证迁移逻辑本身),用 alembic downgrade -1 回退一级,但必须确保 down revision 函数可逆且无副作用
  • alembic 配置里设 script_location = tests/alembic,和主项目分开,避免测试误用生产迁移脚本

测试数据库连接泄露导致 too many connections

Python 的 SQLAlchemyasyncpg 连接不会自动关,尤其用了 sessionmakercreate_engine(pool_pre_ping=True) 却没显式 close(),跑几十个测试后连接数就爆了。

根本解法是绑定生命周期:用 pytestyield_fixtureasync def fixture 确保 engine.dispose()pool.close() 必然执行。别信“退出进程自动清理”——pytest 可能复用进程,连接就卡着不动。

  • 异步测试(async def test_xxx)必须用 await engine.dispose(),普通 .dispose() 会阻塞事件循环
  • PostgreSQL 的 max_connections=100 是全局限制,一个测试模块启 5 个 engine 实例 × 每个池大小 10 = 直接打满
  • 加个检查:测试启动前执行 SELECT count(*) FROM pg_stat_activity WHERE datname = 'testdb';,超 5 就报警,早发现泄漏点

Docker Compose 启停数据库太慢,怎么提速

本地跑集成测试时,每轮都 docker-compose up -d db + 等健康检查,光等 PostgreSQL ready 就要 5–8 秒,拖慢反馈节奏。

实际不需要每次重启容器。用 docker-compose exec db psql -U testuser -c "DROP DATABASE testdb; CREATE DATABASE testdb;" 清库比重建容器快 3 倍以上。前提是容器一直运行,且数据库用户有 CREATEDB 权限。

  • 别用 depends_on: { condition: service_healthy }——Docker 默认健康检查只 ping 端口,PostgreSQL 可能端口通了但还没接受连接,得自己写脚本查 pg_isready
  • 测试镜像里预装 pg_isreadymysqladmin,比用 curl http://db:5432 可靠得多
  • CI 中用 cache_from 缓存带数据库的测试镜像,避免每次拉取 500MB 的 PostgreSQL 官方镜像

数据库管理真正的复杂点不在“怎么清”,而在“什么时候清”——事务回滚快但掩盖了真实提交路径;动态建库彻底但拖慢 CI;共享容器省事但要求所有测试遵守同一套连接生命周期。选哪条路,取决于你愿为隔离性多付多少调试时间。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

986

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

334

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

377

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1739

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

374

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1292

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

585

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

436

2024.04.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

660

2026.02.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.4万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号