• pytest多线程运行日志显示错误


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 JonyWater 2024-04-18 23:08 采纳率: 0% 浏览 4 首页/ 编程语言 / pytest多线程运行日志显示错误 python自动化 pytest框架xdist多线程运行,控制台日志信息无法打印,乱码 pytest框架运行用例,单线程时一切正常,控制台正常输出日志信息,但是开启多线程xdist后,日志信息只能显示一个线程,而通过main()运行,日志信息会乱码。 开启多线程 单独运行用例如下图。看到,只有一个线程[gw1]输出了日志信息。 main()运行结果如下图。可以看到控制台日志信息乱码,但是日志文件显示正常。 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    5条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-18 23:08
      关注

      引自免费微信小程序:皆我百晓生

      在处理多线程环境下的日志输出问题时,首先要确认的是日志记录器是否正确配置,确保它能在多线程环境中正常工作,并且不会因为线程同步问题导致日志交错或丢失。在Python中,可以使用logging模块的QueueHandlerThreadSafeFilter来解决这个问题。

      首先,你需要创建一个支持多线程的日志处理器,然后将其添加到你的日志配置中。以下是修改后的日志配置示例:

      import logging
      from queue import Queue
      from logging.handlers import QueueHandler
      
      def setup_logger(name, log_file=None, level=logging.INFO):
          formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
          
          # 创建一个队列
          q = Queue(-1)
          
          # 创建一个处理程序,将日志条目放入队列
          handler = QueueHandler(q)
      
          # 创建一个线程安全的过滤器,确保在多线程环境下正确过滤日志
          thread_safe_filter = logging.Filter()
          handler.addFilter(thread_safe_filter)
      
          # 设置日志级别
          logger = logging.getLogger(name)
          logger.setLevel(level)
      
          # 添加处理程序
          logger.addHandler(handler)
      
          if log_file:
              file_handler = logging.FileHandler(log_file)
              file_handler.setFormatter(formatter)
              logger.addHandler(file_handler)
      
          def process_logs(queue):
              while True:
                  record = queue.get()
                  if record is None:
                      break
                  logger.handle(record)
      
          # 启动一个新的线程来处理队列中的日志
          worker = threading.Thread(target=process_logs, args=(q,))
          worker.setDaemon(True)
          worker.start()
      
          return logger
      
      # 使用方式
      logger = setup_logger('my_logger', 'log_file.log')
      

      接下来,在你的测试代码中,使用这个设置好的日志记录器:

      import pytest
      import logging
      
      logger = logging.getLogger('my_logger')
      
      class TestLogin:
          def test_mall_login(self):
              logger.info("【开始测试】用例-->【账号密码正确】")
              # ... 测试逻辑 ...
              logger.info("响应码断言通过")
              logger.info("响应信息断言通过")
              logger.info("---用例【账号密码正确】测试完成---")
      
      # ... 其他测试类和函数 ...
      
      if __name__ == "__main__":
          import sys
          from _pytest.config import cmdline
      
          # 获取命令行参数
          options, plugins = cmdline.parse(args=sys.argv[1:])
          pytest.main(options=options, plugins=plugins)
      

      这样应该能保证在多线程模式下,日志信息不会丢失或乱序,同时保持控制台和日志文件的输出正常。如果你仍然遇到乱码问题,请检查你的终端编码是否与日志文件的编码一致,确保它们都是UTF-8或者其他兼容的字符集。如果还是有问题,可能需要进一步排查其他潜在的编码问题。

      展开全部

      评论 编辑记录
    • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-18 23:08
      关注

      晚上好🌙🌙🌙
      本答案参考ChatGPT-3.5

      出现日志信息无法打印或者乱码的问题,可能是由于多线程运行导致的日志输出混乱。

      解决该问题的方法如下:

      1. 使用pytest的--capture=no选项禁用捕获日志模式。这将确保日志信息能够正常地打印在控制台上,而不会被捕获并混乱显示。在运行pytest命令时,加上--capture=no选项即可。示例命令:pytest --capture=no

      2. 设置pytest的日志级别为DEBUG级别。在你的conftest.py文件中添加如下代码:

        import logging
        
        def pytest_configure(config):
            logging.getLogger().setLevel(logging.DEBUG)
        

        这样可以确保所有的日志信息都会被打印出来,避免信息丢失。

      3. 使用pytest-stdout插件来改善日志输出。安装pytest-stdout插件:pip install pytest-stdout,然后在你的conftest.py文件中添加如下代码:

        def pytest_configure(config):
            config.pluginmanager.get_plugin('capturemanager').suspendcapture()
        

        这将禁用pytest的默认捕获日志模式,并改用pytest-stdout插件来正常输出日志信息。

      综上所述,使用上述的解决方案可以解决pytest多线程运行日志显示错误的问题。

      评论
    • 专家-百锦再 全栈领域优质创作者 2024-04-19 00:06
      关注

      # 无法提供具体代码示例, 但可以对问题进行解释和讲解 
      pytest框架中,xdist插件可以用于实现多线程运行测试用例,从而提高测试效率。然而,在多线程运行时,可能会出现控制台日志信息无法打印或乱码的情况。
      这种问题通常是由于多个线程同时向控制台输出日志导致的,控制台的输出会变得混乱。在单线程时,控制台可以逐行输出日志信息,但在多线程中会出现竞争条件,导致日志输出混乱或只显示一个线程的日志信息。
      解决这个问题的一种方法是使用线程锁(threading.Lock)来控制日志输出的同步,确保每个线程按顺序输出日志信息。另外,也可以考虑使用日志记录器(logging.Logger)来统一管理和输出日志,避免混乱。
      关于日志乱码的问题,可能是由于字符编码不一致导致的。可以尝试设置控制台的字符编码为UTF-8,并确保所有输出的日志信息都是以相同的字符编码格式进行处理,以避免乱码问题的出现。
      总的来说,要解决pytest框架在多线程运行时控制台日志输出的问题,需要注意线程间的同步和日志输出的管理,以确保日志信息能够清晰展示且不会出现乱码情况。

      有问题你别着急,评论留言都可以,看到马上就回复,尽量及时补充齐
      评论
    • GISer Liu 2024-04-19 00:13
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      针对你描述的问题,可以采取以下步骤解决:

      1. 确认字符编码问题
      • 控制台日志信息乱码可能是由于字符编码问题导致的。确保在控制台中正确地输出字符编码,可以尝试设置控制台字符编码为UTF-8。
      1. 调整日志配置
      • 可以尝试调整日志配置,使用Unicode字符集来确保日志信息能够正确地在控制台输出。你可以在日志配置中指定字符集为UTF-8。
      1. 查看xdist文档
      • 查看pytest-xdist文档,确认是否有相关配置项可以解决多线程下日志乱码的问题。有时候框架提供了特定的配置选项来处理多线程下的日志输出。
      1. 排除xdist影响
      • 确保问题是由于pytest-xdist多线程功能引起的。你可以尝试在不使用xdist的情况下运行,观察日志输出是否正常。如果正常,则说明问题与xdist相关。
      1. 调整日志级别
      • 考虑将日志级别调整为更高级别,以确保更多信息被输出到控制台。有时候日志级别设置得太低会导致部分信息被过滤掉而不输出到控制台。
      1. 更新pytest和xdist版本
      • 确保你正在使用的pytest和xdist版本是最新的,有时候已知的问题会在后续版本中修复。
      1. 尝试其他日志模块
      • 如果以上方法都无法解决问题,可以考虑使用其他的日志模块替换原有的日志功能,例如logging模块。
      1. 修改日志输出格式
      • 有时候日志输出格式可能会影响到字符编码和显示效果,你可以尝试修改日志输出格式,看是否能够解决问题。
        综上所述,你可以先尝试以上方法来解决你的问题。如果问题仍然存在,欢迎提供更多信息以便我们深入分析和解决。

      如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

      评论
    • CSDN-Ada助手 CSDN-AI 官方账号 2024-04-20 03:47
      关注

      【相关推荐】




      如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    【【萌新的SOC学习之小水文系列】】
    你的librosa和scikit-learn打架了吗?
    SpringMVC之国际化&上传&下载
    【OpenCV实现鼠标绘图,轨迹栏做调色板,图像的基本操作】
    朋友圈里都是中顶会的大神,是一种什么样的体验?
    AVR单片机-ATMEGA64-UART1串口中断方式
    2022 CSP-J1 CSP-S1 初赛 第1轮 真题讲评 真题解析
    Call for Papers丨第三届GLB@KDD‘23 Workshop
    解决VUE报错GET http://127.0.0.1:5500/favicon.ico 404 (Not Found)
    Vue3.X笔记总结
  • 原文地址:https://ask.csdn.net/questions/8090977