从0到1完成appium+pytest+allure框架-加入log
断言已经完成了,那么接下来我们就需要加入日志了
断言可以记录结果,判断case运行的成功或者失败,那么日志的作用就是记录每一步的操作,可以更清晰的看到是在哪一步产生的错误,更有利于我们在出现问题的时候定位问题。
而且有了这个日志之后,是会加到后面的测试报告中的。
日志我们就需要好好的了解一下logging这块儿了
logger:提供日志接口,供应用代码使用。logger最长用的操作有两类:配置和发送日志消息。可以通过logging.getLogger(name)获取logger对象,如果不指定name则返回root对象,多次使用相同的name调用getLogger方法返回同一个logger对象。
handler:将日志记录(log record)发送到合适的目的地(destination),比如文件,socket等。一个logger对象可以通过addHandler方法添加0到多个handler,每个handler又可以定义不同日志级别,以实现日志分级过滤显示。
filter:提供一种优雅的方式决定一个日志记录是否发送到handler。
formatter:指定日志记录输出的具体格式。formatter的构造方法需要两个参数:消息的格式字符串和日期字符串,这两个参数都是可选的。与log4j类似,logger,handler和日志消息的调用可以有具体的日志级别(Level),只有在日志消息的级别大于logger和handler的级别。
害,这是我百度的,具体啥意思我也不知道,给你们看看代码吧,我现在也只是自己边学边写的
# 获取日志
import logging
class Demo_Log:
def __init__(self):
# 创建日志器
self.logger = logging.getLogger(__name__)
# 设置日志级别
self.logger.setLevel(logging.INFO)
# 创建控制台处理器,代码运行时能够在控制台输出日志
t = logging.StreamHandler()
# 创建文本处理器,代码运行时将日志写入自己设置的文件,如果没有该文件会创建该文件
f = logging.FileHandler('../Log/log.txt', encoding='utf-8')
# 创建格式器,设置输出的日志的格式
format = logging.Formatter(
'%(asctime)s %(filename)s %(module)s %(funcName)s %(lineno)d %(levelname)s %(message)s')
t.setFormatter(format)
f.setFormatter(format)
self.logger.addHandler(t)
self.logger.addHandler(f)
# 清空日志内容
with open('../Log/log.txt', 'w') as file:
file.truncate()
def get_log(self):
这是固定格式,划重点,除了设置日志级别,变量,文件,写法是固定的。
DEBUG 详细信息,只有诊断问题时才需要,就是一般的调试信息
代码我都有备注就不一一解释了,这里挑几个点说一下
1、日志级别
INFO 当程序运行时期望的一些信息
WARNING 软件运行正常,但是可能会有一些预期之外的事件发生
ERROR 由于一些严重问题导致软件一些功能出现问题
CRITICAL 很严重的错误直接导致软件不能继续运行
默认的级别时WARNING,意味默认的级别下,显示的日志信息必须时>=WARNING的级别才会进行处理,这里我们通常都是使用的info,debug一般只有在报错的时候才会使用,就比如你不确定那里是不是正常的,可以试着try一下,把日志级别设置成debug
2、格式器的常用参数
%(acstime)s 时间
%(filename)s 日志文件名
%(funcName)s 调用日志的函数名
%(levelname)s 日志的级别
%(module)s 调用日志的模块名
%(message)s 日志信息
%(name)s logger的name,不写的话默认是root
还有一些其他的,用到的话可以参考官方文档
3、清空日志
上面写的清空日志的两行代码,固定的,文件路径和文件名可以改,但是写法不能改,file.truncate()的作用是,每次开始记录日志的时候,清空上一次的日志信息。
日志模块了解完之后,就是在代码中加入我们的日志
import yaml
from practice.Find_Element.Login_Element import UserLoginElement
from practice.Log.Demo_log import DemoLog
from selenium.webdriver.common.by import By
class Login(UserLoginElement):
# 登录
def get_login(self):
with open('../desired_caps.yaml', 'r', encoding='utf-8') as f:
dl = yaml.load(f, Loader=yaml.FullLoader)
mobile = dl['mobile']
password = dl['password']
log = TanBaoLog().get_log()
log.info('定位**元素,点击同意')
self.get_service_agreement().click()
log.info('定位**元素,点击同意')
self.get_personal_center().click()
log.info('定位手机号输入框,输入手机号')
self.get_input_mobile().send_keys(mobile)
log.info('定位密码输入框,输入密码')
self.get_input_password().send_keys(password)
log.info('定位**元素,点击同意')
self.get_privacy_agreement().click()
log.info('定位登录按钮,点击登录')
self.get_login_value().click()
el = self.driver.find_element(By.ID, '')
assert '**' in el.text, '未登录'
这里要注意,需要输出日志就一定要引用我们已经写好的获取日志的方法,获取日志器之后,在你需要输出日志的操作的上一行写入log.info(''),这样就会输出你所想要的日志了
运行一下看看结果
控制台日志
写入文件的日志
![](https://img2020.cnblogs.com/blog/1006196/202201/1006196-20220110010601186-1188381003.png)
——————————————就算路是弯的,那也得走过才知道。因为你没有选择,这个社会,不前进,就灭亡。