【问题标题】:Database testing in python, postgresqlpython, postgresql中的数据库测试
【发布时间】:2011-02-12 23:36:18
【问题描述】:

如何对使用 postgresql 的 python DAL 进行单元测试。

在 sqlite 中,您可以为每个测试创建内存数据库,但对于 postgresql 则无法做到这一点。

我想要一个可用于设置数据库并在测试完成后清理它的库。

我使用 Sqlalchemy 作为我的 ORM。

【问题讨论】:

    标签: python unit-testing postgresql sqlalchemy data-access-layer


    【解决方案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())

        【讨论】:

          猜你喜欢
          • 2019-10-28
          • 2018-12-13
          • 1970-01-01
          • 2015-07-02
          • 2015-06-13
          • 2021-04-29
          • 2015-05-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多