日志的左右主要有以下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)