如何解决带有日志记录和单击的 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 举报,一经查实,本站将立刻删除。