python+selenium自動化軟件測試(第9章) :Logging模塊

9.1 Logging模塊

什麼是日誌記錄?
記錄是跟蹤運行時發生的事件的一種手段。該軟件的開發人員將記錄調用添加到其代碼中,以指示某些事件已發生。事件由描述性消息描述,該消息能夠可選地包含可變數據(即,對於事件的每次出現可能不一樣的數據)。事件也是開發人員對事件的重視; 重要性也能夠稱爲級別 或嚴重性。
記錄功能
logging.debug('此功能提供詳細信息')
logging.warning('意外發生')
logging.error('用於存儲異常跟蹤')
logging.info('確認事情正在按計劃進行')
logging.critical('要執行的主要操做失敗')python

日誌記錄級別
如下是嚴重性日益增長的順序級別。關鍵是最高級別,Info是最低級別,即若是咱們配置了「WARNING」的日誌,咱們的日誌文件將包含WARNING,ERROR&CRITICAL的日誌。默認日誌消息是:web

WARNING
DEBUG
INFO(信息 )
WARNING(警告)
ERROR(錯誤)
CRITICAL(危急)ide

建立一個簡單的記錄器測試

#導入日誌模塊
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小案例ui

#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')

異常處理案例spa

#導入日誌記錄模塊
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頁面的標題爲錯誤,則能夠提出異常。debug

此處將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的以下圖code

 

 python3的以下圖orm

 

# 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來用就行啦,沒什麼技巧
1、log保存本地
1.logger模塊的封裝在9.2章節,個人用例參考目錄以下
2.先設置保存log到本地的文件路徑地址,如:log_path = "D:\\test\\newp\\report"

 

 

2、用例代碼
如下是簡單的一個百度的搜索案例僅供參考

# 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.打開報告,看到的效果以下

相關文章
相關標籤/搜索