【问题标题】:How to use SQLite :memory: database in webpy for unittesting如何在 webpy 中使用 SQLite :memory: 数据库进行单元测试
【发布时间】:2009-08-09 22:01:28
【问题描述】:

我想在我的 webapp 中使用内存中的 SQLite (":memory:") DB 进行测试。我使用nosetests 进行测试,并使用webpy 作为框架。

我想在 setup() 函数中填充数据库,然后运行我的所有测试。我的问题是 webpy 会在每次请求后关闭所有打开的数据库连接,并且 SQLite :memory: DB 只会持续到您关闭连接,所以只有第一个测试实际运行正确,而其他所有测试都失败了。

我的选择是在磁盘支持的数据库上运行测试,或者在每个单独测试开始时在内存中重新创建整个数据库。

您知道如何防止 webpy 在每次请求后关闭数据库连接吗? 你能想出任何其他方法来使用 webpy 获得一个持续多个请求的内存 SQLite DB 吗?

【问题讨论】:

    标签: unit-testing sqlite nosetests web.py


    【解决方案1】:

    也许您可以在存储在磁盘上的数据库上运行测试,但使用RAM disk。在 Windows 中,您可以安装驱动程序来设置 RAM 磁盘 (some instructions here)。在Linux下,相信你要设置tmpfs

    ram 磁盘的作用与硬盘完全一样,但完全从内存中操作,因此您将失去一些从硬盘加载文件的开销。

    【讨论】:

    • 这是一个很好的建议,但它会使随机测试仪的设置变得复杂。就我而言,这不值得。
    【解决方案2】:

    未经测试:

    class NoCloseDB(web.db.SqliteDB):
      def _unload_context(self):
        pass # this keeps the _ctx.db attribute alive
    web.db.register_database('sqlite',NoCloseDB) # overrides the previous registration
    

    请注意,这只有在您以仅使用一个操作系统进程的方式运行 web.py 时才有效。如果一个请求跨多个进程分派,每个进程仍将获得自己的数据库。

    【讨论】:

    • 它不起作用,_unload_context 在请求结束时没有显式调用,只有在显式提交或回滚之后。再深入一点,事实证明整个 _ctx 对象(以及附加到该线程的任何 ThreadedDict)实际上已在 web.application._cleanup 中删除。我现在在想,解决这个问题的最佳方法可能是安装 DBUtils 并使用 1 个连接池进行连接。
    猜你喜欢
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 2018-07-29
    • 2020-11-01
    • 1970-01-01
    • 2019-02-14
    相关资源
    最近更新 更多