【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模板网!

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

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

相关文章

  • Python Selenium3 自动化测试实战:构建高效测试项目

    💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】 🤟 基于Web端打造的:👉轻量化工具创作平台 💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 在当今软件开发领域,自动化测试成为确保软件质量和提高开发效率的关键步骤。本文将深入探讨如何使

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024年02月10日
    浏览(38)
  • 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日
    浏览(51)
  • python自动化爬虫实战

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

    2024年02月03日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包