一、日志模块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("测试用例执行完毕")