Python+requests+pytest+allure封装接口自动化7-日志封装

一、日志接口的封装

在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())

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值