四、封装日志功能

要想记录请i去和返回的信息,只需要在之前创建的http_client.py模块做修改就行。那么先封装一个日志工具。

在项目下创建包名为utilslogs目录,紧接着utils包下创建logger.py

# utils/logger.py

import os
import time
import logging
import json as _json

root_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# 建立一个filehandler来把日志记录在文件里,级别为debug以上
fh = logging.FileHandler("{}/logs/{}.log".format(root_path, time.strftime('%Y%m%d', time.localtime())))
fh.setLevel(logging.DEBUG)
# 建立一个streamhandler来把日志打在CMD窗口上,级别为error以上
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# 设置日志格式
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
ch.setFormatter(formatter)
fh.setFormatter(formatter)
# 将相应的handler添加在logger对象中
logger.addHandler(ch)
logger.addHandler(fh)

接着修改http_client.py

import json as _json
import requests
from utils.logger import api_logger


class HttpClient():
    # 接口做post一般都是采用json格式进行提交
    __headers = {
        "content-type": "application/json;charset=UTF-8"
    }

    def __init__(self):
        self.__session = requests.session()

    def get(self, path, **kwargs):
        return self.__request(path, 'GET', **kwargs)

    def post(self, path, data=None, json=None, **kwargs):
        return self.__request(path, 'POST', data, json, **kwargs)

    def __request(self, url, method, data=None, json=None, **kwargs):
        headers = kwargs.get("headers")
        params = kwargs.get("params")
        # 如果传入header不为空,那么更新header
        if headers:
            self.__headers.update(headers)
        self.__request_log(url, method, data, json, params, self.__headers)
        resp = None
        if method == "GET":
            resp = self.__session.get(url, **kwargs)
        elif method == "POST":
            resp = requests.post(url, data, json, **kwargs)
        self.__response_log(resp)
        return resp

    def __request_log(self, url, method, data=None, json=None, params=None, headers=None):
        api_logger.info("接口请求地址: {}".format(url))
        api_logger.info("接口请求方式: {}".format(method))
        api_logger.info("接口请求头: {}".format(_json.dumps(headers, indent=4, ensure_ascii=False)))
        api_logger.info("接口请求 params 参数: {}".format(_json.dumps(params, indent=4, ensure_ascii=False)))
        api_logger.info("接口请求体 data 参数 : {}".format(_json.dumps(data, indent=4, ensure_ascii=False)))
        api_logger.info("接口请求体 json 参数: {}".format(_json.dumps(json, indent=4, ensure_ascii=False)))

    def __response_log(self, resp):
        try:
            api_logger.info("返回信息 : {}".format(resp.text, ensure_ascii=False))
        except Exception as e:
            api_logger.error('系统错误:{}'.format(e))

我们再次执行测试,查看logs文件下的日志

至此,日志封装功能完成。

实际工作中的自动化场景复杂程度远远不止如此。

  • 公共方法可能在多个场景被使用,那么就需要在抽离出一个业务层
  • 接口入参也需要单独抽离,方便统一维护
  • 用例层抽离,方便统一管理

下一章节会封装业务层,数据层,测试用例层。

posted @ 2021-12-08 16:29  测试充电宝  阅读(106)  评论(0编辑  收藏  举报