Python 烧瓶app单元测试期间抛出的InvalidRequestError
我已经构建了一个大型Flask应用程序,并且已经连续运行了几年的单元测试。最近,我开始看到抛出以下错误:Python 烧瓶app单元测试期间抛出的InvalidRequestError,python,unit-testing,flask,flask-sqlalchemy,python-unittest,Python,Unit Testing,Flask,Flask Sqlalchemy,Python Unittest,我已经构建了一个大型Flask应用程序,并且已经连续运行了几年的单元测试。最近,我开始看到抛出以下错误: InvalidRequestError: This Session's transaction has been rolled back due to a previous exception during flush. sqlalchemy似乎没有在拆卸过程中正确地释放会话,这很奇怪,因为应用程序中没有任何更改?当我尝试重新运行unittests并在数据库中具有相同的唯一条目时,就会发生
InvalidRequestError: This Session's transaction has been rolled back due to a previous exception during flush.
sqlalchemy似乎没有在拆卸过程中正确地释放会话,这很奇怪,因为应用程序中没有任何更改?当我尝试重新运行unittests并在数据库中具有相同的唯一条目时,就会发生这种情况。例如,为了测试,我用测试数据填充数据库,其中包括用户(具有唯一的电子邮件、用户名);第一次运行unittests时,它工作正常,但第二次失败
这让我相信这是一个关于会话拆卸的问题,我对此理解得不够透彻
单元测试代码示例:
配置设置
(相关)要求
- 烧瓶(0.12.1)
- 炼金术(2.1)
- SQLAlchemy(1.1.9)
错误:测试验证协议(测试api 1 0.CredentialsModelTestCase)
检查身份验证和凭据
回溯(最近一次呼叫最后一次):
文件“/Users/dh/Documents/GitHub/web-tata/web-tata/tests/test\u-api\u 1\u-0.py”第77行,在test\u-authentication\u协议中
db.session.commit()
文件“/Users/dh/Documents/GitHub/web-tata/web-tata/flask/lib/python2.7/site-packages/sqlalchemy/orm/scoping.py”,do第157行
返回getattr(self.registry(),name)(*args,**kwargs)
文件“/Users/dh/Documents/GitHub/web-tata/web-tata/flask/lib/python2.7/site-packages/sqlalchemy/orm/session.py”,提交中第874行
self.transaction.commit()
提交文件“/Users/dh/Documents/GitHub/web-tata/web-tata/flask/lib/python2.7/site-packages/sqlalchemy/orm/session.py”,第461行
self.\u prepare\u impl()
文件“/Users/dh/Documents/GitHub/web-tata/web-tata/flask/lib/python2.7/site-packages/sqlalchemy/orm/session.py”,第441行,在
self.session.flush()
文件“/Users/dh/Documents/GitHub/web-tata/web-tata/flask/lib/python2.7/site-packages/sqlalchemy/orm/session.py”,第2139行,齐平
自冲洗(对象)
文件“/Users/dh/Documents/GitHub/web-tata/web-tata/flask/lib/python2.7/site-packages/sqlalchemy/orm/session.py”,第2259行,在
事务.rollback(\u capture\u exception=True)
文件“/Users/dh/Documents/GitHub/web-tata/web-tata/flask/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py”,第66行,在退出
兼容性(exc_类型、exc_值、exc_tb)
文件“/Users/dh/Documents/GitHub/web-tata/web-tata/flask/lib/python2.7/site-packages/sqlalchemy/orm/session.py”,第2223行,在
flush_context.execute()
文件“/Users/dh/Documents/GitHub/web-tata/web-tata/flask/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py”,执行中第389行
rec.execute(self)
文件“/Users/dh/Documents/GitHub/web-tata/web-tata/flask/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py”,执行中的第548行
uow
文件“/Users/dh/Documents/GitHub/web-tata/web-tata/flask/lib/python2.7/site packages/sqlalchemy/orm/persistence.py”,第181行,在save_obj mapper,table,insert中)
文件“/Users/dh/Documents/GitHub/web-tata/web-tata/flask/lib/python2.7/site-packages/sqlalchemy/orm/persistence.py”,第835行,在_emit_insert_语句中
执行(语句,参数)
文件“/Users/dh/Documents/GitHub/web-tata/web-tata/flask/lib/python2.7/site-packages/sqlalchemy/engine/base.py”,执行中的第945行
返回方法(自身、多线程、参数)
文件“/Users/dh/Documents/GitHub/web-tata/web-tata/flask/lib/python2.7/site-packages/sqlalchemy/sql/elements.py”,第263行,在连接上执行
返回连接。_execute_clauseelement(self、multiparams、params)
文件“/Users/dh/Documents/GitHub/web-tata/web-tata/flask/lib/python2.7/site-packages/sqlalchemy/engine/base.py”,第1053行,在“执行”子句元素中
编译的sql,提取的参数
文件“/Users/dh/Documents/GitHub/web-tata/web-tata/flask/lib/python2.7/site-packages/sqlalchemy/engine/base.py”,第1189行,在执行上下文中
(上下文)
文件“/Users/dh/Documents/GitHub/web-tata/web-tata/flask/lib/python2.7/site-packages/sqlalchemy/engine/base.py”,第1402行,在_handle_dbapi_exception中
exc_信息
文件“/Users/dh/Documents/GitHub/web-tata/web-tata/flask/lib/python2.7/site-packages/sqlalchemy/util/compat.py”,第203行,源于
重新释放(类型(异常),异常,tb=exc\U tb,原因=原因)
文件“/Users/dh/Documents/GitHub/web-tata/web-tata/flask/lib/python2.7/site-packages/sqlalchemy/engine/base.py”,第1182行,在执行上下文中
(上下文)
文件“/Users/dh/Documents/GitHub/web-tata/web-tata/flask/lib/python2.7/site-packages/sqlalchemy/engine/default.py”,第470行,在do_-execute中
cursor.execute(语句、参数)
文件“/Users/dh/Documents/GitHub/web-tata/web-tata/flask/lib/python2.7/site-packages/MySQLdb/cursors.py”,执行中的第205行
errorhandler(self、exc、value)
文件“/Users/dh/Documents/GitHub/web-tata/web-tata/flask/lib/python2.7/site-packages/MySQLdb/connections.py”,第36行,在defaulterrorhandler中
提高errorclass,errorvalue
IntegrityError:(_mysql_exceptions.IntegrityError)(1062,“重复条目”test@user44457.com'对于密钥'ix_users_email'”[SQL:u'插入到用户中(电子邮件、用户名、确认、密码、otp_secr
et,成员自,最后一次看到,角色id)值(%s,%s,%s,%s,%s,%s)][参数:('test@user44457.com'testuser75',1',pbkdf2:sha256:50000$zkYlgQKg$06b586db3c86c2bc5e3511b5710d9119ae65996
16D4785CD25D35E022B4152FEA',WWGOWIJWJ7S4ZN3I',datetime.datetime(2017,4,10,16,42,50,115277),datetime.datetime(2017,4,10,16,42,50,115294),3L)]
在您的setUp()
方法中,如果在删除/创建句子之后立即查询所有用户,会发生什么情况?那应该是空的。而且,它将被使用
class CredentialsTestCase(unittest.TestCase):
def setUp(self):
self.app = create_app("testing")
self.app_context = self.app.app_context()
self.app_context.push()
db.drop_all()
db.create_all()
Role.insert_roles()
self.client = self.app.test_client(use_cookies=True)
def tearDown(self):
db.session.remove()
db.drop_all()
self.app_context.pop()
def test_auth(self):
r = Role.query.filter_by(name="User").first()
u = User(email="testemail@test.com", username="testuser", role=r)
db.session.add(u)
db.session.commit()
TESTING=True
WTF_CSRF_ENABLED=False
PRESERVE_CONTEXT_ON_EXCEPTION=False
SQLALCHEMY_DATABASE_URI='random-name-for-db.sqlite'