一、日志接口的封装
在common目录下新建一个logger.py的文件
import logging.handlers
## 单例模式的思想:通过逻辑控制,只生成一个对象
import os
class GetLogger:
'''
当已经创建了logger对象的时候,那么之后就不在创建了,也就是只创建一次对象
'''
# 把logger对象的初始值设置为None
logger = None
# 创建logger,并且返回这个logger
@classmethod
def get_logger(cls):
if cls.logger is None:
########创建日志器,控制他的创建次数
cls.logger = logging.getLogger('communityApiAutoTest') # 这里的值是自定义的
# 设置总的级别,debug/info/warning/error
cls.logger.setLevel(logging.DEBUG) #设置debug级别,意味着高于debug的都会被收集
# 2获取格式器
# 2.1 要给格式器设置要输出的样式
fmt = "%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d] - %(message)s"
# 2.2创建格式器,并且给他设置样式
fm = logging.Formatter(fmt)
# 获取项目路径
project_path = os.path.dirname(os.path.abspath(__file__)).replace("common","")
# 3.创建处理器 按照时间进行切割文件
tf = logging.handlers.TimedRotatingFileHandler(filename=project_path +f'/logs/requests.log', # 原日志文件
when='H', # 间隔多长时间把日志存放到新的文件中
interval=1,
backupCount=3, # 除了原日志文件,还有3个备份
encoding='utf-8'
)
logging.basicConfig(level=logging.DEBUG,format=fmt) #这是在控制台上打印日志信息
# 在处理器中添加格式器
tf.setFormatter(fm)
# 在日志器中添加处理器
cls.logger.addHandler(tf)
# return cls.logger
return cls.logger
if __name__ == '__main__':
# 单例模式
logger = GetLogger.get_logger()
print(id(logger))
logger1 = GetLogger.get_logger()
print(id(logger1))
logger.debug('调试') # 相当print小括号中的信息
logger.info('信息')
logger.warning('警告')
name = '测试'
logger.error('这个变量是{}'.format(name))
logger.critical('致命的')
二、封装request的类,打印请求的相应日志
修改requests_client.py,具体的思路是,变量kwargs,即可获取相应的header\body\url\post等;
import requests
from common.encry_decry import md5
from common.logger import GetLogger
class RequestsClient:
# 使用类属性来定一个session,他将作为所有接口发起的全局对象
session = requests.session()
# 初始化数据,如果参数没传的情况下将参数置为None
def __init__(self):
self.session = RequestsClient.session
self.method = None
self.url = None
self.data = None
self.headers = None
self.files = None
self.json = None
self.params = None
self.resp = None
self.logger = GetLogger.get_logger()
# 封装requests请求
def sendRequest(self, **kwargs):
# 如果调用方,没有传任何的参数,那么就使用该对象的默认属性参数
if 'url' not in kwargs.keys():
kwargs['url'] = self.url
if 'method' not in kwargs.keys():
kwargs['method'] = self.method
if 'headers' not in kwargs.keys():
kwargs['headers'] = self.headers
if 'data' not in kwargs.keys():
kwargs['data'] = self.data
if 'json' not in kwargs.keys():
kwargs['json'] = self.json
if 'files' not in kwargs.keys():
kwargs['files'] = self.files
if 'params' not in kwargs.keys():
kwargs['params'] = self.params
# 等价于
# self.resp = self.session.request(**kwargs)
# self.resp = self.session.request(url=kwargs['url'],method=kwargs['method'],headers=kwargs['headers'],data=kwargs['data'],json=kwargs['json'],params=kwargs['params'],files=kwargs['files'])
# 将接口发起前的信息记录到日志中
for key, value in kwargs.items():
self.logger.info(f'接口的{key}是:{value}')
try:
self.resp = self.session.request(**kwargs)
self.logger.info(f'接口响应状态码是:{self.resp.status_code}')
self.logger.info(f'接口相应信息是:{self.resp.text}')
except BaseException as e:
self.logger.exception('接口请求报错!')
raise BaseException(f'接口报错信息:{e}')
return self.resp
if __name__ == '__main__':
json = {
"userName": "admin",
"password": md5("123456")
}
request = RequestsClient()
resp = request.sendRequest(method='post', url='http://localhost:8888/community/flogin', json=json)
print(resp.json())