Python自动化测试之自定义日志及其封装

2023-03-21 17:11:00 浏览数 (1)

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

0 人点赞