如何使用SQLite:memory:web py中的数据库进行单元测试

时间:2009-08-09 22:01:28

标签: unit-testing sqlite nosetests web.py

我想在内存中使用SQLite(“:memory:”)DB来进行webapp中的测试。我正在使用nosetests进行测试,将webpy用作框架。

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

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

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

2 个答案:

答案 0 :(得分:2)

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

ram磁盘的行为与硬盘完全相同,但它将完全从内存中运行,因此您将失去向/从硬盘加载文件的一些开销。

答案 1 :(得分: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时,此方法才有效。如果在多个进程中分派请求,则每个进程仍将获得自己的数据库。