【python自动化实战-引入trace】在项目中引入trace跟踪每条testcase执行过程中的日志+日志推送es

这篇具有很好参考价值的文章主要介绍了【python自动化实战-引入trace】在项目中引入trace跟踪每条testcase执行过程中的日志+日志推送es。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

最近公司在跑自动化case过程中有很多异常case,有的很难依据现有的日志定位问题(日志多且乱,无关联性),时常需要本地debug才能发现问题,很影响写自动化的效率以及自动化运行的通过率。

因此领导下发了一个需求:需要给每一条case绑定一个trace,通过trace关联case执行过程中的日志信息。这样通过查看日志即可快速知道case运行的问题点。经过一番思考与实践,就有了下面的方案。

分析

trace的引入:

  1. 在自定义的log_tool中添加trace_id的生成与写入
  2. 使用pytest的钩子函数给每条case添加不同的trace_id
  3. trace_id 采用uuid 来生成
  4. 日志推送es(或者写入本地日志文件中)

实现

  • log_tool.py(自定义封装的日志工具)

    # log_tool.py 中
    import logging
    import os
    import time
    import uuid
    from functools import wraps
    from loguru import logger
    
    class MyLog:
        my_logger = logger
        """
        使用loguru封装日志类
        """
        path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        # 判断当前时间的目录在日志目录结构中是否存在,存在就不创建,不存在就创建
        dir_time = time.strftime("%Y-%m-%d", time.localtime(time.time()))
        log_file = os.path.join(os.path.join(os.path.join(path, "Log"), "log"), '{}.log'.format(dir_time))
    
        # 设置loguru写入日志方式
        log_handler = my_logger.add(log_file, level="INFO",
                                    format="{time:YYYY-MM-DD HH:mm:ss.SSS} {level} {line} {message}", encoding="utf-8",
                                    retention="30 days", backtrace=True)
    
        trace_id = []  # 定义trace_id,支持多级嵌套
    
        @classmethod
        def _log(cls, lev: str, log_msg):
            if cls.trace_id:
                log_msg = "[" + '|'.join([str(i) for i in MyLog.trace_id]) + "]" + str(log_msg)
            cls.my_logger.opt(lazy=True).log(lev.upper(), log_msg)
    
        @classmethod
        def debug(cls, log_msg):
            cls._log('debug', log_msg)
    
        @classmethod
        def info(cls, log_msg):
            cls._log('info', log_msg)
    
        @classmethod
        def warning(cls, log_msg):
            cls._log('warning', log_msg)
    
        @classmethod
        def error(cls, log_msg):
            cls._log('error', log_msg)
    
        @classmethod
        def critical(cls, log_msg):
            cls._log('critical', log_msg)
    
        @classmethod
        def traceback(cls):
            import traceback
            cls._log('error', f'执行失败!!!失败信息:\n {traceback.format_exc()}')
    
        def __del__(self):
            try:
                self.my_logger.remove(self.log_handler)
                del self.my_logger
            except:
                pass
    
  • conftest.py(利用钩子函数给每条case添加trace_id)

    # conftest.py 中
    import uuid
    from utils.log_tool import MyLog # 自定义的日志类
    from pytest import Item
    	
    def pytest_runtest_setup(item: Item):
        """case运行前执行"""
        MyLog.trace_id.append("case_" + str(uuid.uuid4().hex[:10]))
    
    def pytest_runtest_teardown(item: Item):
        """case运行后执行"""
        MyLog.trace_id.pop()
    

    效果:
    python trace模块,python自动化,python,自动化,开发语言

  • conftest.py(利用fixture给指定的case添加trace_id;优点是可以指定某些case添加,缺点是需要侵入代码)

    # conftest.py中定义
    import uuid
    import pytest
    from utils.log_tool import MyLog
    
    @pytest.fixture(scope="function")
    def log_trace():
        MyLog.trace_id.append(uuid.uuid4())
        yield MyLog.trace_id
        MyLog.trace_id.pop()
    
    # testcase中使用
    def test_interface(self, log_trace):
        assert 1==2
    

拓展

除了testcase中使用trace_id外,还可以利用装饰器给一些长链路的场景单独设置trace

# 装饰器的实现方式
# log_tool.py 中
# 定义装饰器方法,可以使用在测试用例方法上
def log_trace(prefix=""):  # 可自定义添加前缀,默认前缀为空
    def wrapper_log(func):
        @wraps(func)  # wraps使inner装的更像一个func
        def inner(*args, **kwargs):
            try:
                MyLog.trace_id.append(str(prefix)+str(uuid.uuid4().hex[:10]))
                return func(*args, **kwargs)
            except Exception as e:
                MyLog.error(f'用例执行失败,失败原因:{e}')
                MyLog.traceback()
                raise e
            finally:
                MyLog.trace_id.pop()

        return inner
    return wrapper_log
 
# testcase中也可以使用
@log_trace("interface1_")
def test_interface1():
    with allure.step("步骤1"):
        MyLog.error(234444)
        assert 223 == 223
        MyLog.info("测试日志1112232323232322")
        assert "123" == 123

日志推送es的代码改造 (本地未进行验证,待检查)

# log_tool.py
from cmreslogging.handlers import CMRESHandler  # 安装elasticsearch==7.13.4和CMRESHandler==1.0.0

