python 测试运行期间的多个pytest会话

deikduxw  于 2023-02-18  发布在  Python
关注(0)|答案(1)|浏览(133)

我正在使用pytestpytest-xdist编写测试,我希望在所有工作线程开始运行之前运行pytest_sessionstart,并在所有工作线程运行完毕之后运行pytest_sessionfinish
我找到了这个解决方案:链接,但未按预期工作。在测试运行期间启动和完成了多个会话。因此执行了多次清理,这导致测试失败(它清理了tmp目录,测试失败,FileNotFoundError)。
我添加了在会话开始和结束时写入文件的代码。日志如下所示:

init    0x00007f988f5ee120 
worker init gw0 
...
worker init gw7 
init    0x00007f229cdac2e0 
cleanup 0x00007f229cdac2e0 0
init    0x00007f1a31a4e2e0 
cleanup 0x00007f1a31a4e2e0 0
worker done gw0 
...
worker done gw4 
cleanup 0x00007f988f5ee120 1

如您所见,有些会话在所有工作进程启动之后和完成之前启动。
我的代码如下所示:

def pytest_sessionstart(session: pytest.Session):
    if hasattr(session.config, 'workerinput'):
        # log to file 'worker init {id}'
        return
    # log to file 'init {sess id}'
    # do some stuff

def pytest_sessionfinish(session: pytest.Session, exitstatus: int):
    if hasattr(session.config, 'workerinput'):
        # log to file 'worker done {id}'
        return
    # log to file 'cleanup {sess id} {exitstatus}'
    # do some stuff
y53ybaqx

y53ybaqx1#

原来vs-code使用--collect-only参数在后台启动pytest。这些会话没有被过滤,因为它们不是工作会话,它们执行了init/cleanup。
解决方案是增加检查参数--collect-only是否存在。
代码:

def pytest_sessionfinish(session: pytest.Session, exitstatus: int):
    if hasattr(session.config, 'workerinput'):
        return
    if '--collect-only' in session.config.invocation_params.args:
        return
    # do some stuff

相关问题