python自動(dòng)化測(cè)試通過(guò)日志3分鐘定位bug
一、簡(jiǎn)單使用
入門(mén)小案例
import logging
logging.basicConfig(level=logging.DEBUG, #設(shè)置級(jí)別,根據(jù)等級(jí)顯示
format='%(asctime)s-[%(filename)s-->line:%(lineno)d]-%(levelname)s:% (message)s') # 設(shè)置輸出格式
logging.debug('This is a debug log')
logging.info('This is a info log')
logging.warning('This is a warning log')
logging.error('This is a error log')
logging.critical('This is a critical log')
日志級(jí)別
根據(jù)不同情況設(shè)置了五種日志等級(jí),不同情況輸出不同等級(jí)的日志。

日志器設(shè)置的級(jí)別會(huì)過(guò)濾掉低于這個(gè)級(jí)別的日志
import logging
logging.basicConfig(level=logging.WARNING, #設(shè)置級(jí)別,根據(jù)等級(jí)顯示
format='%(asctime)s-[%(filename)s-->line:%(lineno)d]-%(levelname)s:% (message)s') # 設(shè)置輸出格式
logging.debug('This is a debug log')
logging.info('This is a info log')
logging.warning('This is a warning log')
logging.error('This is a error log')
logging.critical('This is a critical log')
2020-09-11 17:39:26,667-WARNING-This is a warning log
2020-09-11 17:39:26,669-ERROR-This is a error log
2020-09-11 17:39:26,669-CRITICAL-This is a critical log
配置
basicConfig 方法支持一下關(guān)鍵字參數(shù)進(jìn)行配置。

格式化規(guī)則
日志的輸出格式可以通過(guò)下面格式自由組合輸出

常用格式:%(asctime)s-[%(filename)s–>line:%(lineno)d]-%(levelname)s:% (message)s
import logging
logging.basicConfig(level=logging.DEBUG, #設(shè)置級(jí)別,根據(jù)等級(jí)顯示
format='%(asctime)s-[%(filename)s-->line:%(lineno)d]-%(levelname)s:% (message)s') # 設(shè)置輸出格式
logging.debug('This is a debug log')
[DEBUG]-2020-09-11 17:36:50,125–4:This is a debug log
日志寫(xiě)到文件
只需要配置 filename 參數(shù)即可
import logging
logging.basicConfig(
level=logging.WARNING, #設(shè)置級(jí)別,根據(jù)等級(jí)顯示
filename='example.log'
format='%(asctime)s-[%(filename)s-->line:%(lineno)d]-%(levelname)s:% (message)s') # 設(shè)置輸出格式
logging.debug('This is a debug log')
logging.info('This is a info log')
logging.warning('This is a warning log')
logging.error('This is a error log')
logging.critical('This is a critical log')
注意,配置了 fielname 后,日志將不會(huì)輸出在控制臺(tái)。
二、高級(jí)用法
簡(jiǎn)單的代碼通過(guò) logging 直接使用即可,如果要深入使用需要按照面向?qū)ο蟮姆绞绞褂?logging。
日志組件
logging 模塊包含一下幾個(gè)組件。

