python自动化测试之异常及日志

时间:2022-09-05 08:49:03

  为了保持自动化测试用例的健壮性,异常的捕获及处理,日志的记录对掌握自动化测试执行情况尤为重要,这里便详细的介绍下在自动化测试中使用到的异常及日志,并介绍其详细的用法。

  一、日志

    打印日志是很多程序的重要需求,良好的日志输出可以帮我们更方便的检测程序运行状态。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

    python自动化测试之异常及日志的更多相关文章

    1. (转)python自动化测试之异常及日志

      为了保持自动化测试用例的健壮性,异常的捕获及处理,日志的记录对掌握自动化测试执行情况尤为重要,这里便详细的介绍下在自动化测试中使用到的异常及日志,并介绍其详细的用法. 一.日志 打印日志是很多程序的重 ...

    2. python自动化测试之连接几组测试包实例

      python自动化测试之连接几组测试包实例 本文实例讲述了python自动化测试之连接几组测试包的方法,分享给大家供大家参考.具体方法如下: 具体代码如下:     class RomanNumera ...

    3. python 自动化之路 logging日志模块

      logging 日志模块 http://python.usyiyi.cn/python_278/library/logging.html 中文官方http://blog.csdn.net/zyz511 ...

    4. Python自动化测试之selenium从入门到精通

      1. 安装selenium 首先确保python安装成功,输入python -V 在windows下使用pip安装selenium,详情如图所示: 在ubuntu下使用pip install sele ...

    5. appium+python自动化53-adb logcat查看日志

      前言 做app测试,遇到异常情况,查看日志是必不可少的,日志如何输出到手机sdcard和电脑的目录呢?这就需要用logcat输出日志了 以下操作是基于windows平台的操作:adb logcat | ...

    6. appium+python自动化-adb logcat查看日志

      前言 做app测试,遇到异常情况,查看日志是必不可少的,日志如何输出到手机sdcard和电脑的目录呢?这就需要用logcat输出日志了 以下操作是基于windows平台的操作:adb logcat | ...

    7. Python自动化学习--异常提示

      举例:打开一个不存在的文件时: >>open("abc.txt","r")会提示错误 Traceback (most recent call las ...

    8. python自动化测试之生成BeautifulReport可视化测试报告

      用python写自动化测试时,unittest框架与BeautifulReport结合能够生成完美的可视化测试报告 [第一步]:准备好BeautifulReport,git地址: https://gi ...

    9. python自动化测试之DDT数据驱动

      时隔已久,再次冒烟,自动化测试工作仍在继续,自动化测试中的数据驱动技术尤为重要,不然咋去实现数据分离呢,对吧,这里就简单介绍下与传统unittest自动化测试框架匹配的DDT数据驱动技术. 话不多说, ...

    随机推荐

    1. 【FFmpeg】Windows下64位ffmpeg编译

      本文主要记录在64位Windows 7下,编译64位ffmpeg的过程. 1.资源准备 (1). MSYS http://sourceforge.net/projects/mingwbuilds/fi ...

    2. 使用EXISTS语句注意点

      1.使用EXISTS语句,其目标列一般用“*”,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义. 2.使用EXISTS语句一定要注意上下两个表之间要建立联系. 例如,查询所有选修了1号 ...

    3. SQL调用系统存储过程整理

      SQL系统存储过程用法整理: xp_cmdshell --*执行DOS各种命令,结果以文本行返回. xp_fixeddrives --*查询各磁盘/分区可用空间 xp_loginconfig --*报 ...

    4. RFID电动自行车与共享单车之物联网比较

      目前比较热门的RFID电动自行车管理和共享单车,都是属于物联网范畴.它们之间有什么不同呢? 1.RFID电动自行车管理系统原理 RFID电动自行车管理,利用了有源RFID技术,使用基站SR8读取安装在 ...

    5. [BJOI2006]狼抓兔子

      题目描述 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...

    6. C# — 调用dll出现试图加载不正确格式的程序问题

      今天在调用百度dll包时,运行项目出现了如下警告: 修改:鼠标右击项目名称----选择属性----生成-----平台目标-----X64(由于我调用的是X64的dll包,所以这里选择X64,网上许多说 ...

    7. springcloud-Ribbon-负载均衡组件

      Ribbon负载均衡 1.Ribbon简介 ribbin是Netflix发布的负载均衡器,有助于控制http和tcp客户端的行为,为ribbon配置服务提供者列表后,ribbon就可以基于某种负载均衡 ...

    8. python常用内建模块--datetime

      datetime模块中的datetime类: 获取当前时间:datetime.now() 当前操作系统时区时间,date.utctime(UTC时间) 转换成时间戳:timestamp() 和具体时区 ...

    9. CentOS7时间和日期的同步 (chrony和)

      CentOS 6版本,使用 hwclock CentOS 7版本,使用timedatectl 1.基本概念 1.1 GMT,UTC,CST,DST时间 世界标准时间 整个地球分为二十四时区,每个时区都 ...

    10. Spring Framework启动详解

      之前一直对Spring启动的过程很迷糊,所以这次国庆梳理一下. Spring启动一言以蔽之:创建一个根应用上下文.(因为其他的所有的应用上下文都可以通过各种方式继承它) (一)了解应用上下文 Spri ...