首页 > 编程语言 >Python接口自动化浅析logging封装及实战操作

Python接口自动化浅析logging封装及实战操作

时间:2023-12-21 12:03:30浏览次数:38  
标签:logger logging level Python self yaml 日志 浅析


一、yaml配置文件

将日志中的常用配置,比如日志器名称、日志器等级及格式化放在配置文件中,在配置文件config.yaml中添加:

logger:
name: ITester
level: DEBUG
format: '%(filename)s-%(lineno)d-%(asctime)s-%(levelname)s-%(message)s'

封装logging类,读取yaml中的日志配置。

二、读取yaml

之前读写yaml配置文件的类已经封装好,愉快的拿来用即可,读取yaml配置文件中的日志配置。

yaml_handler.py

import yaml
class YamlHandler:
def __init__(self, file):
self.file = file
def read_yaml(self, encoding='utf-8'):
"""读取yaml数据"""
with open(self.file, encoding=encoding) as f:
return yaml.load(f.read(), Loader=yaml.FullLoader)
def write_yaml(self, data, encoding='utf-8'):
"""向yaml文件写入数据"""
with open(self.file, encoding=encoding, mode='w') as f:
return yaml.dump(data, stream=f, allow_unicode=True)
yaml_data = YamlHandler('../config/config.yaml').read_yaml()

三、封装logging类

在common目录下新建文件logger_handler.py,用于存放封装的logging类。

封装思路:

  • 首先分析一下,logging中哪些数据可以作为参数?比如日志器名称、日志等级、日志文件路径、输出格式,可以将这些放到__init__方法里,作为参数。
  • 其次,要判断日志文件是否存在,存在就将日志输出到日志文件中。
  • 最后,logging模块已经封装好了Logger类,可以直接继承,减少代码量。

这里截取logging模块中Logger类的部分源码。

class Logger(Filterer):
"""
Instances of the Logger class represent a single logging channel. A
"logging channel" indicates an area of an application. Exactly how an
"area" is defined is up to the application developer. Since an
application can have any number of areas, logging channels are identified
by a unique string. Application areas can be nested (e.g. an area
of "input processing" might include sub-areas "read CSV files", "read
XLS files" and "read Gnumeric files"). To cater for this natural nesting,
channel names are organized into a namespace hierarchy where levels are
separated by periods, much like the Java or Python package namespace. So
in the instance given above, channel names might be "input" for the upper
level, and "input.csv", "input.xls" and "input.gnu" for the sub-levels.
There is no arbitrary limit to the depth of nesting.
"""
def __init__(self, name, level=NOTSET):
"""
Initialize the logger with a name and an optional level.
"""
Filterer.__init__(self)
self.name = name
self.level = _checkLevel(level)
self.parent = None
self.propagate = True
self.handlers = []
self.disabled = False
def setLevel(self, level):
"""
Set the logging level of this logger.  level must be an int or a str.
"""
self.level = _checkLevel(level)

接下来,我们开始封装logging类。

logger_handler.py

import logging
from common.yaml_handler import yaml_data
class LoggerHandler(logging.Logger):
# 继承Logger类
def __init__(self,
name='root',
level='DEBUG',
file=None,
format=None
):
# 设置收集器
super().__init__(name)
# 设置收集器级别
self.setLevel(level)
# 设置日志格式
fmt = logging.Formatter(format)
# 如果存在文件,就设置文件处理器,日志输出到文件
if file:
file_handler = logging.FileHandler(file,encoding='utf-8')
file_handler.setLevel(level)
file_handler.setFormatter(fmt)
self.addHandler(file_handler)
# 设置StreamHandler,输出日志到控制台
stream_handler = logging.StreamHandler()
stream_handler.setLevel(level)
stream_handler.setFormatter(fmt)
self.addHandler(stream_handler)
# 从yaml配置文件中读取logging相关配置
logger = LoggerHandler(name=yaml_data['logger']['name'],
level=yaml_data['logger']['level'],
file='../log/log.txt',
format=yaml_data['logger']['format'])

四、logging实战

在登录用例中运用日志模块,到底在登录代码的哪里使用日志?

  • 将读取的用例数据写入日志、用来检查当前的用例数据是否正确;
  • 将用例运行的结果写入日志,用来检查用例运行结果是否与预期一致;
  • 将断言失败的错误信息写入日志。

接下来直接上代码,在登录用例中添加日志。

test_login.py

