当前位置:   article > 正文

python-自动化Airtest-4 log封装调用_airtest脚本封装运行

airtest脚本封装运行

一: log 日志按层级分开输出到文件

1. 源码

文件:setting.py +call.py
setting.py

"""
封装log方法

"""

import os
import time
import logging.handlers

# 日志打印等级
LEVELS = {
    'debug': logging.DEBUG,
    'info': logging.INFO,
    'warning': logging.WARNING,
    'error': logging.ERROR,
    'critical': logging.CRITICAL
}
# 创建一个日志
logger = logging.getLogger()
level = 'default'
# 创建日志文件方法
def create_file(filename):
	path = filename[0:filename.rfind('/')]
	if not os.path.isdir(path):
		os.makedirs(path)
	if not os.path.isfile(filename):
		fd = open(filename, mode='w', encoding='utf-8')
		fd.close()
	else:
		pass
	# 给logger添加handler 添加内容到日志句柄中
def set_handler(levels):
	if levels in  ['error', 'critical']:
		logger.addHandler(MyLog.err_handler)
		logger.addHandler(MyLog.handler)
	else:
		logger.addHandler(MyLog.handler)
		logger.addHandler(MyLog.handler)

# 在记录日志之后移除句柄
def remove_handler(levels):
	if levels == 'error':
		logger.removeHandler(MyLog.err_handler)
		logger.removeHandler(MyLog.handler)

def get_current_time():
	return time.strftime(MyLog.date, time.localtime(time.time()))

class MyLog:
	path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
	log_file = path+'/Log/log.log'
	err_file = path+'/Log/err.log'
	# critical_file = path + '/Log/critical.log'
	logger.setLevel(LEVELS.get(level, logging.NOTSET))
	create_file(log_file)
	create_file(err_file)
	# create_file(critical_file)
	date = '%Y-%m-%d %H:%M:%S'
	# 创建一个handler,用于写入日志文件
	handler = logging.FileHandler(log_file, encoding='utf-8')
	err_handler = logging.FileHandler(err_file, encoding='utf-8')
	# critical_handler = logging.FileHandler(critical_file, encoding='utf-8')
	@staticmethod
	def debug(log_meg):
		set_handler('debug')
		# 文件中输出模式
		logger.debug("[DEBUG " + get_current_time() + "]" + log_meg)
		remove_handler('debug')
	@staticmethod
	def info(log_meg):
		set_handler('info')
		logger.info("[INFO " + get_current_time() + "]" + log_meg)
		remove_handler('info')
	@staticmethod
	def warning(log_meg):
		set_handler('warning')
		logger.warning("[WARNING " + get_current_time() + "]" + log_meg)
		remove_handler('warning')
	@staticmethod
	def error(log_meg):
		set_handler('error')
		logger.error("[ERROR " + get_current_time() + "]" + log_meg)
		remove_handler('error')
	@staticmethod
	def critical(log_meg):
		set_handler('critical')
		logger.error("[CRITICAL "+  get_current_time() + "]" + log_meg)
		remove_handler('critical')
	# 设置控制台输出格式
	formatter = logging.Formatter(
				'[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S')
	# 再创建一个handler,用于输出到控制台
	console = logging.StreamHandler()
	console.setFormatter(formatter)
	logger.addHandler(console)
	console.setLevel(logging.NOTSET)




  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100

作用:定义类MyLog; 把日志按5个层级区分分别定义,可自定义输出的文件格式 按控制台和保存日志形式存储与打印
调用
call.py
只需导入资源调用即可在测试中使用

from  settings import MyLog
MyLog.debug("This is debug message")
MyLog.info("This is info message")
MyLog.warning("This is warning message")
MyLog.error("This is error")
MyLog.critical("This is critical message")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2. 源码解析及优化

A. def level

分别定义各层级的输出格式,源码中输出格式一致,可自行改动

