zoukankan      html  css  js  c++  java
  • python+selenium自动化软件测试(第9章) :Logging模块

    9.1 Logging模块

    什么是日志记录?
    记录是跟踪运行时发生的事件的一种手段。该软件的开发人员将记录调用添加到其代码中,以指示某些事件已发生。事件由描述性消息描述,该消息可以可选地包含可变数据(即,对于事件的每次出现可能不同的数据)。事件也是开发人员对事件的重视; 重要性也可以称为级别 或严重性。
    记录功能
    logging.debug('此功能提供详细信息')
    logging.warning('意外发生')
    logging.error('用于存储异常跟踪')
    logging.info('确认事情正在按计划进行')
    logging.critical('要执行的主要操作失败')

    日志记录级别
    以下是严重性日益增加的顺序级别。关键是最高级别,Info是最低级别,即如果我们配置了“WARNING”的日志,我们的日志文件将包含WARNING,ERROR&CRITICAL的日志。默认日志消息是:

    WARNING
    DEBUG
    INFO(信息 )
    WARNING(警告)
    ERROR(错误)
    CRITICAL(危急)

    创建一个简单的记录器

    #导入日志模块
    import logging
    
    #创建要记录的日志级别的记录器
    
    logger = logging.getLogger(—name_)
    logger.setLevel(logging.INFO)
    
    #创建日志处理程序
    
    handler_warn = logging.FileHandlen('warning_log.txt')
    handlen_warn.setLevel(logging.WARNING)
    
    #曰志处理程序创建事务
    
    formatter = logging.Formatter('%(asctime)s - %(name)s
    -%(levelname)s - %(message)s')
    handler_warn.setFormatter(formatter)
    
    #将日志处理程序记录到记录器
    logger.addHandler(handler_warn)

    编写Logger小案例

    #Import the logging module
    import logging
    
    logger = logging.get Logger(__name__)
    logger.setLevel(logging.INFO)
    
    #Create a file handler
    
    handler_warn = logging.FileHandler('warning_log.txt')
    handler_warn.setLevel(logging.WARNING)
    
    handler_info = logging.FileHandler('info_log.txt')
    handler_info.setLevel(logging.INFO)
    
    #cneate a logging format
    
    formatter = logging.Formatter('%(asctime)s - %(name)s
    -%(levelname)s - %(message)s')
    handler_wann.setFonmatter(fonmatter)
    handler_info.setFormatter(formatter)
    
    #add the handler to the logger
    
    logger.addHandler(handler_wann)
    logger.addHandler(handler_info)
    
    logger.info('Information')
    logger.wanning('warning')

    异常处理案例

    #导入日志记录模块
    import logging
    
    #创建一个记录器
    
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.INFO)
    
    #创建一个日志处理程序
    
    handler = logging.FileHandler('exl_critical.txt')
    handler.setLevel(logging.INFO)
    
    #日志的格式
    formatter = logging.Formatter('%(asctime)s - %(name)s
    -%(levelname)s - %(message)s')
    handler.setFonmatten(formatten)
    
    #将处理程序添加到记录器
    logger.addHandler(handler)
    
    def age():
        logger.info('Inside function age()')
    try:
        logger.info('In the try Block ')
        age = int(input("请输入你当前年龄"))
        logger.debug('Value of age is %s'%age)
    
    except ValueError as e:
        logger.critical('Invalid Input',exc_info=True)
    
    if __name__ == "__main__":
        age()

    案例情景
    导航到某个页面并设置标题断言找到xxx按钮,并进行搜索selenium Python。
    如果判定selenium Python无效定位符或者测试脚本中的baidu页面的标题为错误,则可以提出异常。

    此处将CRITICAL日志存储在名为xxx.txt的文件中,并且INFO日志被看到在控制台。

    import unittest
    import logging
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    from selenium.common.exceptions
    import NoSuchElementException
    from selenium.webdriver.common.by import By
    
    #cneate a logger
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.INFO)
    
    #日志处理
    
    #创建并命名xxx.txt
    
    handler_critical = logging.FileHandlen('xxx.txt', 'w')
    handler_cnitical.setLevel(logging.WARNING)
    
    #输出日志信息
    
    handler_info = logging.StreamHandler()
    handler_info.setLevel(logging.INFO)
    
    #日志格式
    
    formatter = logging.Formatter('%(asctime)s - %
    (asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler_cnitical.setFormatter(formatter)
    handler_info.setFormatter(formatter)
    
    #处理信息
    
    logger.addHandler(handler_info)
    logger.addHandler(handler_critical)
    
    class YoutubeSearch(unittest.TestCase):
    
    def setUp(self):
    
        logger.info("-----xxx-----")
        self.browser = webdniver.Firefox()
        self.browser.get("http://www.xxx.com")
        logger.info("-----xxx-----")
    
    def tearDown(self):
    
        logger.info("-----xxx-----")
        self.browser.save_screenshot('xxx.png')
        self.browser.quit()
        logger.info("-----xxx-----")
    
    def test_youtube_seanch(self):
        logger.info("-----xxx-----")
    
    try:
        self.assentln("xxx",self.browser.title)
        searchElement = self.browser.find_element_by_id("xxxx")
    
    except AssertionErron:
        logger.critical('xxx'Jexc_info=True)
        self.fail(’xxx')
    
    except NoSuchElementException:
        logger.critical('xxxx'Jexc_info=True)
        self.fail('xxxx')
    
    else:
        searchElement.send_keys("xxxx")
        searchElement.send_keys(Keys.RETURN)
        logger.info("---xxxx-----")
    
    if __name__ == "__main__":
        unittest.main(exit=False,warnings = 'ignore')

    9.2封装Logging模块(兼容python2和3)

    这里python2和python3有一行代码有区别:
    python2的如下图

     python3的如下图

    # coding:utf-8
    import logging, time, os
    # 这个是日志保存本地的路径 log_path = "D:\test\newp\report" class Log:     def __init__(self):         # 文件的命名         self.logname = os.path.join(log_path, '%s.log'%time.strftime('%Y_%m_%d'))         self.logger = logging.getLogger()         self.logger.setLevel(logging.DEBUG)         # 日志输出格式         self.formatter = logging.Formatter('[%(asctime)s] - %(filename)s] - %(levelname)s: %(message)s')     def __console(self, level, message):         # 创建一个FileHandler,用于写到本地         fh = logging.FileHandler(self.logname, 'a')  # 追加模式         # fh = logging.FileHandler(self.logname, 'a', encoding='utf-8')  # 这个是python3的         fh.setLevel(logging.DEBUG)         fh.setFormatter(self.formatter)         self.logger.addHandler(fh)         # 创建一个StreamHandler,用于输出到控制台         ch = logging.StreamHandler()         ch.setLevel(logging.DEBUG)         ch.setFormatter(self.formatter)         self.logger.addHandler(ch)         if level == 'info':             self.logger.info(message)         elif level == 'debug':             self.logger.debug(message)         elif level == 'warning':             self.logger.warning(message)         elif level == 'error':             self.logger.error(message)         # 这两行代码是为了避免日志输出重复问题         self.logger.removeHandler(ch)         self.logger.removeHandler(fh)         # 关闭打开的文件         fh.close()     def debug(self, message):         self.__console('debug', message)     def info(self, message):         self.__console('info', message)     def warning(self, message):         self.__console('warning', message)     def error(self, message):         self.__console('error', message)
    if __name__ == "__main__":    log = Log()    log.info("---测试开始----")    log.info("输入密码")    log.warning("----测试结束----")

    9.3 logging封装后的使用

    前言
    logger的使用跟print其实是一回事,只是logger输出的内容更详细一些,当成print来用就行啦,没什么技巧
    一、log保存本地
    1.logger模块的封装在9.2章节,我的用例参考目录如下
    2.先设置保存log到本地的文件路径地址,如:log_path = "D:\test\newp\report"

    二、用例代码
    以下是简单的一个百度的搜索案例仅供参考

    # coding:utf-8
    import unittest,time
    from common.logger import Log
    from selenium import webdriver
    log = Log()
    class Test(unittest.TestCase):
        def setUp(self):
            self.driver = webdriver.Firefox()
            self.driver.get("https://www.baidu.com")
            self.driver.implicitly_wait(30)
        def test_01(self):
            log.info("-------测试用例开始---------")
            self.driver.find_element_by_id("kw").send_keys("yoyo")
            log.info("输入内容:yoyo")
            self.driver.find_element_by_id("su").click()
            log.info("点击按钮:id = su")
            time.sleep(2)
            t = self.driver.title
            log.info(u"获取title内容:%s"%t)
            self.assertIn(u"百度搜索",t)
        def tearDown(self):
            self.driver.quit()
            log.info("-------测试用例结束----------")
    if __name__ == "__main__":
        unittest.main()

    三.运行结果:
    1.执行run_all脚本(3.9章节)

    2.打开存放日志文件的目录,找到log文件

    3.打开报告,看到的效果如下

  • 相关阅读:
    SpringBoot实现原理
    常见Http状态码大全
    forward(转发)和redirect(重定向)有什么区别
    1094. Car Pooling (M)
    0980. Unique Paths III (H)
    1291. Sequential Digits (M)
    0121. Best Time to Buy and Sell Stock (E)
    1041. Robot Bounded In Circle (M)
    0421. Maximum XOR of Two Numbers in an Array (M)
    0216. Combination Sum III (M)
  • 原文地址:https://www.cnblogs.com/zidonghua/p/7436224.html
Copyright © 2011-2022 走看看