import unittest
from common.requests_handler import RequestsHandler
from common.excel_handler import ExcelHandler
import ddt
import json
from common.logger_handler import logger
@ddt.ddt
class TestLogin(unittest.TestCase):
# 读取excel中的数据
excel = ExcelHandler('../data/cases.xlsx')
case_data = excel.read_excel('login')
print(case_data)
def setUp(self):
# 请求类实例化
self.req = RequestsHandler()
def tearDown(self):
# 关闭session管理器
self.req.close_session()
@ddt.data(*case_data)
def test_login_success(self,items):
logger.info('*'*88)
logger.info('当前是第{}条用例:{}'.format(items['case_id'],items['case_title']))
logger.info('当前用例的测试数据:{}'.format(items))
# 请求接口
res = self.req.visit(method=items['method'],url=items['url'],json=json.loads(items['payload']),
headers=json.loads(items['headers']))
try:
# 断言:预期结果与实际结果对比
self.assertEqual(res['code'], items['expected_result'])
logger.info(res)
result = 'Pass'
except AssertionError as e:
logger.error('用例执行失败:{}'.format(e))
result = 'Fail'
raise e
finally:
# 将响应的状态码,写到excel的第9列,即写入返回的状态码
TestLogin.excel.write_excel("../data/cases.xlsx", 'login', items['case_id'] + 1, 9, res['code'])
# 如果断言成功,则在第10行(测试结果)写入Pass,否则,写入Fail
TestLogin.excel.write_excel("../data/cases.xlsx", 'login', items['case_id'] + 1, 10, result)
if __name__ == '__main__':
unittest.main()

控制台日志输出部分截图:

Python接口自动化浅析logging封装及实战操作_软件测试

日志文件输出部分截图:

Python接口自动化浅析logging封装及实战操作_python_02

标签:logger,logging,level,Python,self,yaml,日志,浅析
From: https://blog.51cto.com/u_15333581/8920932

相关文章

  • Python接口自动化之文件上传/下载接口详解
    〇、前言文件上传/下载接口与普通接口类似,但是有细微的区别。如果需要发送文件到服务器,例如:上传文档、图片、视频等,就需要发送二进制数据,上传文件一般使用的都是Content-Type:multipart/form-data数据类型,可以发送文件,也可以发送相关的消息体数据。反之,文件下载就是将二进制格式......
  • python+excel接口自动化获取token并作为请求参数进行传参操作
    1、登录接口登录后返回对应token封装:importjsonimportrequestsfromutil.operation_jsonimportOperationJsonfrombase.runmethodimportRunMethodclassOperationHeader:def__init__(self,response):self.response=json.loads(response)defget_response_token(......
  • Python中Selenium模块的使用详解
    Selenium的介绍、配置和调用Selenium(浏览器自动化测试框架) 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7,8,9,10,11),Firefox,Safari,GoogleChrome,Opera等。这个工具的主要功能包括:测试浏览器的兼容性——......
  • ERROR: Could not build wheels for opencv-python, which is required to install py
    目录系统环境问题描述问题解决问题二参考文章系统环境#macOS系统版本$sw_versProductName:MacOSXProductVersion:10.14.4BuildVersion:18E2035#Python版本$python--versionPython3.9.13问题描述安装opencv-python报错,安装失败#安装opencv-python的命令......
  • python初识
    一、何为编程语言编程:用代码指挥计算机做事,编写一个特定的程序程序:根据据一堆指令,告诉计算机该做什么代码:写给计算机看的/处理的一条命令,写代码就是给计算机下命令语言:分自然语言和编程语言。自然语言,本质上是人与人之间的交流;编程语言,本质上是计算机跟人的交流。计算机和人都......
  • 【算法】python版A-Star(A星)寻路
    importpygameimportmathfromqueueimportPriorityQueue#初始化屏幕WIDTH=800WIN=pygame.display.set_mode((WIDTH,WIDTH))pygame.display.set_caption("A*PathFindingAlgorithm")#定义颜色RED=(255,0,0)GREEN=(0,255,0)BLUE=(0,255,0)......
  • Python异步编程之yield from
    yieldfrom简介yieldfrom是Python3.3后新加的语言结构,可用于简化yield表达式的使用。yieldfrom简单示例:>>>defgen():...yieldfromrange(10)...>>>g=gen()>>>next(g)0>>>next(g)1>>>yieldfrom用于获取生成器中的值,是对yield使用的一种......
  • NLog.Extensions.Logging 使用 (3)
    GitHub链接NLog.Extensions.Logging makesitpossibletouseNLogwith MicrosoftILogger abstractionanddependencyinjection.NLog.Extensions.Logging主要是为了把NLog通过依赖注入注册到容器中,使用者通过构造器注入获取ILogger<T>上一篇文章讲的NLog没有结合依赖注......
  • Logging简介(1)
    Logging:日志系统,用来记录软件系统,用于异常分析日志级别:Trace<Debug(调试)<Information(信息)<Warning(提醒、警告)<Error(错误)<Critical(关键、生死攸关),可根据实际情况对每一条日志使用不同的级别日志提供者(LoggingProvider):把日志输出到哪里:控制台、文件、数据库、邮箱、短信、微信等......
  • python基础(一)常用数据类型
    Python3中有六个标准的数据类型:Number(数字)、String(字符串)、List(列表)、Tuple(元组)、Set(集合)、Dictionary(字典)1.数字类型:3种数值类型:int/float/bool/complex2.String(字符串):使用英文双引号或英文单引号括起来。如果有多行内容,除了使用换行符之外,还可以使用"""MMMM"""来定义3.List(......