在 Pytest 装置中使用时,Python 日志记录不会记录

如何解决在 Pytest 装置中使用时,Python 日志记录不会记录

我有一个 Pytest + Selenium 项目,我想使用日志记录模块。

但是,当我像这样设置登录conftest.py

@pytest.fixture(params=["chrome"],scope="class")
def init_driver(request):
    start = datetime.Now()
    logging.basicConfig(filename='.\\test.log',level=logging.INFO)
    if request.param == "chrome":
        options = ChromeOptions()
        options.add_argument("--start-maximized")
        web_driver = webdriver.Chrome(ChromeDriverManager().install(),options=options)
    if request.param == "firefox":
        web_driver = webdriver.Firefox(GeckoDriverManager().install())
    request.cls.driver = web_driver
    yield
    end = datetime.Now()
    logging.info(f"{end}: --- DURATION: {end - start}")
    web_driver.close()

看起来根本没有创建 test.log 并且没有错误消息或其他指示出现问题。

我怎样才能做到这一点?

解决方法

首先有两个事实:

  1. logging.basicConfig() 仅在调用之前没有进行日志记录配置时才有效(目标记录器没有注册处理程序)。

  2. pytest 将自定义处理程序注册到根记录器,以便能够捕获代码中发出的日志记录,因此您可以测试您的程序日志记录行为是否正确。

这意味着在夹具中调用 logging.basicConfig(filename='.\\test.log',level=logging.INFO) 将什么也不做,因为测试运行已经开始并且根记录器具有由 pytest 附加的处理程序。因此,您有两个选择:

  1. 完全禁用内置的 logging 插件。这将停止日志记录捕获 - 如果您在测试中分析发出的日志(例如使用 caplog 固定装置),这些将停止工作。调用:

    $ pytest -p no:logging ...
    

    您可以将标志保留在 pyproject.toml 中,以便自动应用:

    [tool.pytest.ini_options]
    addopts = "-p no:logging"
    

    或在 pytest.ini 中:

    [pytest]
    addopts = -p no:logging
    
  2. 配置和使用 live loggingpyproject.toml 中的配置,相当于您的 logging.basicConfig() 调用:

    [tool.pytest.ini_options]
    log_file = "test.log"
    log_file_level = "INFO"
    

    pytest.ini中:

    [pytest]
    log_file = test.log
    log_file_level = INFO
    

    当然,在这种情况下,可以从 logging.basicConfig() 固定装置中删除 init_driver 行。

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

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?