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

pytest-xdist 日志打印问题

                                            pytest-xdist 日志打印问题

           问题描述:

           pytest-xidst: 进程级的并发运行pytest插件,-n  指定cpu数量, --loadfile 参数来控制顺序 ,认是无序。

           在利用pytest-xidst实现case并发执行,与框架中的日志处理logging模块不兼容,遇到一些日志打印问题。 logging模块内日志轮转的handlers是多线程安全,不支持多进程。所以需要改动日志框架支持多进程。

           简要说明下logging模块常用的handlers:

  • StreamHandler: 将日志信息输出到sys.stdout, sys.stderr 或者类文件对象,日志信息会输出到指定的stream中,如果stream为空则输出到sys.stderr。
def __init__(self, filename, mode='a', encoding=None, delay=False):
  • FileHandler:继承自StreamHandler。将日志信息输出到磁盘文件上。

           

          解决方案:修改源码加锁保证进程安全。我这里选取现有ConcurrentLogHandler模块进行处理,在logging模块上进行的扩展。需要提前安装pip3 install ConcurrentLogHandler

formatter = logging.Formatter('%(asctime)s - %(levelname)-5s - %(message)s')
logger = logging.getLogger("Testlog")
logger.setLevel(logging.INFO)
log_path = 'xx.log'     # 日志文件路径
if not logger.handlers:   # 判断是否有handlers,有直接记录日志, 不需要创建多个句柄,否则会有日志重复打印问题
    # ConcurrentRotatingFileHandler
    rotateHandler = ConcurrentRotatingFileHandler(log_path, "a", 512*1024, 5)
    rotateHandler.setLevel(logging.INFO)
    rotateHandler.setFormatter(formatter)
    logger.addHandler(rotateHandler)
    # StreamHandler
    stream_handler = logging.StreamHandler(sys.stderr)
    stream_handler.setLevel(logging.INFO)
    stream_handler.setFormatter(formatter)
    logger.addHandler(stream_handler)
logger.info(msg)

        执行pytest -n 3 -m "mark" --alluredir=./allure-results : 就可以正常执行打印日志。

 

参考文档:

https://blog.csdn.net/qq_41864652/article/details/81317908

https://pypi.org/project/pytest-xdist/

 

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

相关推荐