51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 969|回复: 0
打印 上一主题 下一主题

[python] python接口自动化测试输出日志到控制台和文件

[复制链接]
  • TA的每日心情
    无聊
    前天 09:05
  • 签到天数: 1050 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-6-27 09:52:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     一、日志的作用
      一般程序日志出自下面几个方面的需求:
      1. 记录用户操作的审计日志,甚至有的时候就是监管部门的要求。
      2. 快速定位问题的根源。
      3. 追踪程序执行的过程。
      4. 追踪数据的变化。
      5. 数据统计和性能分析。
      6. 采集运行环境数据 一般在程序上线之后,一旦发生异常,第一件事就是要弄清楚当时发生了什么。
      用户当时做了什么操作,环境有无影响,数据有什么变化,是不是反复发生等,然后再进一步的确定大致是哪个方面的问题。确定是程序的问题之后再交由开发人员去重现、研究、提出解决方案。这时,日志就给我们提供了第一手的资料。
      二、日志级别
      1. DEBUG Level  指出细粒度信息事件,主要用来调试应用程序。
      2. INFO level  表明粗粒度级别,上强调应用程序的运行过程,比如进入某个业务分支。
      3. WARN level  表明出现潜在错误。
      4. ERROR leve  指出虽然发生错误事件,但不影响系统的继续运行。
      5. FATAL level  指出每个严重的错误事件将会导致应用程序的退出。
      Log4j建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。 等于或高于日志记录器当前配置级别的日志的将被打印出来。

     优先级为:DEBUG<INFO<WARNING<ERROR<CRITICAL
      日志的默认级别是warning级别及以上,debug和info都不会再控制台输出。
      三、几个重要的概念
      Logger 记录器:提供日志的接口,供应用代码使用。
      Handle 处理器:将(记录器产生的)日志记录发送到哪里,即输出到哪里。
      Filter 过滤器:提供了更好的粒度控制,它可以决定输出哪些日志记录,提供一种优雅的方式决定一个日志记录是否发送到handle。
      Formatter 格式化器:指定日志记录输出的具体格式。
      四、Logger 记录器
      1、概述
      是一个树形层级结构,在使用接口debug、info、warning、error、critical之前必须创建Logger实例,即创建一个记录器,如果没有显式上的进行创建,则默认创建一个root logger,并应用默认的日志级别(warn),处理器Handle(StreamHandle,即将日志信息打印输出在标准输出上),和格式化器Formatter(默认的格式即为第一个简单实用程序中输出的格式)。
      创建的方法:logger = logging.getLogger(logger_name)
      Logger对象从不直接实例化,而是通过模块级别的功能。
      Logging.getLogger(name)创建logger实例,调用logging.getLogger(name)功能时,如果传入的name参数值相同,则总是返回一个logger对象实例的应用。
      2、创建Logger实例后,可以用以下方法进行日志级别设置,增加处理器Handle
      logger.setLevel(logging.ERROR) = 设置日志级别为ERROR,即只有日志级别大于等于ERROR的日志才会输出。(默认级别是warning)
      logger.addHandle(handle_name) = 为Logger实例增加一个处理器。
      logger.removeHandle(handle_name) = 为Logger实例删除一个处理器。
      五、Handle 处理器
      1、概述
      handle 将日志信息发送到指定的位置(文件、窗口)。
      Handle处理器的类型:StreamHandle,FileHandle,NullHandle。
      2、StreamHandle
      创建方法:sh = logging.StreamHandle(stream==None)
      将日志输出发送到控制台。
      3、FileHandle
      将日志记录发送到磁盘文件,它继承了StreamHandle的输出功能。
      创建方法:fh = logging.FileHandle(filename,mode='a',encoding=None,delay=False)
      4、NullHandle
      不做任何格式化或输出,它本质上是一个开发人员使用的“无操作”处理程序。
      本质上是一个“什么都不做”的handle,由库开发者使用。
      六、Formatter 格式化器
      1、概述
      用于设置日志的输出格式。
      创建方法:formatter = logging.Formatter(fmt=None,datefmt=None),fmt和datefmt是用来设置日志格式和时间格式。
      默认的格式:%(asctime)s-%(levelname)s-%(message)s
      默认的时间格式:%Y-%m-%d %H:%M:%S
      2、使用Formatter对象设置日志信息最后的规则、结构和内容。

    七、日志在实际测试用例中的应用
      封装类有便于外部文件对日志的调用,例子主要完成在控制台输出日志和日志输出到外部的.log文件中
      封装日志类的步骤:
      ·创建 logger
      · 创建 handle
      · 创建 formatter
      · 配置 logger
      上栗子:
      1.在工程目录下创建类的外部log文件:test.log
      2.封装Logger类:
    1. # 日志综合案例的封装
    2.   import logging
    3.   class Logger():
    4.       def __init__(self, LoggerName, FileName, CmdLevel, FileLevel):
    5.           # LoggerName:实例化对象的名字  FileName:外部文件名   CmdLevel:设置控制台中日志输出的级别  FileLevel:设置文件日志输出的级别
    6.           self.logger = logging.getLogger(LoggerName)
    7.           # 设置日志的级别
    8.           self.logger.setLevel(logging.DEBUG)
    9.           # 设置日志的输出格式
    10.           fmt = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')
    11.           # 借助handle将日志输出到test.log文件中
    12.           fh = logging.FileHandler(FileName)
    13.           fh.setLevel(FileLevel)
    14.           # 借助handle将日志输出到控制台
    15.           ch = logging.StreamHandler()
    16.           ch.setLevel(CmdLevel)
    17.           # 配置logger
    18.           fh.setFormatter(fmt)
    19.           ch.setFormatter(fmt)
    20.           # 给logger添加handle
    21.           self.logger.addHandler(fh)
    22.           self.logger.addHandler(ch)
    23.       def debug(self,message):
    24.           self.logger.debug(message)
    25.       def info(self,message):
    26.           self.logger.info(message)
    27.       def warn(self,message):
    28.           self.logger.warning(message)
    29.       def error(self,message):
    30.           self.logger.error(message)
    31.       def critical(self,message):
    32.           self.logger.critical(message)
    33.   # 如下为测试代码,实际运行中可以注释掉
    34.   if __name__ == "__main__":
    35.       logger = Logger("appium","test.log",CmdLevel=logging.DEBUG,FileLevel=logging.INFO)
    36.       logger.debug("debug message!")
    37.       logger.info("info message!")
    38.       logger.warn("warning message!")
    39.       logger.error("error message!")
    40.       logger.critical("critical message!")
    复制代码
    3.调用Loger类:
      在类的外部创建Logger类的实例化对象,传入需要的参数。
    1.  # 其他类中调用Loger类
    2.   # 实例化Logger类,并传入参数
    3.   logger = Logger("appium", "test.log", CmdLevel=logging.DEBUG, FileLevel=logging.INFO)
    4.   class Test:
    5.       logger.debug("debug message!")
    6.       logger.info("info message!")
    7.       logger.warn("warning message!")
    8.       logger.error("error message!")
    9.       logger.critical("critical message!")
    复制代码
    4.输出结果:
    1. 控制台:
    2.   2020-09-10 10:32:46,230-appium-DEBUG-debug message!
    3.   2020-09-10 10:32:46,230-appium-INFO-info message!
    4.   2020-09-10 10:32:46,230-appium-WARNING-warning message!
    5.   2020-09-10 10:32:46,230-appium-ERROR-error message!
    6.   2020-09-10 10:32:46,230-appium-CRITICAL-critical message!
    7.   外部文件:
    8.   20-09-10 10:32:46,230-appium-INFO-info message!
    9.   2020-09-10 10:32:46,230-appium-WARNING-warning message!
    10.   2020-09-10 10:32:46,230-appium-ERROR-error message!
    11.   2020-09-10 10:32:46,230-appium-CRITICAL-critical message
    复制代码






    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-23 08:29 , Processed in 0.061825 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表