Sqlite 当py.test静默挂起时该怎么办?
在使用时,我有一些测试可以在SQLite中正常运行,但在切换到Postgresql时会自动挂起。我将如何调试类似的东西?是否有一个“详细”模式,我可以运行我的测试,或设置一个断点?更一般地说,当pytest静默暂停时,标准的攻击计划是什么?我尝试使用,并使用$py.test运行了测试--timeout=300,但测试仍然挂起,屏幕上没有任何活动由于不知道代码中出现了什么问题,最好的方法是隔离失败的测试并在其中设置断点以查看。注意:我使用pudb而不是pdb,因为如果您不使用IDE,它确实是调试python的最佳方法 例如,您可以在测试文件中执行以下操作:Sqlite 当py.test静默挂起时该怎么办?,sqlite,postgresql,timeout,freeze,pytest,Sqlite,Postgresql,Timeout,Freeze,Pytest,在使用时,我有一些测试可以在SQLite中正常运行,但在切换到Postgresql时会自动挂起。我将如何调试类似的东西?是否有一个“详细”模式,我可以运行我的测试,或设置一个断点?更一般地说,当pytest静默暂停时,标准的攻击计划是什么?我尝试使用,并使用$py.test运行了测试--timeout=300,但测试仍然挂起,屏幕上没有任何活动由于不知道代码中出现了什么问题,最好的方法是隔离失败的测试并在其中设置断点以查看。注意:我使用pudb而不是pdb,因为如果您不使用IDE,它确实是调试p
import pudb
...
def test_create_product(session):
pudb.set_trace()
# Create the Product instance
# Create a Price instance
# Add the Product instance to the session.
...
然后运行它
py.test -s --capture=no test_my_stuff.py
现在,您将能够准确地看到脚本锁定的位置,并在执行的这个特定时刻检查堆栈和数据库。否则就像大海捞针 在测试使用SQLAlchemy的Flask应用程序时,我遇到了pytest和Postgresql的类似问题。pytest似乎很难在Postgresql中使用其request.addfinalizer方法运行拆卸 以前我有:
@pytest.fixture
def db(app, request):
def teardown():
_db.drop_all()
_db.app = app
_db.create_all()
request.addfinalizer(teardown)
return _db
(_db是我从extensions.py导入的SQLAlchemy的一个实例)
但如果每次调用数据库设备时都删除数据库:
@pytest.fixture
def db(app, request):
_db.app = app
_db.drop_all()
_db.create_all()
return _db
那么pytest在第一次测试后就不会挂起了。我在Flask和SQLAlchemy中遇到了同样的SQLite/Postgres问题,类似于Gordon。然而,我的解决方案不同。Postgres对表锁和连接要求严格,因此在拆卸时显式关闭会话连接解决了我的问题 我的工作代码:
@pytest.yield_fixture(scope='function')
def db(app):
# app is an instance of a flask app, _db a SQLAlchemy DB
_db.app = app
with app.app_context():
_db.create_all()
yield _db
# Explicitly close DB connection
_db.session.close()
_db.drop_all()
参考资料:回答“如何调试类似的东西?”
strace-p
连接到进程。查看它可能被卡在哪个系统调用或系统调用循环中。e、 g.一直在呼叫gettimeofdaypip安装pytest sugar
并使用pytest.py--verbose运行测试代码>
在我的例子中,Flask应用程序没有检查
if\uuuu name\uuuu='\uuu main\uuuu':
,因此它执行了app.start()
,而这不是我的意图
您可以阅读更多详细信息。我遇到这个问题已经有一段时间了(尽管我没有使用SQLite)。测试套件在本地运行良好,但在CircleCI(Docker)中失败 我的问题最终是:
\uuu del\uuu
通常会结束线程\uu del\uu
- 通过
pytest调用--超时5
- 版本:
pytest==6.2.2,pytest超时==1.4.2
pytest-m trace--trace
或pytest--verbose
也没有产生任何有用的信息conftest.py
代码和测试代码\uuu del\uuu
我会寻找某种超时功能--我不知道py.test是否内置了这样的功能…我很高兴你提出了这个问题,因为我忘了提到我安装了pytest超时模块,并将其设置为6秒后超时,但是测试仍然无限期地挂起。您尝试过
线程
和信号
超时方法吗?它们挂在一起吗?您是否能够隔离挂起在PostgreSQL下但不挂起SQLite的特定测试?正如Jesse建议的那样,您是否尝试过pytest timeout的thread
timeout方法?如果这没有帮助,那么我的下一步就是使用strace
进行调查。可能还值得附加gdb,在现代Linuxes上,您可以从gdb内部以及C堆栈中看到python堆栈。不,我实际上没有尝试这些技术,听起来这是找到问题的正确方法。我会告诉你事情的进展。谢谢。我对烧瓶、pytest&factory boy也有同样的问题。上面的解决方案解决了这个问题。SQLAlchemy参考的最新位置现在在这里:这个解决方案仍然有效吗?我仍然没有让我的测试运行。我现在基本上到处都添加了db.close()
。我还从sqlalchemy.orm.session import中找到了,它关闭了所有会话
,这也没有解决问题。