在我进行了大约 100 个单元测试之后,我刚刚在我的烧瓶应用程序上运行单元测试时遇到了问题。所有单元测试都将通过,但是当一次全部运行时,它们将失败并出现以下错误:
OperationalError: (OperationalError) FATAL: remaining connection slots are reserved for non-replication superuser connections
一切都在本地机器上的 virtualbox/vagrant/ubuntu12.04 实例中运行。我的 postgres max_connections 设置为 100,所以我假设连接没有关闭,并且在运行 100 次测试后,我用完了所有可用的连接。
这个人使用 SQLAlchemy 和 PostgreSQL 进行 Flask 单元测试耗尽了数据库连接,看起来他们遇到了同样的问题。Mike/Zzzeek(sqlalchemy 开发人员)甚至回应说 create_app() 中可能发生了一些事情,所以我也将其包括在下面。
这是否意味着我没有在某处关闭我的连接?所有这些错误都是由db.create_all()
我的单元测试的 setUp() 方法触发的。
# 测试.py
class TestCase(DataMixin, Base):
"""Base test class"""
def create_app(self):
return create_app(TestConfig())
def setUp(self):
db.create_all()
def tearDown(self):
db.session.remove()
db.drop_all()
# 应用程序.py
def create_app(config=None):
app = Flask(__name__)
# Config
app.config.from_object(BaseConfig())
if config is not None:
app.config.from_object(config)
# Extensions
db.init_app(app)
mail.init_app(app)
bcrypt.init_app(app)
# Blueprints
app.register_blueprint(core_blueprint, url_prefix='/')
app.register_blueprint(accounts_blueprint, url_prefix='/account')
app.register_blueprint(admin_blueprint, url_prefix='/admin')
app.register_blueprint(cart_blueprint, url_prefix='/cart')
# Login Manager
login_manager.setup_app(app, add_context_processor=True)
login_manager.login_view = "accounts.login"
login_manager.user_callback = load_user
# Templates
app.jinja_env.globals['is_admin'] = is_admin
app.jinja_env.globals['is_staff'] = is_staff
@app.context_processor
def inject_cart():
cart = count = None
if current_user.is_authenticated():
cart = current_user.get_cart()
return dict(cart=cart)
# Error Handling
@app.errorhandler(404)
def page_not_found(error):
return render_template('404.html'), 404
return app