python自動(dòng)化測試通過日志3分鐘定位bug
一、簡單使用
入門小案例
import logging
logging.basicConfig(level=logging.DEBUG, #設(shè)置級別,根據(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ù)不同情況設(shè)置了五種日志等級,不同情況輸出不同等級的日志。

日志器設(shè)置的級別會(huì)過濾掉低于這個(gè)級別的日志
import logging
logging.basicConfig(level=logging.WARNING, #設(shè)置級別,根據(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ī)則
日志的輸出格式可以通過下面格式自由組合輸出

常用格式:%(asctime)s-[%(filename)s–>line:%(lineno)d]-%(levelname)s:% (message)s
import logging
logging.basicConfig(level=logging.DEBUG, #設(shè)置級別,根據(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
日志寫到文件
只需要配置 filename 參數(shù)即可
import logging
logging.basicConfig(
level=logging.WARNING, #設(shè)置級別,根據(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)。
二、高級用法
簡單的代碼通過 logging 直接使用即可,如果要深入使用需要按照面向?qū)ο蟮姆绞绞褂?logging。
日志組件
logging 模塊包含一下幾個(gè)組件。

步驟
1 創(chuàng)建日志記錄器
import logging
# 第一步創(chuàng)建一個(gè)logger,用來產(chǎn)生日志
logger = logging.getLogger('%s_log' % __name__)
logger.setLevel(logging.DEBUG) # 設(shè)置日志等級
通過 getLogger 這個(gè)方法可以創(chuàng)建一個(gè)日志記錄器,注意要給名字否則返回根日志記錄器。
通過 setLevel 設(shè)置日志記錄器的等級。
2 創(chuàng)建日志處理器
# 創(chuàng)建一個(gè)文本處理器用來將日志寫入到文件 file_handler = logging.FileHandler(filename='py34.log',encoding='utf-8')
file_handler.setLevel('WARNING') # 設(shè)置處理器的日志等級
# 創(chuàng)建一個(gè)控制臺(tái)處理器用來將日志輸出到控制臺(tái)
console_handler = logging.StreamHandler()
console_handler.setLevel('INFO') # 設(shè)置控制臺(tái)處理器的日志等級
日志處理器就是將日志發(fā)送到指定的位置
FileHandler 將日志發(fā)送到文件
StreaHandler 將它可將日志記錄輸出發(fā)送到數(shù)據(jù)流例如 sys.stdout, sys.stderr 或任何文件類對象默認(rèn)sys.stdout 即控制臺(tái)。
RotatingFileHandler 支持根據(jù)日志文件大小進(jìn)行輪轉(zhuǎn)
TimedRotatingFileHandler 支持根據(jù)時(shí)間進(jìn)行輪轉(zhuǎ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)建過濾器
過濾器用來過濾指定日志。具體使用略,一般用不到。
詳情見官方文檔
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)
# 文件處理器的等級一般情況一定比控制臺(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è)日志器對象,當(dāng)多次調(diào)用日志器生成函數(shù),且日志器名稱相同時(shí),會(huì)給同一個(gè)日志器添加多個(gè)日志處理器,從而出現(xiàn)重復(fù)記錄日志器的問題。
為了解決上面的問題,在 common 文件夾下創(chuàng)建一個(gè)名為 init.py 的文件,在 common 模塊被導(dǎo)入時(shí)會(huì)自動(dòng)執(zhí)行這個(gè)文件里的代碼,且只會(huì)執(zhí)行一次。
在 init.py 文件編寫如下代碼:
from .log_handler import get_logger
logger = get_logger('py41', 'py38.log')
那么在項(xiàng)目中的其他模塊中就可以通過如下代碼導(dǎo)入
from common import logger
從而可以保證在項(xiàng)目執(zhí)行過程中,get_logger 方法只會(huì)執(zhí)行一遍。
記錄日志
日志的作用是記錄程序的運(yùn)行狀態(tài)和當(dāng)程序出現(xiàn)問題時(shí)能提供定位分析錯(cuò)誤的依據(jù)。
什么時(shí)候需要記錄日志,記錄什么日志,根據(jù)每個(gè)人對程序的理解,以及經(jīng)驗(yàn)。
我們的項(xiàng)目中,在用例執(zhí)行的過程是核心,所以我們的日志也是圍繞著用例的執(zhí)行。
使用日志記錄每個(gè)用例的測試數(shù)據(jù),和測試結(jié)果,代碼如下:
...
@list_data(*cases)
def test_login(self, case):
"""
登陸測試
"""
logger.info('測試用例【{}】開始測試'.format(case['title']))
# 1. 測試數(shù)據(jù)
# 傳入進(jìn)來的case參數(shù)
logger.info('測試用例【{}】的測試數(shù)據(jù)是:{}'.format(case['title'], case))
# 2. 測試步驟
res = login_check(case['username'], case['password'])
logger.info('測試用例【{}】的測試結(jié)果是:{}'.format(case['title'], res))
# 3. 斷言
try:
self.assertEqual(res, case['expect'])
except AssertionError as e:
logger.error('測試用例【{}】斷言失敗'.format(case['title']))
raise e
else:
logger.info('測試用例【{}】斷言成功'.format(case['title']))
finally:
logger.info('測試用例【{}】測試結(jié)束')
以上就是python自動(dòng)化測試通過日志3分鐘定位bug的詳細(xì)內(nèi)容,更多關(guān)于日志定位bug的資料請關(guān)注腳本之家其它相關(guān)文章!
- python自動(dòng)化測試工具Helium使用示例
- Python?pytest自動(dòng)化測試庫十個(gè)強(qiáng)大用法示例
- python自動(dòng)化測試Data?Driven?Testing(DDT)用例解析
- Python UI自動(dòng)化測試Web frame及多窗口切換
- python自動(dòng)化測試中APScheduler?Flask的應(yīng)用示例
- python自動(dòng)化測試用例全對偶組合與全覆蓋組合比較
- python自動(dòng)化測試selenium屏幕截圖示例
- python自動(dòng)化測試selenium定位frame及iframe示例
- python?Helium自動(dòng)化庫的功能特性探索
相關(guān)文章
解決Python requests 報(bào)錯(cuò)方法集錦
這篇文章主要介紹了解決Python requests 報(bào)錯(cuò)方法集錦的相關(guān)資料,需要的朋友可以參考下2017-03-03
使用Python高效獲取網(wǎng)絡(luò)數(shù)據(jù)的操作指南
網(wǎng)絡(luò)爬蟲是一種自動(dòng)化程序,用于訪問和提取網(wǎng)站上的數(shù)據(jù),Python是進(jìn)行網(wǎng)絡(luò)爬蟲開發(fā)的理想語言,擁有豐富的庫和工具,使得編寫和維護(hù)爬蟲變得簡單高效,本文將詳細(xì)介紹如何使用Python進(jìn)行網(wǎng)絡(luò)爬蟲開發(fā),包括基本概念、常用庫、數(shù)據(jù)提取方法、反爬措施應(yīng)對以及實(shí)際案例2025-03-03
Python如何實(shí)現(xiàn)讀取csv文件時(shí)忽略文件的編碼格式
我們再日常讀取csv文件的時(shí)候經(jīng)常會(huì)發(fā)現(xiàn)csv文件的格式有多種,所以這篇文章為大家介紹了Python如何實(shí)現(xiàn)讀取csv文件時(shí)忽略文件的編碼格式吧2025-03-03
Python報(bào)錯(cuò)之如何解決matplotlib繪圖中文顯示成框框問題
這篇文章主要介紹了Python報(bào)錯(cuò)之如何解決matplotlib繪圖中文顯示成框框問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
Python + selenium + crontab實(shí)現(xiàn)每日定時(shí)自動(dòng)打卡功能
這篇文章主要介紹了Python + selenium + crontab實(shí)現(xiàn)每日定時(shí)自動(dòng)打卡功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)找到最大或最小的N個(gè)元素實(shí)現(xiàn)方法示例
這篇文章主要介紹了Python找到最大或最小的N個(gè)元素實(shí)現(xiàn)方法,涉及Python基于heapq模塊進(jìn)行集合運(yùn)算的相關(guān)操作技巧,需要的朋友可以參考下2018-02-02
Python unittest 簡單實(shí)現(xiàn)參數(shù)化的方法
今天小編就為大家分享一篇Python unittest 簡單實(shí)現(xiàn)參數(shù)化的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11