# 对_log方法进行改造
class MyLog:
    my_logger = logger
	...
	
    @classmethod
    def _log(cls, lev: str, log_msg):
        if cls.trace_id:
            log_msg = "[" + '|'.join([str(i) for i in MyLog.trace_id]) + "]" + str(log_msg)
        try:
            # 优先推送es,es推送失败则写入文件
            es_handler = CMRESHandler(hosts=[{"host": "127.0.0.1", "port": 9200}],
                                      auth_type=CMRESHandler.AuthType.NO_AUTH,
                                      es_index_name="autotest",
                                      es_doc_type=None,
                                      raise_on_indexing_exceptions=True)
            es_sink = cls.my_logger.add(es_handler, level="INFO",
                                        format="{message}")
        except:
            cls.my_logger.remove()
            file_sink = cls.my_logger.add(cls.log_file, level="INFO",
                                          format="{time:YYYY-MM-DD HH:mm:ss.SSS} {level} {line} {message}",
                                          encoding="utf-8",
                                          retention="30 days", backtrace=True)
        finally:
            cls.my_logger.opt(lazy=True).log(lev.upper(), log_msg)

loguru相关文档:
使用实战
loguru官方文档

日志推送es: https://blog.csdn.net/qq_40157234/article/details/125331142文章来源地址https://www.toymoban.com/news/detail-759028.html

到了这里,关于【python自动化实战-引入trace】在项目中引入trace跟踪每条testcase执行过程中的日志+日志推送es的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • selenium+python web自动化测试框架项目实战实例教程

    自动化测试对程序的回归测试更方便。 由于回归测试的动作和用例是完全设计好的,测试期望的结果也是完全可以预料的,将回归测试自动运行... 可以运行更加繁琐的测试 自动化测试的一个明显好处就是可以在很短的时间内运行更多的测试。学习自动化测试最终目的是应用到

    2024年02月06日
    浏览(56)
  • 【Python】WebUI自动化—Selenium的下载和安装、基本用法、项目实战(16)

    Selenium 是一个用于测试 Web 应用程序 的自动化测试工具,它直接运行在 浏览器 中,实现了对浏览器的自动化操作,它支持所有主流的浏览器,包括 IE,Firefox,Safari,Chrome 等。 -支持所有主流平台(如, Windows、Linux、IOS、Android、Edge、Opera 等) 实现了诸多 自动化功能 ,比如

    2024年02月08日
    浏览(45)
  • Python+Requests+Pytest+Excel+Allure 接口自动化测试项目实战【框架之间的对比】

            --------UnitTest框架和PyTest框架的简单认识对比与项目实战-------- 定义: Unittest是Python标准库中自带的单元测试框架,Unittest有时候也被称为PyUnit,就像JUnit是Java语言的标准单元测试框架一样,Unittest则是Python语言的标准单元测试框架。 Pytest是Python的另一个第三方单元测

    2024年02月09日
    浏览(56)
  • 【Web项目实战】从零开始学习Web自动化测试:用Python和Selenium实现网站登录功能

    B站首推!2023最详细自动化测试合集,小白皆可掌握,让测试变得简单、快捷、可靠 https://www.bilibili.com/video/BV1ua4y1V7Db 目录 1.环境搭建

    2024年02月06日
    浏览(67)
  • 【自动化项目实战】博客系统

    目录 1.博客自动化测试用例 2.准备工作  3.将手工测试用例转化为自动化测试用例 3.1 初始化动作 3.2 登录 3.3 博客列表博客数量 3.4 查看全文 3.5 写博客发表博客 3.6 删除 3.7 注销 4.总代码 🌈这节文章我们讲解一个实战项目——博客系统。首先我们需要 熟悉项目、针对核心流程

    2024年02月07日
    浏览(56)
  • 自动化项目实战 [个人博客系统]

    效验第一篇博客 不是 “自动化测试” 退出到登录页面,用户名密码为空

    2024年02月08日
    浏览(51)
  • 博客系统自动化测试项目实战(测试系列9)

    目录 前言: 1.博客前端页面测试用例图 2.测试用例的代码实现 2.1登录页面的测试 2.2博客列表页面的测试 2.3写博客测试 2.4博客详情页面的测试 2.5已发布博客的标题和时间的测试 2.6注销用户的测试 结束语: 之前小编给大家讲解了有关于Selenium和Junit5自动化测试的一些基础知

    2024年02月10日
    浏览(35)
  • 爬虫 + 自动化利器---selenium详解以及实战项目

    什么是selenium Selenium是一个用于Web应用程序测试的工具。 只要在测试用例中把预期的用户行为与结果都描述出来,我们就得到了一个可以自动化运行的功能测试套件。 Selenium测试套件直接运行在浏览器中,就像真正的用户在操作浏览器一样。 Selenium也是一款同样使用Apache Li

    2024年02月09日
    浏览(43)
  • po+selenium+unittest自动化测试项目实战

    1、新建一个包名:common(用于存放基本函数封装) (1)在common包下新建一个base.py文件,作用:页面操作封装。base.py文件代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64

    2024年01月17日
    浏览(47)
  • python自动化爬虫实战

    偶然的一次机会再次用到爬虫,借此机会记录一下爬虫的学习经历,方便后续复用。 需求:爬取网站数据并存入的csv文件中,总体分为两步 爬取网站数据 存到到csv文件中 1、配置爬虫环境 1.1、下载自动化测试驱动 由于需要实现模拟手动点击浏览器的效果,因此笔者使用到了

    2024年02月03日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包