Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 烧瓶app单元测试期间抛出的InvalidRequestError_Python_Unit Testing_Flask_Flask Sqlalchemy_Python Unittest - Fatal编程技术网

Python 烧瓶app单元测试期间抛出的InvalidRequestError

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并在数据库中具有相同的唯一条目时,就会发生

我已经构建了一个大型Flask应用程序,并且已经连续运行了几年的单元测试。最近,我开始看到抛出以下错误:

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)
如果有其他相关代码,我可以通过编辑添加

编辑 添加了完整的回溯。同样值得注意的是,测试数据库是sqlite,而生产数据库是MySQL


错误:测试验证协议(测试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'