Python接口自动化浅析logging封装及实战操作
作者:软件测试自动化测试 发布时间:2022-12-04 12:21:44
在上一篇Python接口自动化测试系列文章:Python接口自动化浅析logging日志原理及模块操作流程,主要介绍日志相关概念及logging日志模块的操作流程。
而在此之前介绍过yaml封装,数据驱动、配置文件、日志文件等独立的功能,我们将这些串联起来,形成一个完整的接口测试流程。
以下主要介绍将logging常用配置放入yaml配置文件、logging日志封装及结合登录用例讲解日志如何在接口测试中运用。
一、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()
控制台日志输出部分截图:
日志文件输出部分截图:
来源:https://blog.csdn.net/ZangKang1/article/details/119765827


猜你喜欢
- 这学期在学python,感觉想写一个东西来巩固自己的基础,因为大二的时候我看过python,所以还是一共花了几个小时写了一个基于mysql的
- 环境win10, python3.7,pyinstaller3.6一 下载pyinstaller(1)cmd中pip install pyi
- jieba库是一款优秀的 Python 第三方中文分词库,jieba 支持三种分词模式:精确模式、全模式和搜索引擎模式,下面是三种模式的特点
- 系列文章目录第一章 Python常见库matplotlib之画图文字的中文显示第二章 Python常见库matplotlib之画图中各个模块
- 前段时间做一个小项目碰到了一个导航制作的方式然后突然想到曾经很久以前看到的梯形状的不规则导航,就尝试做了一下。结果碰到了几个问题,后来在同事
- 一:threading VS Thread众所周知,python是支持多线程的,而且是native的线程,其中threading是对Thre
- 前言平静之下,蓦然回首,base64 却在灯火阑珊处。今天翻开旧项目发现挺多图片相关的插件都是用 base64 来显示图片的。谈到 base
- 插件下载:blueideasearch.xpi首先第一步 说一下怎么样查看firefox插件的源码, 就我上边写的那个东西,把它下载下来.将
- 把文件夹dir1中后缀为'.jpg'的文件拷贝到文件夹dir2中:import globimport shutilimpor
- 本文实例讲述了MySQL 多表关联一对多查询实现取最新一条数据的方法。分享给大家供大家参考,具体如下:MySQL 多表关联一对多查询取最新的
- 以下几种方法来模拟enum:(感觉方法一简单实用)# way1class Directions: up
- python主要是通过thread和threading这两个模块来实现多线程支持。python的thread模块是比較底层的模块,pytho
- 引言在前面的文章当中我们讨论的是 python3 当中早期的内嵌数据结构字典的实现,在本篇文章当中主要介绍在后续对于字典的内存优化。字典优化
- 首先看看如何快速查看剩余火车票?当你想查询一下火车票信息的时候,你还在上12306官网吗?或是打开你手机里的APP?下面让我们来用Pytho
- 我们平时需要使用 Python 发送各类邮件,这个需求怎么来实现?答案其实很简单,smtplib 和 email 库可以帮忙实现这个需求。s
- 本文实例讲述了Python基于回溯法子集树模板解决选排问题。分享给大家供大家参考,具体如下:问题从n个元素中挑选m个元素进行排列,每个元素最
- 以前在网上看到的最简单的拖动对象的代码,忘记作者叫什么了。原始代码在IE下有些小问题,并且声明了文档类型为xhtml 1.0后,在FF等非I
- 使用Python 分析Nginx access 日志,根据Nginx日志格式进行分割并存入MySQL数据库。一、Nginx access日志
- 在使用django-rest-framework开发项目的时候我们总是避免不了跨域的问题,因为现在大多数的项目都是前后端分离,前后端项目部署
- 今天对clubot进行了升级, 但是导入数据后中文乱码, 一开是找资料说是在创建引擎的时候添加编码信息:engine = create_en