请访问智造喵免费GPT地址:https://chat.plexpt.com/i/511440
Python自动化测试之自定义日志及其封装
日志的左右主要有以下4点 1 调试程序 2 了解系统程序运行的情况是否正常 3 系统程序运行故障分析和问题定位 4 用来做用户行为分析和数据统计
日志相关概念 1 日志收集器 2 日志级别 debug info warning error critical 3 输出渠道(Handel) 控制台输出: StreamHandle 将日志信息保存在文件中:FileHandle 4 日志格式 日志时间-日志名称-日志级别名称-文件名称-日志信息 # 设置日志输出格式 fmt = "%(asctime)s %(name)s %(levelname)s %(filename)s-%(lineno)d:%(message)s" formatter = logging.Formatter(fmt) 在python-logging模块中,默认的是root日志收集器,默认的输出级别为:WARNING
自定义日志的操作流程 1 导入logging模块:import logging 2 创建日志收集器:logger = logging.getLogger(“日志收集器的name”) 3 设置日志收集器的日志级别:logger.setLevel(logging.INFO) #设置收集器的级别为INFO 4 给日志收集器创建输出渠道(根据第一部分的内容知:日志输出渠道包含控制台输出和文件输出):下面以控制台输出为例进行介绍,文件输出与之类似 4.1 创建日志的输出渠道:handle1 = logging.StreamHandle() 4.2 可以单独设置日志输出渠道的级别:handle1.setLevel(logging.ERROR) 此步骤可选 【特殊说明】 4.3 在未设置日志输出渠道的日志级别时,默认使用日志收集器设置的Level 4.4 若需单独设置日志输出渠道的日志级别,则它的日志级别需高于日志收集器级别,否则设置无效。 设置日志输出的内容格式 5 设置日志输出的内容格式 # 设置日志的输出格式 fmt = "%(asctime)s %(name)s %(levelname)s %(filename)s-%(lineno)d:%(message)s" formatter = logging.Formatter(fmt) 6 将设置的日志格式绑定到创建的输出渠道中,即将日志格式与输出渠道关联起来 handler1.setFormatter(formatter) 7 将设置好的输出渠道,添加到日志收集器 logger.addHandler(handle1) 补充将日志信息输出到文件的操作流程与之类似,只是在step4上有一点区别而已 handel2 = logging.FileHandler(filename="xxx.log",encoding="utf-8") 日志代码参考如下: import logging
# 1、创建日志收集器 logger = logging.getLogger(name="login_test")
# 2、设置日志收集器的级别:警告级别 logger.setLevel(logging.WARN)
# 3、设置日志的输出渠道 # 3.1 控制台日志输出 handler1 = logging.StreamHandler() # 3.2 文件日志输出 handler2 = logging.FileHandler(filename="my_log.log",encoding="utf-8") # 单独设置输出渠道的日志级别 handler1.setLevel(logging.ERROR) # 可选
# 4、设置日志的输出格式 fmt = "%(asctime)s %(name)s %(levelname)s %(filename)s-%(lineno)d:%(message)s" formatter = logging.Formatter(fmt)
# 5、关联3和4 handler1.setFormatter(formatter) handler2.setFormatter(formatter)
# 6、关联1和5 logger.addHandler(handler1) logger.addHandler(handler2)
# 测试 logger.warning("登录失败警告") logger.error("登录debug出错")
********************************************************************************************** 自定义日志的封装 由于自定义日志的操作流程相对比较固定,因此我们可以将自定义的日志封装成一个类,当我们需要使用时,只需引入该模块即可 1 通过查看源码知,封装的类需要继承logging.Logger类,这样就可以继承父类的debug()、info()等函数; 2 从第二部分的操作流程知,不同的用户在引入该模块时,可能会设置不同日志名称、日志级别以及日志文件信息,因此这些参数可以让用户在实例化日志对象对象时进行初始化设置; 3 当我们需要使用自定义的日志类时,引入这一模块即可。 import logging
# 对日志的操作进行封装 class MyLogger(logging.Logger):
def __init__(self,name,level,file=None): super().__init__(name,level) # 设置日志的输出渠道 handler1 = logging.StreamHandler() # 设置日志的输出格式 fmt = "%(asctime)s %(name)s %(levelname)s %(filename)s-%(lineno)d:%(message)s" formatter = logging.Formatter(fmt) handler1.setFormatter(formatter) # 添加日志的输出渠道 self.addHandler(handler1)
if file: handler2 = logging.FileHandler(filename=file,encoding="utf-8") handler2.setFormatter(formatter) self.addHandler(handler2) pass pass pass ***********************************************************************************
Python自动化测试之excel数据驱动 使用python对excel进行操作之前,需要了解excel的组成 工作薄workbook 工作表sheet 单元格cell 所以对excel的操作,实际上就是对excel中workbook、sheet、cell的操作
操作流程 1 使用excel提前将测试用例准备好 2 导入操作excel需要使用的模板 openpyxl 3 工作薄的加载 wb = load_workbook("excel的存放路径") 4 获取存放测试用例的表单 sh=wb["表单名称"] 5 获取表单中所有的数据,并使用列表保存-按行获取
rows = list(sh.rows) 说明:使用sh.rows获取的每一行是一个元组,元组中的成员是cell
6 遍历行:获取每一行中所有数据,此时我们需要区分一下表头数据和非表头数据 * 使用字典存放每一行的测试用例 * 遍历的表头行数据,可以用作dict中的key * 遍历的非表头行数据,可以用作dict中的value * 对于非表头行,每一行就是一个测试用例数据 * 将存放每一行测试用例的dict,添加到存放所有测试用例的列表中
***************************************************** # 读取excel中的测试用例,并使用列表进行保存,使用zip将表头信息与行中的信息已字典的形式关联 # 使用zip import os from openpyxl import load_workbook
file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),"login_case.xlsx")
datas_case = [] #用于保存测试用例
wb = load_workbook(file_path) # 获取工作簿workBook sh = wb["login"] # 获取工作表 rows = list(sh.rows) # 获取工作表中所有行,行中的元素以元组的形式进行存放
titles = [] # 用户存放表头信息 for key in rows[0]: # 遍历表头 titles.append(key.value) pass
# 遍历非表头行 for row in rows[1:]: values = [] # 用于存放行中元素 for cel in row: # 遍历行中的单元格 values.append(cel.value) pass res = dict(zip(titles,values)) # 将行中的元素与表头信息组合,形成测试用例 res["expected"] = eval(res["expected"]) # 将字符串转换成字典 datas_case.append(res) # 将测试用例存放在列表中 pass print(datas_case)
#使用原生方式 import os from openpyxl import load_workbook
file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),"login_case.xlsx")
datas_case = [] #用于保存测试用例
wb = load_workbook(file_path) # 获取工作簿workBook sh = wb["login"] # 获取工作表 rows = list(sh.rows) # 获取工作表中所有行,行中的元素以元组的形式进行存放
titles = [] # 用户存放表头信息 for key in rows[0]: # 遍历表头 titles.append(key.value) pass
# 遍历非表头行 for row in rows[1:]: row_dict = {} # 将行中的信息用字典保存 for item in range(len(row)): row_dict[titles[item]] = row[item].value pass row_dict["expected"] = eval(row_dict["expected"]) # 将字符串转换成字典 datas_case.append(row_dict) # 将测试用例存放在列表中 pass
print(datas_case)