步驟
1 創(chuàng)建日志記錄器
import logging
# 第一步創(chuàng)建一個(gè)logger,用來(lái)產(chǎn)生日志
logger = logging.getLogger('%s_log' % __name__)
logger.setLevel(logging.DEBUG) # 設(shè)置日志等級(jí)
通過(guò) getLogger 這個(gè)方法可以創(chuàng)建一個(gè)日志記錄器,注意要給名字否則返回根日志記錄器。
通過(guò) setLevel 設(shè)置日志記錄器的等級(jí)。
2 創(chuàng)建日志處理器
# 創(chuàng)建一個(gè)文本處理器用來(lái)將日志寫(xiě)入到文件 file_handler = logging.FileHandler(filename='py34.log',encoding='utf-8')
file_handler.setLevel('WARNING') # 設(shè)置處理器的日志等級(jí)
# 創(chuàng)建一個(gè)控制臺(tái)處理器用來(lái)將日志輸出到控制臺(tái)
console_handler = logging.StreamHandler()
console_handler.setLevel('INFO') # 設(shè)置控制臺(tái)處理器的日志等級(jí)
日志處理器就是將日志發(fā)送到指定的位置
FileHandler 將日志發(fā)送到文件
StreaHandler 將它可將日志記錄輸出發(fā)送到數(shù)據(jù)流例如 sys.stdout, sys.stderr 或任何文件類(lèi)對(duì)象默認(rèn)sys.stdout 即控制臺(tái)。
RotatingFileHandler 支持根據(jù)日志文件大小進(jìn)行輪轉(zhuǎn)
TimedRotatingFileHandler 支持根據(jù)時(shí)間進(jìn)行輪轉(zhuǎn)日志文件
更多詳情見(jiàn)官方文檔
3 創(chuàng)建格式化器
formatter = logging.Formatter(fmt='%(levelname)s %(asctime)s [%(filename)s-->line:%(lineno)d]:%(message)s')
格式化器需要設(shè)置到處理器上
file_handler.setFormatter(formatter) console_handler.setFormatter(formatter)
4 創(chuàng)建過(guò)濾器
過(guò)濾器用來(lái)過(guò)濾指定日志。具體使用略,一般用不到。
詳情見(jiàn)官方文檔
5 將處理器添加到記錄器上
logger.addHandler(file_handler) logger.addHandler(console_handler)
6 記錄日志
logger.info('This is a info')
2020-09-11 22:22:44,095-[–>line:1]-INFO:This is a info
logger.warning('This is a warning')
2020-09-11 22:23:20,337-[–>line:1]-WARNING:This is a warning
三、日志模塊封裝
功能分析
- 能夠自定義日志器名
- 能夠自定義日志文件名和路徑
- 能夠自定義日志文件編碼方式
- 能夠自定義日志格式
- 使用時(shí)間輪轉(zhuǎn)處理器,并能夠配置
封裝成函數(shù)
在 common 目錄下創(chuàng)建模塊 log_handler.py 在其中創(chuàng)建如下函數(shù)。
import logging
from logging.handlers import TimedRotatingFileHandler
def get_logger(name, filename, encoding='utf-8', fmt=None, when='d', interval=1, backup_count=7, debug=False):
"""
:param name: 日志器的名字
:param filename: 日志文件名(包含路徑)
:param encoding: 字符編碼
:param fmt: 日志格式
:param when: 日志輪轉(zhuǎn)時(shí)間單位
:param interval: 間隔
:param backup_count: 日志文件個(gè)數(shù)
:param debug: 調(diào)試模式
:return:
"""
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
# 文件處理器的等級(jí)一般情況一定比控制臺(tái)要高
if debug:
file_level = logging.DEBUG
console_level = logging.DEBUG
else:
file_level = logging.WARNING
console_level = logging.INFO
if fmt is None:
fmt = '%(levelname)s %(asctime)s [%(filename)s-->line:%(lineno)d]:%(message)s'
file_handler = TimedRotatingFileHandler(
filename=filename, when=when, interval=interval, backupCount=backup_count, encoding=encoding)
file_handler.setLevel(file_level)
console_handler = logging.StreamHandler()
console_handler.setLevel(console_level)
formatter = logging.Formatter(fmt=fmt)
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.addHandler(console_handler)
return logger
if __name__ == '__main__':
log = get_logger(name='py41', filename='py41.log', debug=True, when='s')
log.info('我是普通信息')
import time
time.sleep(3)
log.warning('我是警告信息')
四、應(yīng)用到項(xiàng)目中
導(dǎo)入
日志器生成函數(shù)的導(dǎo)入不能像 Excel 數(shù)據(jù)讀取函數(shù)一樣,每個(gè)用例模塊里都導(dǎo)入一遍。因?yàn)樗祷匾粋€(gè)日志器對(duì)象,當(dāng)多次調(diào)用日志器生成函數(shù),且日志器名稱(chēng)相同時(shí),會(huì)給同一個(gè)日志器添加多個(gè)日志處理器,從而出現(xiàn)重復(fù)記錄日志器的問(wèn)題。
為了解決上面的問(wèn)題,在 common 文件夾下創(chuàng)建一個(gè)名為 init.py 的文件,在 common 模塊被導(dǎo)入時(shí)會(huì)自動(dòng)執(zhí)行這個(gè)文件里的代碼,且只會(huì)執(zhí)行一次。
在 init.py 文件編寫(xiě)如下代碼:
from .log_handler import get_logger
logger = get_logger('py41', 'py38.log')
那么在項(xiàng)目中的其他模塊中就可以通過(guò)如下代碼導(dǎo)入
from common import logger
從而可以保證在項(xiàng)目執(zhí)行過(guò)程中,get_logger 方法只會(huì)執(zhí)行一遍。
記錄日志
日志的作用是記錄程序的運(yùn)行狀態(tài)和當(dāng)程序出現(xiàn)問(wèn)題時(shí)能提供定位分析錯(cuò)誤的依據(jù)。
什么時(shí)候需要記錄日志,記錄什么日志,根據(jù)每個(gè)人對(duì)程序的理解,以及經(jīng)驗(yàn)。
我們的項(xiàng)目中,在用例執(zhí)行的過(guò)程是核心,所以我們的日志也是圍繞著用例的執(zhí)行。
使用日志記錄每個(gè)用例的測(cè)試數(shù)據(jù),和測(cè)試結(jié)果,代碼如下:
...
@list_data(*cases)
def test_login(self, case):
"""
登陸測(cè)試
"""
logger.info('測(cè)試用例【{}】開(kāi)始測(cè)試'.format(case['title']))
# 1. 測(cè)試數(shù)據(jù)
# 傳入進(jìn)來(lái)的case參數(shù)
logger.info('測(cè)試用例【{}】的測(cè)試數(shù)據(jù)是:{}'.format(case['title'], case))
# 2. 測(cè)試步驟
res = login_check(case['username'], case['password'])
logger.info('測(cè)試用例【{}】的測(cè)試結(jié)果是:{}'.format(case['title'], res))
# 3. 斷言
try:
self.assertEqual(res, case['expect'])
except AssertionError as e:
logger.error('測(cè)試用例【{}】斷言失敗'.format(case['title']))
raise e
else:
logger.info('測(cè)試用例【{}】斷言成功'.format(case['title']))
finally:
logger.info('測(cè)試用例【{}】測(cè)試結(jié)束')
以上就是python自動(dòng)化測(cè)試通過(guò)日志3分鐘定位bug的詳細(xì)內(nèi)容,更多關(guān)于日志定位bug的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- python自動(dòng)化測(cè)試工具Helium使用示例
- Python?pytest自動(dòng)化測(cè)試庫(kù)十個(gè)強(qiáng)大用法示例
- python自動(dòng)化測(cè)試Data?Driven?Testing(DDT)用例解析
- Python UI自動(dòng)化測(cè)試Web frame及多窗口切換
- python自動(dòng)化測(cè)試中APScheduler?Flask的應(yīng)用示例
- python自動(dòng)化測(cè)試用例全對(duì)偶組合與全覆蓋組合比較
- python自動(dòng)化測(cè)試selenium屏幕截圖示例
- python自動(dòng)化測(cè)試selenium定位frame及iframe示例
- python?Helium自動(dòng)化庫(kù)的功能特性探索
相關(guān)文章
Python loguru日志庫(kù)之高效輸出控制臺(tái)日志和日志記錄
這篇文章主要介紹了python loguru日志庫(kù)之高效輸出控制臺(tái)日志和日志記錄的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
python之tensorflow手把手實(shí)例講解斑馬線識(shí)別實(shí)現(xiàn)
目前智慧城市的發(fā)展,人們生活處處有科技,比如人臉識(shí)別,智慧交通,無(wú)人駕駛等前沿的科技產(chǎn)品也都融入了人們生活中;本篇文章帶你從頭開(kāi)始實(shí)現(xiàn)斑馬線識(shí)別2021-09-09
Python+tkinter實(shí)現(xiàn)音樂(lè)下載軟件的制作
平常我們下載的歌曲,都是各種妖魔鬼怪的格式橫行,想下載下來(lái)用一下都不行,還只能在它的播放器內(nèi)聽(tīng),這誰(shuí)受得了~本文就來(lái)用Python制作個(gè)音樂(lè)下載軟件,需要的可以參考一下2022-09-09
jupyter 使用Pillow包顯示圖像時(shí)inline顯示方式
這篇文章主要介紹了jupyter 使用Pillow包顯示圖像時(shí)inline顯示方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
Python與C++中梯度方向直方圖的實(shí)現(xiàn)
在學(xué)習(xí)HOG特征的時(shí)候,發(fā)現(xiàn)一片英文文章講得淺顯易懂。因此翻譯在這里學(xué)習(xí),感興趣的朋友快來(lái)看看吧2022-03-03
Python二次規(guī)劃和線性規(guī)劃使用實(shí)例
這篇文章主要介紹了Python二次規(guī)劃和線性規(guī)劃使用實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12

