從0到1完成appium+pytest+allure框架-加入log


斷言已經完成了,那么接下來我們就需要加入日志了

斷言可以記錄結果,判斷case運行的成功或者失敗,那么日志的作用就是記錄每一步的操作,可以更清晰的看到是在哪一步產生的錯誤,更有利於我們在出現問題的時候定位問題。

而且有了這個日志之后,是會加到后面的測試報告中的。

日志我們就需要好好的了解一下logging這塊兒了

logger:提供日志接口,供應用代碼使用。logger最長用的操作有兩類:配置和發送日志消息。可以通過logging.getLogger(name)獲取logger對象,如果不指定name則返回root對象,多次使用相同的name調用getLogger方法返回同一個logger對象。 handler:將日志記錄(log record)發送到合適的目的地(destination),比如文件,socket等。一個logger對象可以通過addHandler方法添加0到多個handler,每個handler又可以定義不同日志級別,以實現日志分級過濾顯示。 filter:提供一種優雅的方式決定一個日志記錄是否發送到handler。 formatter:指定日志記錄輸出的具體格式。formatter的構造方法需要兩個參數:消息的格式字符串和日期字符串,這兩個參數都是可選的。與log4j類似,logger,handler和日志消息的調用可以有具體的日志級別(Level),只有在日志消息的級別大於logger和handler的級別。
害,這是我百度的,具體啥意思我也不知道,給你們看看代碼吧,我現在也只是自己邊學邊寫的
# 獲取日志
import logging


class Demo_Log:
def __init__(self):
# 創建日志器
self.logger = logging.getLogger(__name__)
# 設置日志級別
self.logger.setLevel(logging.INFO)
# 創建控制台處理器,代碼運行時能夠在控制台輸出日志
t = logging.StreamHandler()
# 創建文本處理器,代碼運行時將日志寫入自己設置的文件,如果沒有該文件會創建該文件
f = logging.FileHandler('../Log/log.txt', encoding='utf-8')
# 創建格式器,設置輸出的日志的格式
format = logging.Formatter(
'%(asctime)s %(filename)s %(module)s %(funcName)s %(lineno)d %(levelname)s %(message)s')
t.setFormatter(format)
f.setFormatter(format)
self.logger.addHandler(t)
self.logger.addHandler(f)
# 清空日志內容
with open('../Log/log.txt', 'w') as file:
file.truncate()

def get_log(self):
這是固定格式,划重點,除了設置日志級別,變量,文件,寫法是固定的。
代碼我都有備注就不一一解釋了,這里挑幾個點說一下
1、日志級別
 
DEBUG     詳細信息,只有診斷問題時才需要,就是一般的調試信息
  INFO      當程序運行時期望的一些信息
  WARNING 軟件運行正常,但是可能會有一些預期之外的事件發生
  ERROR 由於一些嚴重問題導致軟件一些功能出現問題
  CRITICAL 很嚴重的錯誤直接導致軟件不能繼續運行

默認的級別時WARNING,意味默認的級別下,顯示的日志信息必須時>=WARNING的級別才會進行處理,這里我們通常都是使用的info,debug一般只有在報錯的時候才會使用,就比如你不確定那里是不是正常的,可以試着try一下,把日志級別設置成debug

  2、格式器的常用參數

  %(acstime)s 時間
  %(filename)s 日志文件名
  %(funcName)s 調用日志的函數名
  %(levelname)s 日志的級別
  %(module)s 調用日志的模塊名
  %(message)s 日志信息
  %(name)s logger的name,不寫的話默認是root

還有一些其他的,用到的話可以參考官方文檔

  3、清空日志

    上面寫的清空日志的兩行代碼,固定的,文件路徑和文件名可以改,但是寫法不能改,file.truncate()的作用是,每次開始記錄日志的時候,清空上一次的日志信息。

日志模塊了解完之后,就是在代碼中加入我們的日志

import yaml
from practice.Find_Element.Login_Element import UserLoginElement
from practice.Log.Demo_log import DemoLog
from selenium.webdriver.common.by import By



class Login(UserLoginElement):
# 登錄

def get_login(self):
with open('../desired_caps.yaml', 'r', encoding='utf-8') as f:
dl = yaml.load(f, Loader=yaml.FullLoader)
mobile = dl['mobile']
password = dl['password']
log = TanBaoLog().get_log()
log.info('定位**元素,點擊同意')
self.get_service_agreement().click()
log.info('定位**元素,點擊同意')
self.get_personal_center().click()
log.info('定位手機號輸入框,輸入手機號')
self.get_input_mobile().send_keys(mobile)
log.info('定位密碼輸入框,輸入密碼')
self.get_input_password().send_keys(password)
log.info('定位**元素,點擊同意')
self.get_privacy_agreement().click()
log.info('定位登錄按鈕,點擊登錄')
self.get_login_value().click()
el = self.driver.find_element(By.ID, '')
assert '**' in el.text, '未登錄'
這里要注意,需要輸出日志就一定要引用我們已經寫好的獲取日志的方法,獲取日志器之后,在你需要輸出日志的操作的上一行寫入log.info(''),這樣就會輸出你所想要的日志了
運行一下看看結果
控制台日志

 

  寫入文件的日志

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM