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.打开报告,看到的效果如下

  • 相关阅读:
    HDU 4947 GCD Array 容斥原理+树状数组
    Codeforces Round #363 (Div. 2)
    白书 博弈学习
    2016 Multi-University Training Contest 1
    KM算法 PK 最小费用最大流
    final 发布 领跑衫获奖感想
    2016"百度之星"
    爆打团队 2016.05.05 站立会议
    爆打团队 四则运算 beta视频
    爆打团队 2016.04.27 站立会议
  • 原文地址:https://www.cnblogs.com/zidonghua/p/7436224.html
Copyright © 2011-2022 走看看