(转)python自动化测试之异常及日志
为了保持自动化测试用例的健壮性,异常的捕获及处理,日志的记录对掌握自动化测试执行情况尤为重要,这里便详细的介绍下在自动化测试中使用到的异常及日志,并介绍其详细的用法。
一、日志
打印日志是很多程序的重要需求,良好的日志输出可以帮我们更方便的检测程序运行状态。Python标准库提供了logging模块,切记Logger从来不直接实例化,其好处不言而喻,接下来慢慢讲解Logging模块提供了两种记录日志的方式。
1.logging之模块级别的函数方式记录日志:
import logging
#设置日志,包括filename、level、format、filemode、stream,其中format属性极其丰富,详情可查看API文档,这里只做简要介绍
logging.basicConfig(level = logging.INFO,
format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt = "%Y/%m%d %H%M%S",
filename = "log.txt") #消息级别,五级
logging.debug("芹泽多摩雄")
logging.info("真")
logging.warning("男")
logging.error("人")
logging.critical("!")
2. logging之日志系统的四大组件(日志器、处理器、过滤器、格式器)方式记录日志:
import logging
# 生成日志实例,日志器
logger = logging.getLogger(__name__)
#基本单元的配置(LEVER)
logger.setLevel(level = logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') #生成管道分支,处理器
handler_1 = logging.FileHandler("log.txt")
handler_2 = logging.StreamHandler() #自定义格式,格式器
handler_1.setFormater(formatter, “%Y-%m-%d %H:%M:%S”)
handler_2.setFormater(formatter, “%Y-%m-%d %H:%M:%S”) #对接分支管道与源头,处理器
logger.addHandler(handler_1)
logger.addHandler(handler_2) #层级结构,logger的名称是一个以'.'分割的层级结构,每个'.'后面的logger都是'.'前面的logger的children,通常配合过滤器一起使用
#过滤器
。。。。保留 #开始记录
logger.debug("芹泽多摩雄")
logger.info("真")
logger.warning("男")
logger.error("人")
logger.critical("!")
3.细心的盆友又可以发现,可以发现,logging有一个日志处理的主对象,其他处理方式都是通过addHandler添加进去,这里采用logging.StreamHandler实现日志输出到流(控制台),也可以用FileHandler实现日志输出到文件
4.日志回滚:
import logging
from logging.handlers import RotatingFileHandler
logger = logging.getLogger(__name__)
logger.setLevel(level = logging.INFO)
#定义一个RotatingFileHandler,最多备份3个日志文件,每个日志文件最大1K
rHandler = RotatingFileHandler("log.txt",maxBytes = 1*1024,backupCount = 3)
rHandler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
rHandler.setFormatter(formatter) console = logging.StreamHandler()
console.setLevel(logging.INFO)
console.setFormatter(formatter) logger.addHandler(rHandler)
logger.addHandler(console)
logger.debug("芹泽多摩雄")
logger.info("真")
logger.warning("男")
logger.error("人")
logger.critical("!")
5.多模块使用
#主模块
import logging
import subModule
logger = logging.getLogger("mainModule")
logger.setLevel(level = logging.INFO)
handler = logging.FileHandler("log.txt")
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter) console = logging.StreamHandler()
console.setLevel(logging.INFO)
console.setFormatter(formatter) logger.addHandler(handler)
logger.addHandler(console) #子模块
import logging module_logger = logging.getLogger("mainModule.sub")
class SubModuleClass(object):
def __init__(self):
self.logger = logging.getLogger("mainModule.sub.module")
细心的盆友会再次发现其实对logger的命名很重要,首先在主模块定义了logger'mainModule',并对它进行了配置,子模块可以共享父logger的定义和配置,所谓的父子logger是通过命名来识别,任意以'mainModule'开头的logger都是它的子logger,例如'mainModule.sub'
6.事实上,纵使有继承配置或者自定义的配置日志功能,但实际中的大项目中还是略麻烦的,这里主要用到JSON或者yaml进行配置封装,这样加载该文件即可加载日志的配置,下回分解具体操作,最后来一发实例。
# -*- coding: utf-8 -*-
__author__ = 'Secret608' import logging
import time
import os
import re class Log(object): def __init__(self, loggerName):
'''
进行日志初始化,包括存储路径、名称、级别、调用文件等
'''
#基本属性
self.logger = logging.getLogger(loggerName)
self.logger.setLevel(logging.WARNING) #特有属性(文件地址+日志记录格式)
rq = time.strftime('%Y%m%d_%H%M%S', time.localtime(time.time()))
log_path = os.path.join(os.path.dirname(os.getcwd()), 'logs')
log_title = os.path.join(log_path, loggerName + '_'+ rq) + ".log"
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') log = logging.FileHandler(log_title)
log.setFormatter(formatter) #加到基本属性中,得到一个完整的初始化对象
self.logger.addHandler(log) def getLog(self): return self.logger def delLog(self, fileName): log_path = os.path.join(os.path.dirname(os.getcwd()), 'logs')
regexp = re.compile('^'+fileName+'s.*')
filelist = os.listdir(log_path)
try:
[os.remove(os.path.join(log_path, i)) for i in filelist if regexp.match(i) == None]
except WindowsError:
pass
else:
return "ok" if __name__ == "__main__":
a = Log("hah")
a.delLog("hah")
二、异常
- 异常类型
- 内置异常:Python的异常处理能力是很强大的,它有很多内置异常,可向用户准确反馈出错信息。在Python中,异常也是对象,可对它进行操作。BaseException是所有内置异常的基类,但用户定义的类并不直接继承BaseException,所有的异常类都是从Exception继承,且都在exceptions模块中定义。
- 自定义异常:可以通过创建一个新的异常类拥有自己的异常,异常应该是通过直接或间接的方式继承自Exception类。比如创建了一个MyError类,基类为Exception,用于在异常触发时输出更多的信息。
- 异常捕获
发生异常时,我们就需要对异常进行捕获,然后进行相应的处理。python的异常捕获常用try...except...结构,把可能发生错误的语句放在try模块里,用except来处理异常,每一个try,都必须至少对应一个except。此外,与python异常相关的关键字主要有:try/except、pass、as(定义异常实例)、else、finally、raise。
捕获所有异常:
# -*- coding: utf-8 -*- #异常处理的语法:
try:
#执行可能出现异常的语句
except '异常名字':
#出现异常执行的语句
else:
#执行没有出现异常的语句
finally:
#异常与否都执行的语句 #demo
try:
a = 0
b = 1
c = b/a
print(c)
except ZeroDivisionError:
print("分母不能为0")
except NameError:
print("名称错误")
except (ZeroDivisionError, NameError):
print("你的分母等于0或者变量名不存在")
except Exception as e:
print("你的变量名或者分母值确实没错,但是出现了其他的错误,详见%s" %e)
d = 1
finally:
print("听说没有错误?不能忍,反正我要让你难受!")
if d == 1:
raise ValueError("你有其它错误")
else:
raise FuckError("开不开心?")
#咦? FuckError是啥?貌似没有定义啊,这里定义一波,届时位置移动到前面去
class FuckError(Exception):
def __int__(self,*args,**keargs):
super(FuckError,self).__int__(*args,**keargs)#python2
self.args = args
print(args)
更多的异常可参看API(https://docs.python.org/3/library/exceptions.html#base-classes)
原文地址:https://www.cnblogs.com/aoaoao/p/9876712.html
(转)python自动化测试之异常及日志的更多相关文章
- python自动化测试之异常及日志
为了保持自动化测试用例的健壮性,异常的捕获及处理,日志的记录对掌握自动化测试执行情况尤为重要,这里便详细的介绍下在自动化测试中使用到的异常及日志,并介绍其详细的用法. 一.日志 打印日志是很多程序的重 ...
- python自动化测试之连接几组测试包实例
python自动化测试之连接几组测试包实例 本文实例讲述了python自动化测试之连接几组测试包的方法,分享给大家供大家参考.具体方法如下: 具体代码如下: class RomanNumera ...
- python 自动化之路 logging日志模块
logging 日志模块 http://python.usyiyi.cn/python_278/library/logging.html 中文官方http://blog.csdn.net/zyz511 ...
- Python自动化测试之selenium从入门到精通
1. 安装selenium 首先确保python安装成功,输入python -V 在windows下使用pip安装selenium,详情如图所示: 在ubuntu下使用pip install sele ...
- appium+python自动化53-adb logcat查看日志
前言 做app测试,遇到异常情况,查看日志是必不可少的,日志如何输出到手机sdcard和电脑的目录呢?这就需要用logcat输出日志了 以下操作是基于windows平台的操作:adb logcat | ...
- appium+python自动化-adb logcat查看日志
前言 做app测试,遇到异常情况,查看日志是必不可少的,日志如何输出到手机sdcard和电脑的目录呢?这就需要用logcat输出日志了 以下操作是基于windows平台的操作:adb logcat | ...
- Python自动化学习--异常提示
举例:打开一个不存在的文件时: >>open("abc.txt","r")会提示错误 Traceback (most recent call las ...
- python自动化测试之生成BeautifulReport可视化测试报告
用python写自动化测试时,unittest框架与BeautifulReport结合能够生成完美的可视化测试报告 [第一步]:准备好BeautifulReport,git地址: https://gi ...
- python自动化测试之DDT数据驱动
时隔已久,再次冒烟,自动化测试工作仍在继续,自动化测试中的数据驱动技术尤为重要,不然咋去实现数据分离呢,对吧,这里就简单介绍下与传统unittest自动化测试框架匹配的DDT数据驱动技术. 话不多说, ...
随机推荐
- LeetCode70——爬楼梯
题目描述 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 解 ...
- DRF框架(二)——解析模块(parsers)、异常模块(exception_handler)、响应模块(Response)、三大序列化组件介绍、Serializer组件(序列化与反序列化使用)
解析模块 为什么要配置解析模块 1)drf给我们提供了多种解析数据包方式的解析类 form-data/urlencoded/json 2)我们可以通过配置来控制前台提交的哪些格式的数据后台在解析,哪些 ...
- pytest_02-用例运行规则
用例设计原则 文件名以test_*.py文件和*_test.py 以test_开头的函数 以Test开头的类 以test_开头的方法 所有的包pakege必须要有__init__.py文件 help帮 ...
- 新安装jenkins要记录的点。
突然很早之前部署的jenkins 由于版本低存在漏洞,被人搞了,在docker中新安装jenkins出现了各种问题,避免跳坑. 不能正确安装插件, Jenkins -> Plugin Manag ...
- 使用NPOI进行Excel操作
一.NPOI组件导入 右键项目菜单,“管理NuGet程序包” 直接搜索“NPOI”即会出现列表,下载第一个进行安装即可 安装完成后项目引用会出现以下几项 二.基础使用 添加引用 using NPOI. ...
- 把项目通过maven生产源码包和文档包并发布到自己的私服上
<!-- 把项目通过maven生产源码包和文档包并发布到自己的私服上 执行maven命令,mvn clean package,执行完成后 命令:mvn deploy 就可以发布到你自己的私服上了 ...
- ASP.NET SignalR 系列(二)之项目创建
一.项目环境 IDE:VisualStudio 2015 SignalR 2.3.0 JQuery版本1.10.1 ,要求必须1.6.4以上 .net Framework 4.6 SignalR2.0 ...
- 2019 钢银java面试笔试题 (含面试题解析)
本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条. 钢银等公司offer,岗位是Java后端开发,最终选择去了 钢银. 面试了很多家公司,感觉大部分公司考察的点都差 ...
- PHP基于TP5使用Websocket框架之GatewayWorker开发电商平台买家与卖家实时通讯
前段时间公司提了一个新的需求,在商品的详情页要实现站内买家和商品卖家实时通讯的功能以方便沟通促成交易,要开发此功能当时首先考虑到的就是swoole和workerman了,从网上大概了解了一下关于这两款 ...
- iOS之集成GoogleMap定位、搜索注意事项
简介: 最近花了些时间看了GoogleMap官方文件并集成到国际版app中,网上关于GoogleMap for iOS的讲解相对Android来说少一点,比较有帮助的几乎全是英文文档.下面是我开发过程 ...