使用SQLAlchemy和PostgreSQL的Flask单元测试耗尽了数据库连接

时间:2013-04-20 05:43:16

标签: python unit-testing sqlalchemy flask flask-sqlalchemy

我使用Flask,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

似乎池中只有一个连接(每个测试显示db.engine.pool.status():池大小:5池中的连接:1当前溢出:-4当前已检出连接:0) ,但不知何故,应用程序永远不会断开连接。显然,为每个测试用例创建了一个新的应用程序实例,根据文档,这似乎很好。如果我将应用程序创建移动到模块级别,它可以正常工作。

有谁知道为什么会这样?

由于

1 个答案:

答案 0 :(得分:3)

在db.drop_all()

之后添加db.get_engine(self.app).dispose()