微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有日志记录和单击的 Pytest 仅在 Docker 中因 ValueError 失败

如何解决带有日志记录和单击的 Pytest 仅在 Docker 中因 ValueError 失败

我正在开发一个使用 Click 的库。它包含在 Docker 映像中。我正在尝试使用 click.testing.CliRunner 使用 pytest 对其进行测试。我正在使用 logging 写入日志,并且我已指定这些日志应在 pyproject.toml 中发出。当我的代码中出现异常时,并且仅在 Docker 中,我从 Click 中得到以下异常:

/opt/conda/lib/python3.8/site-packages/click/testing.py:434: ValueError
            except Exception as e:
                if not catch_exceptions:
                    raise
                exception = e
                exit_code = 1
                exc_info = sys.exc_info()
            finally:
                sys.stdout.flush()
>               stdout = outstreams[0].getvalue()
E               ValueError: I/O operation on closed file.

/opt/conda/lib/python3.8/site-packages/click/testing.py:434: ValueError

我已设法最低限度地重现此问题。我的代码看起来像这样:

import logging,click

logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)

@click.command()
@click.argument('value')
def main(value):
    logger.info(value)
    raise RuntimeError()

我的测试如下:

import pytest
from click.testing import CliRunner

from main import main

def test_main():
    runner = CliRunner()
    runner.invoke(main,['hello'],catch_exceptions=False)
    assert True

而我的 pyproject.toml 是:

[tool.pytest.ini_options]
log_cli = true
log_level = "INFO"

删除日志记录、CliRunner 或 pytest(即直接运行 test_main)不会触发 ValueError,并且 RuntimeError 是唯一引发的异常。在 Docker 容器之外运行它也不会引发 ValueError

我怎样才能避免这个错误

代码可在 a GitHub repo 上复制。我在 continuum/miniconda3 容器中重现了这个问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。