python自动化测试之异常及日志操作实例分析
本文实例讲述了python自动化测试之异常及日志操作。分享给大家供大家参考,具体如下:
为了保持自动化测试用例的健壮性,异常的捕获及处理,日志的记录对掌握自动化测试执行情况尤为重要,这里便详细的介绍下在自动化测试中使用到的异常及日志,并介绍其详细的用法。
一、日志
打印日志是很多程序的重要需求,良好的日志输出可以帮我们更方便的检测程序运行状态。Python标准库提供了logging模块,切记Logger从来不直接实例化,其好处不言而喻,接下来慢慢讲解Logging模块提供了两种记录日志的方式。
- logging之模块级别的函数方式记录日志
importlogging #设置日志,包括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("!")
importlogging #生成日志实例,日志器 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("!")
importlogging fromlogging.handlersimportRotatingFileHandler 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("!")
#主模块 importlogging importsubModule 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) #子模块 importlogging module_logger=logging.getLogger("mainModule.sub") classSubModuleClass(object): def__init__(self): self.logger=logging.getLogger("mainModule.sub.module")
细心的盆友会再次发现其实对logger的命名很重要,首先在主模块定义了logger'mainModule',并对它进行了配置,子模块可以共享父logger的定义和配置,所谓的父子logger是通过命名来识别,任意以'mainModule'开头的logger都是它的子logger,例如'mainModule.sub'
#-*-coding:utf-8-*- __author__='Secret608' importlogging importtime importos importre classLog(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) defgetLog(self): returnself.logger defdelLog(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))foriinfilelistifregexp.match(i)==None] exceptWindowsError: 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) exceptZeroDivisionError: print("分母不能为0") exceptNameError: print("名称错误") except(ZeroDivisionError,NameError): print("你的分母等于0或者变量名不存在") exceptExceptionase: print("你的变量名或者分母值确实没错,但是出现了其他的错误,详见%s"%e) d=1 finally: print("听说没有错误?不能忍,反正我要让你难受!") ifd==1: raiseValueError("你有其它错误") else: raiseFuckError("开不开心?") #咦?FuckError是啥?貌似没有定义啊,这里定义一波,届时位置移动到前面去 classFuckError(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)
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python日志操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。