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数据库

利用Python将Oracle表中的数据抽到PostgreSQL

利用Python将Oracle表中的数据抽到PostgreSQL