什麼是日誌記錄?
記錄是跟蹤運行時發生的事件的一種手段。該軟件的開發人員將記錄調用添加到其代碼中,以指示某些事件已發生。事件由描述性消息描述,該消息能夠可選地包含可變數據(即,對於事件的每次出現可能不一樣的數據)。事件也是開發人員對事件的重視; 重要性也能夠稱爲級別 或嚴重性。
記錄功能
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')
這裏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("----測試結束----")
前言
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.打開報告,看到的效果以下