python, postgresql中的数据库测试
Posted
技术标签:
【中文标题】python, postgresql中的数据库测试【英文标题】:Database testing in python, postgresql 【发布时间】:2011-02-12 23:36:18 【问题描述】:如何对使用 postgresql 的 python DAL 进行单元测试。
在 sqlite 中,您可以为每个测试创建内存数据库,但对于 postgresql 则无法做到这一点。
我想要一个可用于设置数据库并在测试完成后清理它的库。
我使用 Sqlalchemy 作为我的 ORM。
【问题讨论】:
【参考方案1】:pg_tmp(1) 是一个旨在简化此任务的实用程序。以下是您可以使用 SQLAlchemy 启动新连接的方法:
from subprocess import check_output
from sqlalchemy import create_engine
url = check_output(['pg_tmp', '-t'])
engine = create_engine(url)
这将启动一个新数据库,该数据库会在 60 秒内自动销毁。如果连接打开,pg_tmp
将一直等待,直到所有活动连接都关闭。
【讨论】:
【参考方案2】:你试过testing.postgresql吗?
【讨论】:
【参考方案3】:您可以使用 nose 编写测试,然后只需使用 SQLAlchemy 在您的 setup/teardown 方法中创建和清理测试数据库。
【讨论】:
@Luper Rouch:我应该如何清理,以便测试完成后数据库处于相同状态。我不认为启动/回滚事务是解决方案。 您可以先将整个数据库放入拆解中。 所以我必须为每个测试创建一个新的数据库实例。这不会让测试变得非常慢吗?..我只想清理数据库中的所有数据......我想我可以编写 SQL 来清理拆卸中的所有表数据。虽然我一直在寻找类似 SQLUnit 的东西 是的,这肯定会比使用 sqlite 在内存中执行相同操作要慢,但我不确定手动清理(截断表、重置序列等)会更快而不是删除整个数据库......不计算您在测试中添加潜在错误的事实。关于 SQLUnit,既然可以用 Python 写得更短,为什么还要用 XML 或其他不合适的语言编写测试? 你说得对...SQLUnit 有点丑... k.. 我会去创建和删除 dbs.. 如果它很慢会处理其他路线.. 谢谢跨度> 【参考方案4】:还有QuickPiggy,它能够自行清理。 来自文档:
一个临时的 PostgresSQL 实例很容易获得:
pig = quickpiggy.Piggy(volatile=True, create_db='somedb')
conn = psycopg2.connect(pig.dsnstring())
【讨论】:
以上是关于python, postgresql中的数据库测试的主要内容,如果未能解决你的问题,请参考以下文章
celery 任务无法使用 python 遍历 postgresql 数据库中的多行
基准测试:PostgreSQL 上的 bigint 与 int
嵌入式 PostgreSQL for Java JUnit 测试
从独立的python脚本访问postgresql上的django数据库