2013-04-20 78 views
3

我使用Flask,SQLAlchemy和PostgreSQL運行一套相當簡單的測試用例。使用應用程序的工廠,我已經定義了一個基本單元測試類,像這樣:使用SQLAlchemy和PostgreSQL進行瓶單元測試耗盡數據庫連接

class BaseTestCase(unittest.TestCase): 
    def setUp(self): 
     self.app = create_app() 
     self.app.config.from_object('app.config.test') 
     self.api_base = '/api/v1' 

     self.ctx = self.app.test_request_context() 
     self.ctx.push() 

     self.client = self.app.test_client() 
     db.create_all() 

    def tearDown(self): 
     db.session.remove() 
     db.drop_all(app=self.app) 
     print db.engine.pool.status() 
     if self.ctx is not None: 
      self.ctx.pop() 

一切順利幾個單元測試,直到:

OperationalError: (OperationalError) FATAL: remaining connection slots are reserved for non-replication superuser connections 

看來,只有1連接池(db.engine.pool.status()爲每個測試顯示:池大小:5池中的連接:1當前溢出:-4當前檢出連接:0),但不知何故應用程序永遠不會斷開連接。顯然,每個測試用例都會創建一個新的應用程序實例,根據文檔,這看起來很好。如果我將應用程序創建移動到模塊級別,它可以正常工作。

有誰知道爲什麼會發生這種情況?

感謝

+2

聽起來像create_app()後打create_engine()和做的事情吧。 – zzzeek 2013-04-20 07:06:56

+0

我看到相同的錯誤,但只是間歇性/不確定性。雖然PostgreSQL是本地的,但我有依賴網絡資源的測試,而且這個錯誤似乎只發生在我們的網絡很脆弱時。所以有可能其他一些網絡請求導致測試等待,同時SQLAlchemy連接超時。 – glyphobet 2013-06-26 13:55:01

回答

3

添加db.get_engine(self.app).dispose() db.drop_all()