@staticmethod
	def debug(log_meg):
  • 1
  • 2

B. 日志

生成日志在指定文件夹内,其中error 级别上单独输出到error.log,其余调试日志打印在log文件

C. 优化点

1,对日志大小、保存时间没做处理,一般M级日志自动化这里基本够用
2,setting.py 文件内中日志路径,可做适配传参处理
3, 问题,这里对line打印都聚焦在 setting文件内,未能很好体现在脚本具体位置;

二:整体log封装

1. 源码

文件:setting.py +call.py
setting.py

import logging
import time
import os
log_path = os.path.join((os.path.dirname(os.path.dirname(os.path.realpath(__file__)))),'Log')
return_mark=os.path.exists(log_path)
if return_mark == False:#判断a路径是否存在,不存在则创建一个路径文件夹
	os.mkdir(log_path)
class MyLog:
	def __init__(self):
		# 初始化创建一个带时间戳的log文件
		self.logname = os.path.join(log_path, '{0}.log'.format(time.strftime('%Y-%m-%d')))
	def __printconsole(self, level, message):
		# 创建一个logger
		logger = logging.getLogger()
		logger.setLevel(logging.DEBUG)
		# 创建一个handler,用于写入日志文件
		fh = logging.FileHandler(self.logname,'a',encoding='utf-8')
		fh.setLevel(logging.DEBUG)
		# 再创建一个handler,用于输出到控制台
		ch = logging.StreamHandler()
		ch.setLevel(logging.DEBUG)
		# 定义handler的输出格式
		formatter = logging.Formatter('[%(asctime)s] [%(name)s] [%(filename)s]'
									  ' [%(funcName)s] [%(lineno)d] [%(thread)d] [%(levelname)s] '
									  ': %(message)s')
		fh.setFormatter(formatter)
		ch.setFormatter(formatter)
		# 给logger添加handler
		logger.addHandler(fh)
		logger.addHandler(ch)
		# 记录一条日志
		if level == 'info':
			logger.info(message)
		elif level == 'debug':
			logger.debug(message)
		elif level == 'warning':
			logger.warning(message)
		elif level == 'error':
			logger.error(message)
		elif level == 'critical':
			logger.critical(message)
		logger.removeHandler(ch)
		logger.removeHandler(fh)
		# 关闭打开的文件
		fh.close()

	def debug(self,message):
		self.__printconsole('debug', message)
	def info(self,message):
		self.__printconsole('info', message)
	def warning(self,message):
		self.__printconsole('warning', message)
	def error(self,message):
		self.__printconsole('error', message)
	def critical(self, message):
		self.__printconsole('critical', message)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

call.py

from  settings import MyLog
MyLog().debug("This is debug message")
MyLog().info("This is info message")
MyLog().warning("This is warning message")
MyLog().error("This is error")
MyLog().critical("This is critical message")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
控制台输出:和文件输出一致
[2023-01-08 17:44:10,176] [root] [settings.py] [__printconsole] [35] [11064] [DEBUG] : This is debug message
[2023-01-08 17:44:10,176] [root] [settings.py] [__printconsole] [33] [11064] [INFO] : This is info message
[2023-01-08 17:44:10,176] [root] [settings.py] [__printconsole] [37] [11064] [WARNING] : This is warning message
[2023-01-08 17:44:10,176] [root] [settings.py] [__printconsole] [39] [11064] [ERROR] : This is error
[2023-01-08 17:44:10,176] [root] [settings.py] [__printconsole] [41] [11064] [CRITICAL] : This is critical message
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2. 解析

  1. 不同级别日志同意输出到一个文件内,控制台及文件输出都是统一定义,在类中MyLog 只对 不同不同级别函数做了新的重构;在调用时候直接导入类就可以直接调用;

三:Airtest demo

https://blog.csdn.net/weixin_42914706/article/details/129018459

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/346834?site=
推荐阅读
相关标签
  

闽ICP备14008679号