使用Python进行数据库测试,PostgreSQL

9

您如何对使用postgresql的python数据访问层进行单元测试?

在sqlite中,您可以为每个测试创建内存数据库,但是postgresql无法实现这一点。

我希望能够使用一个库来设置数据库并在测试完成后清理它。

我正在使用Sqlalchemy作为我的ORM。

4个回答

10

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 将等待所有活动连接关闭。


6

看起来是一个不错的软件包...尽管最后一次提交是6年前。 - Mathieu Rodic

2
你可以使用nose来编写测试,然后在你的安装/卸载方法中使用SQLAlchemy来创建和清理测试数据库。请参考:nosesetup/teardown。注意保留HTML标签。

@Luper Rouch:我该怎么清理数据,以便测试完成后数据库保持相同的状态。我认为启动/回滚事务并不是解决方案。 - StackUnderflow
你可以在拆卸过程中删除整个数据库。 - Luper Rouch
那么我每次都需要为每个测试创建一个新的数据库实例..这不会让测试变得非常缓慢吗?..我只想清除数据库中的所有数据...我猜我可以编写 SQL 在拆卸时清除所有表格数据..虽然我正在寻找类似于 SQLUnit 的东西 - StackUnderflow
是的,与使用SQLite在内存中执行相同的操作相比,这肯定会更慢,但我不确定手动清理(截断表、重置序列等)是否比删除整个数据库更快……更不用说您会在测试中添加潜在的错误。关于SQLUnit,为什么要使用XML或其他不适当的语言编写测试,而不是使用Python更简短地编写它们呢? - Luper Rouch
你是对的... SQLUnit 有点丑陋... 好的.. 我会去创建和删除数据库.. 如果它运行缓慢,我会考虑其他方法.. 谢谢 - StackUnderflow

0

还有QuickPiggy,它能够自我清理。

从文档中可以看到:

可以很容易地获得一个临时的PostgresSQL实例:

pig = quickpiggy.Piggy(volatile=True, create_db='somedb')

conn = psycopg2.connect(pig.dsnstring())


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接