2009-08-09 41 views
0

我想在內存中使用SQLite(「:memory:」)DB作爲我的webapp中的測試。我使用nosetests進行測試,並使用webpy作爲框架。如何在單元測試中使用SQLite:memory:webpy中的數據庫

我想在setup()函數中填充數據庫,然後運行我所有的測試。我的問題是,webpy在每次請求後關閉所有打開的數據庫連接,SQLite:memory:數據庫只會持續到關閉連接,因此只有第一個測試實際運行正常,其他所有測試都失敗。

我的選擇是在磁盤備份數據庫上運行測試,或者在每個單獨測試開始時重新創建內存中的整個數據庫。

你知道如何防止每次請求後關閉數據庫連接的webpy? 你能想到任何其他方式來獲得內存SQLite數據庫,持續多個請求使用webpy?

回答

2

也許你可以運行存儲在磁盤上的數據庫的測試,但使用RAM disk。在Windows中,您可以安裝驅動程序來設置RAM磁盤(some instructions here)。在Linux中,我相信你要設置tmpfs

ram磁盤的作用與硬盤完全相同,但是將完全從內存中運行,因此您將失去將文件加載到硬盤或從硬盤加載文件的一些開銷。

+0

這是一個很好的建議,但它會使隨機測試儀的設置複雜化。在我的情況下,這是不值得的。 – 2009-08-10 08:58:41

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才能做到這一點。如果跨多個進程分派請求,則每個進程仍將獲得自己的數據庫。

+1

它不起作用,只有在顯式提交或回滾後,_unload_context纔會在請求結束時顯式調用。挖掘一點,事實證明,整個_ctx對象(連同此線程的任何ThreadedDict)實際上在web.application._cleanup中被刪除。我現在想,也許解決這個問題的最好方法是安裝DBUtils並使用1個連接池進行連接。 – 2009-08-10 08:58:09

相關問題