Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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
Sqlite 当py.test静默挂起时该怎么办?_Sqlite_Postgresql_Timeout_Freeze_Pytest - Fatal编程技术网

Sqlite 当py.test静默挂起时该怎么办?

Sqlite 当py.test静默挂起时该怎么办?,sqlite,postgresql,timeout,freeze,pytest,Sqlite,Postgresql,Timeout,Freeze,Pytest,在使用时,我有一些测试可以在SQLite中正常运行,但在切换到Postgresql时会自动挂起。我将如何调试类似的东西?是否有一个“详细”模式,我可以运行我的测试,或设置一个断点?更一般地说,当pytest静默暂停时,标准的攻击计划是什么?我尝试使用,并使用$py.test运行了测试--timeout=300,但测试仍然挂起,屏幕上没有任何活动由于不知道代码中出现了什么问题,最好的方法是隔离失败的测试并在其中设置断点以查看。注意:我使用pudb而不是pdb,因为如果您不使用IDE,它确实是调试p

在使用时,我有一些测试可以在SQLite中正常运行,但在切换到Postgresql时会自动挂起。我将如何调试类似的东西?是否有一个“详细”模式,我可以运行我的测试,或设置一个断点?更一般地说,当pytest静默暂停时,标准的攻击计划是什么?我尝试使用,并使用$py.test运行了测试--timeout=300,但测试仍然挂起,屏幕上没有任何活动

由于不知道代码中出现了什么问题,最好的方法是隔离失败的测试并在其中设置断点以查看。注意:我使用pudb而不是pdb,因为如果您不使用IDE,它确实是调试python的最佳方法

例如,您可以在测试文件中执行以下操作:

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()
参考资料:

回答“如何调试类似的东西?”

  • 使用py.test-m trace——trace运行,以获取python调用的跟踪。

  • 一个选项(对任何卡住的unix二进制文件都有用)是使用
    strace-p
    连接到进程。查看它可能被卡在哪个系统调用或系统调用循环中。e、 g.一直在呼叫gettimeofday

  • 要获得更详细的py.test输出,请安装pytest sugar
    pip安装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
    代码和测试代码
  • 缓慢取消注释/重新注释区域并确定根本原因
  • 最终解决方案:使用factory fixture添加终结器以调用
    \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中找到了
    ,它关闭了所有会话
    ,这也没有解决问题。