九、pytest接口自动化教程--日志模块logging

一、日志模块logging配置

1、框架增加log模块

  • 优点:

(1) 记录程序运行信息
(2) 方便定位问题

  • python日志模块logging

(1) debug
(2) info
(3) warnning
(4)error

import logging
import os
import time

'''输出日志的文件位置,log文件'''
# root_path daimafengzhuang文件夹
root_path = (os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
# log文件的位置
log_path = os.path.join(root_path, 'log')


class Logger:
    # 下面所有的都是在初始化
    def __init__(self):
        # 定义日志位置和文件名,time.strftime("%Y%m%d")时间的格式化,每次在log文件下新增一个以时间为文件名的文件
        self.logname = os.path.join(log_path, '{}.log'.format(time.strftime("%Y-%m-%d")))
        # 定义一个日志容器
        self.logger = logging.getLogger('log')
        # 设置日志打印的级别
        self.logger.setLevel(logging.DEBUG)
        # 创建日志输入的格式
        # [%(asctime)s]时间,[%(filename)s %(lineno)d]文件名和代码行数,[%(levelname)s]:%(message)日志级别和日志信息
        self.formater = logging.Formatter(
            '[%(asctime)s][%(filename)s %(lineno)d][%(levelname)s]:%(message)s')
        # 创建日志处理器,用来存放日志文件
        self.filelogger = logging.FileHandler(self.logname, mode='a', encoding='UTF-8')
        # 创建日志处理器,在控制台打印
        self.console = logging.StreamHandler()
        # 设置控制台打印日志界别
        self.console.setLevel(logging.DEBUG)
        # 文件存放日志级别
        self.filelogger.setLevel(logging.DEBUG)
        # 文件存放日志格式
        self.filelogger.setFormatter(self.formater)
        # 控制台打印日志格式
        self.console.setFormatter(self.formater)
        # 将日志输出渠道添加到日志收集器中
        self.logger.addHandler(self.filelogger)
        self.logger.addHandler(self.console)


logger = Logger().logger
if __name__ == '__main__':
    logger.debug("我打印debug日志")
    logger.info("我打印info日志")
    logger.warning("我打印warning日志")
    logger.error("我打印error日志")
# 输出
[2023-11-27 23:17:57,552][log_util.py 43][DEBUG]:我打印debug日志
[2023-11-27 23:17:57,552][log_util.py 44][INFO]:我打印info日志
[2023-11-27 23:17:57,552][log_util.py 45][WARNING]:我打印warning日志
[2023-11-27 23:17:57,552][log_util.py 46][ERROR]:我打印error日志
'''
@Author     : 测试工程师Selina
@FileName   : case_optimize.py
@Description:
'''
from api.api import test_getDoctorDept_query
from utils.read import base_data
from utils.log_util import logger

def test_getDoctorDept():
    logger.info('开始执行test_getDoctorDept方法')
    param = base_data.read_data()['Keys']
    result = test_getDoctorDept_query(param)
    print(result)
    logger.info('用例执行完毕')
# 输出
[2023-11-27 23:27:15,171][case_optimize.py 6][INFO]:开始执行test_getDoctorDept方法
[2023-11-27 23:27:15,222][case_optimize.py 10][INFO]:用例执行完毕

二、接口请求补全

# @Author     : 测试工程师Selina
# @FileName   : data.yaml
# @Description:
keys:
  # workerId, hospitalCode
  - [ 10397,1 ]
Keys:
  workerId: 10397
  hospitalCode: 1
# @Author     : 测试工程师Selina
# @FileName   : settings.ini
# @Description:
[host]
api_sit_url = http://端口号:IP
'''
@Author     : 测试工程师Selina
@FileName   : read.py
@Description:
'''
import yaml
import configparser
import os

data_path = os.path.join((os.path.dirname(os.path.dirname(os.path.realpath(__file__)))), 'data', 'data.yaml')
ini_path = os.path.join((os.path.dirname(os.path.dirname(os.path.realpath(__file__)))), 'config', 'settings.ini')


class FileRead:
    def __init__(self):
        self.data_path = data_path
        self.ini_path = ini_path

    def read_data(self):
        f = open(self.data_path, encoding='utf-8')
        data = yaml.safe_load(f)
        return data

    def read_ini(self):
        config = configparser.ConfigParser()
        config.read(self.ini_path, encoding='utf8')
        return config


base_data = FileRead()
'''
@Author     : 测试工程师Selina
@FileName   : log_util.py
@Description:
'''
import logging
import os
import time

'''输出日志的文件位置,log文件'''
# root_path daimafengzhuang文件夹
root_path = (os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
# log文件的位置
log_path = os.path.join(root_path, 'log')


class Logger:
    # 下面所有的都是在初始化
    def __init__(self):
        # 定义日志位置和文件名,time.strftime("%Y%m%d")时间的格式化,每次在log文件下新增一个以时间为文件名的文件
        self.logname = os.path.join(log_path, '{}.log'.format(time.strftime("%Y-%m-%d")))
        # 定义一个日志容器
        self.logger = logging.getLogger('log')
        # 设置日志打印的级别
        self.logger.setLevel(logging.DEBUG)
        # 创建日志输入的格式
        # [%(asctime)s]时间,[%(filename)s %(lineno)d]文件名和代码行数,[%(levelname)s]:%(message)日志级别和日志信息
        self.formater = logging.Formatter(
            '[%(asctime)s][%(filename)s %(lineno)d][%(levelname)s]:%(message)s')
        # 创建日志处理器,用来存放日志文件
        self.filelogger = logging.FileHandler(self.logname, mode='a', encoding='UTF-8')
        # 创建日志处理器,在控制台打印
        self.console = logging.StreamHandler()
        # 设置控制台打印日志界别
        self.console.setLevel(logging.DEBUG)
        # 文件存放日志级别
        self.filelogger.setLevel(logging.DEBUG)
        # 文件存放日志格式
        self.filelogger.setFormatter(self.formater)
        # 控制台打印日志格式
        self.console.setFormatter(self.formater)
        # 将日志输出渠道添加到日志收集器中
        self.logger.addHandler(self.filelogger)
        self.logger.addHandler(self.console)


logger = Logger().logger
if __name__ == '__main__':
    logger.debug("我打印debug日志")
    logger.info("我打印info日志")
    logger.warning("我打印warning日志")
    logger.error("我打印error日志")
'''
@Author     : 测试工程师Selina
@FileName   : case_optimize.py
@Description:
'''
from api.api import test_getDoctorDept_query
from utils.read import base_data


def test_getDoctorDept():
    param = base_data.read_data()['Keys']
    result = test_getDoctorDept_query(param)
    print(result)
'''
@Author     : 测试工程师Selina
@FileName   : api.py
@Description:
'''
from core.api_util import api_util

'''定义一个函数test_getDoctorDept_query,传入参数 param(case_optimize.test_getDoctorDept方法中的param)'''


def test_getDoctorDept_query(params):
    response = api_util.post_DoctorDept_belong(params=params)
    return response.json()
'''
@Author     : 测试工程师Selina
@FileName   : api_util.py
@Description:
'''
from core.rest_client import RestClient

'''api.py   test_getDoctorDept_query的params传入该函数'''


class Api(RestClient):
    def __init__(self):
        super().__init__()

    def post_DoctorDept_belong(self, **kwargs):
        '''调用rest_client中的post函数'''
        return self.post('/outPatient/reception/getDoctorDept', **kwargs)


api_util = Api()
'''
@Author     : 测试工程师Selina
@FileName   : rest_client.py
@Description:
'''
import json

import requests

from utils.log_util import logger
from utils.read import base_data

api_root_url = base_data.read_ini()['host']['api_sit_url']

'''定义一个函数post(),传入参数url(api_util.py中的接口路径),params(api.py中的params)'''


class RestClient:
    def __init__(self):
        self.api_root_url = api_root_url

    def get(self, url, **kwargs):
        return self.request(url, "GET", **kwargs)

    def post(self, url, **kwargs):
        # return requests.post(self.api_root_url + url, **kwargs)
        return self.request(url, "POST", **kwargs)

    def put(self, url, **kwargs):
        return self.request(url, "PUT", **kwargs)

    def delete(self, url, **kwargs):
        return self.request(url, "DELETE", **kwargs)

    def request(self, url, method, **kwargs):
        self.request_log(url, method, **kwargs)
        if method == "GET":
            return requests.get(self.api_root_url + url, **kwargs)
        if method == "POST":
            return requests.post(self.api_root_url + url, **kwargs)
        if method == "PUT":
            return requests.put(self.api_root_url + url, **kwargs)
        if method == "DELETE":
            return requests.delete(self.api_root_url + url, **kwargs)

    def request_log(self, url, method, **kwargs):
        data = dict(**kwargs).get("data")
        json_data = dict(**kwargs).get("json")
        params = dict(**kwargs).get("params")
        headers = dict(**kwargs).get("headers")

        logger.info("接口请求的地址>>>{}".format(self.api_root_url + url))
        logger.info("接口请求的方法>>>{}".format(method))
        # json.dumps()调整json格式
        if data is not None:
            logger.info("接口请求的data参数>>>{}".format(json.dumps(data, indent=2)))
        if json_data is not None:
            logger.info("接口请求的json参数>>>\n{}".format(json.dumps(json_data, indent=2)))
        if params is not None:
            logger.info("接口请求的params参数>>>\n{}".format(json.dumps(params, indent=2)))
        if headers is not None:
            logger.info("接口请求的params参数>>>\n{}".format(json.dumps(headers, indent=2)))
'''
@Author     : 测试工程师Selina
@FileName   : conftest.py
@Description:
'''
import pytest

from utils.log_util import logger


@pytest.fixture(scope="function", autouse=True)
def func():
    logger.info("开始执行测试用例")
    yield
    logger.info("测试用例执行完毕")

你可能感兴趣的:(pytest,自动化,运维)