最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python自動(dòng)化測(cè)試之異常及日志操作實(shí)例分析

 更新時(shí)間:2019年11月09日 08:09:00   作者:Secret608  
這篇文章主要介紹了python自動(dòng)化測(cè)試之異常及日志操作,結(jié)合實(shí)例形式分析了python自動(dòng)化測(cè)試中的異常捕獲與日志記錄相關(guān)操作技巧,需要的朋友可以參考下

本文實(shí)例講述了python自動(dòng)化測(cè)試之異常及日志操作。分享給大家供大家參考,具體如下:

  為了保持自動(dòng)化測(cè)試用例的健壯性,異常的捕獲及處理,日志的記錄對(duì)掌握自動(dòng)化測(cè)試執(zhí)行情況尤為重要,這里便詳細(xì)的介紹下在自動(dòng)化測(cè)試中使用到的異常及日志,并介紹其詳細(xì)的用法。

  一、日志

    打印日志是很多程序的重要需求,良好的日志輸出可以幫我們更方便的檢測(cè)程序運(yùn)行狀態(tài)。Python標(biāo)準(zhǔn)庫(kù)提供了logging模塊,切記Logger從來(lái)不直接實(shí)例化,其好處不言而喻,接下來(lái)慢慢講解Logging模塊提供了兩種記錄日志的方式。

  1. logging之模塊級(jí)別的函數(shù)方式記錄日志
import logging
#設(shè)置日志,包括filename、level、format、filemode、stream,其中format屬性極其豐富,詳情可查看API文檔,這里只做簡(jiǎn)要介紹
logging.basicConfig(level = logging.INFO,
  format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
  datefmt = "%Y/%m%d %H%M%S",
  filename = "log.txt")
#消息級(jí)別,五級(jí)
logging.debug("芹澤多摩雄") 
logging.info("真")
logging.warning("男")
logging.error("人")
logging.critical("!")

  1.   logging之日志系統(tǒng)的四大組件(日志器、處理器、過(guò)濾器、格式器)方式記錄日志
import logging
# 生成日志實(shí)例,日志器
logger = logging.getLogger(__name__)
#基本單元的配置(LEVER)
logger.setLevel(level = logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
#生成管道分支,處理器
handler_1 = logging.FileHandler("log.txt")
handler_2 = logging.StreamHandler()
#自定義格式,格式器
handler_1.setFormater(formatter, “%Y-%m-%d %H:%M:%S”)
handler_2.setFormater(formatter, “%Y-%m-%d %H:%M:%S”)
#對(duì)接分支管道與源頭,處理器
logger.addHandler(handler_1)
logger.addHandler(handler_2)
#層級(jí)結(jié)構(gòu),logger的名稱是一個(gè)以'.'分割的層級(jí)結(jié)構(gòu),每個(gè)'.'后面的logger都是'.'前面的logger的children,通常配合過(guò)濾器一起使用
#過(guò)濾器
#。。。。保留
#開(kāi)始記錄
logger.debug("芹澤多摩雄") 
logger.info("真")
logger.warning("男")
logger.error("人")
logger.critical("!")

  1. 細(xì)心的盆友又可以發(fā)現(xiàn),可以發(fā)現(xiàn),logging有一個(gè)日志處理的主對(duì)象,其他處理方式都是通過(guò)addHandler添加進(jìn)去,這里采用logging.StreamHandler實(shí)現(xiàn)日志輸出到流(控制臺(tái)),也可以用FileHandler實(shí)現(xiàn)日志輸出到文件
  2. 日志回滾
import logging
from logging.handlers import RotatingFileHandler
logger = logging.getLogger(__name__)
logger.setLevel(level = logging.INFO)
#定義一個(gè)RotatingFileHandler,最多備份3個(gè)日志文件,每個(gè)日志文件最大1K
rHandler = RotatingFileHandler("log.txt",maxBytes = 1*1024,backupCount = 3)
rHandler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
rHandler.setFormatter(formatter)
console = logging.StreamHandler()
console.setLevel(logging.INFO)
console.setFormatter(formatter)
logger.addHandler(rHandler)
logger.addHandler(console)
logger.debug("芹澤多摩雄") 
logger.info("真")
logger.warning("男")
logger.error("人")
logger.critical("!")

  1. 多模塊使用
#主模塊
import logging
import subModule
logger = logging.getLogger("mainModule")
logger.setLevel(level = logging.INFO)
handler = logging.FileHandler("log.txt")
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
console = logging.StreamHandler()
console.setLevel(logging.INFO)
console.setFormatter(formatter)
logger.addHandler(handler)
logger.addHandler(console)
#子模塊
import logging
module_logger = logging.getLogger("mainModule.sub")
class SubModuleClass(object):
  def __init__(self):
    self.logger = logging.getLogger("mainModule.sub.module")

細(xì)心的盆友會(huì)再次發(fā)現(xiàn)其實(shí)對(duì)logger的命名很重要,首先在主模塊定義了logger'mainModule',并對(duì)它進(jìn)行了配置,子模塊可以共享父logger的定義和配置,所謂的父子logger是通過(guò)命名來(lái)識(shí)別,任意以'mainModule'開(kāi)頭的logger都是它的子logger,例如'mainModule.sub'

  1. 事實(shí)上,縱使有繼承配置或者自定義的配置日志功能,但實(shí)際中的大項(xiàng)目中還是略麻煩的,這里主要用到JSON或者yaml進(jìn)行配置封裝,這樣加載該文件即可加載日志的配置,下回分解具體操作,最后來(lái)一發(fā)實(shí)例。
# -*- coding: utf-8 -*-
__author__ = 'Secret608'
import logging
import time
import os
import re
class Log(object):
  def __init__(self, loggerName):
      '''
      進(jìn)行日志初始化,包括存儲(chǔ)路徑、名稱、級(jí)別、調(diào)用文件等
      '''
      #基本屬性
      self.logger = logging.getLogger(loggerName)
      self.logger.setLevel(logging.WARNING)
      #特有屬性(文件地址+日志記錄格式)
      rq = time.strftime('%Y%m%d_%H%M%S', time.localtime(time.time()))
      log_path = os.path.join(os.path.dirname(os.getcwd()), 'logs')
      log_title = os.path.join(log_path, loggerName + '_'+ rq) + ".log"
      formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
      log = logging.FileHandler(log_title)
      log.setFormatter(formatter)
      #加到基本屬性中,得到一個(gè)完整的初始化對(duì)象
      self.logger.addHandler(log)
  def getLog(self):
    return self.logger
  def delLog(self, fileName):
    log_path = os.path.join(os.path.dirname(os.getcwd()), 'logs')
    regexp = re.compile('^'+fileName+'s.*')
    filelist = os.listdir(log_path)
    try:
      [os.remove(os.path.join(log_path, i)) for i in filelist if regexp.match(i) == None]
    except WindowsError:
      pass
    else:
      return "ok"
if __name__ == "__main__":
  a = Log("hah")
  a.delLog("hah")

  二、異常

  • 異常類型
    • 內(nèi)置異常:Python的異常處理能力是很強(qiáng)大的,它有很多內(nèi)置異常,可向用戶準(zhǔn)確反饋出錯(cuò)信息。在Python中,異常也是對(duì)象,可對(duì)它進(jìn)行操作。BaseException是所有內(nèi)置異常的基類,但用戶定義的類并不直接繼承BaseException,所有的異常類都是從Exception繼承,且都在exceptions模塊中定義。
    • 自定義異常:可以通過(guò)創(chuàng)建一個(gè)新的異常類擁有自己的異常,異常應(yīng)該是通過(guò)直接或間接的方式繼承自Exception類。比如創(chuàng)建了一個(gè)MyError類,基類為Exception,用于在異常觸發(fā)時(shí)輸出更多的信息。
  • 異常捕獲
    • 發(fā)生異常時(shí),我們就需要對(duì)異常進(jìn)行捕獲,然后進(jìn)行相應(yīng)的處理。python的異常捕獲常用try...except...結(jié)構(gòu),把可能發(fā)生錯(cuò)誤的語(yǔ)句放在try模塊里,用except來(lái)處理異常,每一個(gè)try,都必須至少對(duì)應(yīng)一個(gè)except。此外,與python異常相關(guān)的關(guān)鍵字主要有:try/except、pass、as(定義異常實(shí)例)、else、finally、raise。
    • 捕獲所有異常:
# -*- coding: utf-8 -*-
#異常處理的語(yǔ)法:
try:
  #執(zhí)行可能出現(xiàn)異常的語(yǔ)句
except '異常名字':
  #出現(xiàn)異常執(zhí)行的語(yǔ)句
else:
  #執(zhí)行沒(méi)有出現(xiàn)異常的語(yǔ)句
finally:
  #異常與否都執(zhí)行的語(yǔ)句
#demo
try:
  a = 0
  b = 1
  c = b/a
  print(c)
except ZeroDivisionError:
  print("分母不能為0")
except NameError:
  print("名稱錯(cuò)誤")
except (ZeroDivisionError, NameError):
  print("你的分母等于0或者變量名不存在")
except Exception as e:
  print("你的變量名或者分母值確實(shí)沒(méi)錯(cuò),但是出現(xiàn)了其他的錯(cuò)誤,詳見(jiàn)%s" %e)
  d = 1  
finally:
  print("聽(tīng)說(shuō)沒(méi)有錯(cuò)誤?不能忍,反正我要讓你難受!")
  if d == 1:
    raise ValueError("你有其它錯(cuò)誤")
  else:
    raise FuckError("開(kāi)不開(kāi)心?")
  #咦? FuckError是啥?貌似沒(méi)有定義啊,這里定義一波,屆時(shí)位置移動(dòng)到前面去
  class FuckError(Exception):
    def __int__(self,*args,**keargs):
      super(FuckError,self).__int__(*args,**keargs)#python2
      self.args = args
      print(args)  

更多的異常可參看API(https://docs.python.org/3/library/exceptions.html#base-classes

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python日志操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門(mén)與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Python實(shí)現(xiàn)設(shè)計(jì)模式之單例模式詳解

    Python實(shí)現(xiàn)設(shè)計(jì)模式之單例模式詳解

    這篇文章主要介紹了Python實(shí)現(xiàn)設(shè)計(jì)模式之單例模式詳解,設(shè)計(jì)模式是指軟件設(shè)計(jì)問(wèn)題的推薦方案,設(shè)計(jì)模式一般是描述如何組織代碼和使用最佳實(shí)踐來(lái)解決常見(jiàn)的設(shè)計(jì)問(wèn)題,需謹(jǐn)記一點(diǎn):設(shè)計(jì)模式是高層次的方案,并不關(guān)注具體的實(shí)現(xiàn)細(xì)節(jié),比如算法和數(shù)據(jù)結(jié)構(gòu),需要的朋友可以參考下
    2023-09-09
  • 詳解四種Python中基本形態(tài)學(xué)濾波的實(shí)現(xiàn)

    詳解四種Python中基本形態(tài)學(xué)濾波的實(shí)現(xiàn)

    最基礎(chǔ)的形態(tài)學(xué)操作有四個(gè),分別是腐蝕、膨脹、開(kāi)計(jì)算和閉計(jì)算。這篇文章主要介紹了這四種形態(tài)學(xué)濾波的實(shí)現(xiàn),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-04-04
  • 用Python爬取各大高校并可視化幫弟弟選大學(xué),弟弟直呼牛X

    用Python爬取各大高校并可視化幫弟弟選大學(xué),弟弟直呼牛X

    高考結(jié)束了,接下來(lái)最重要的就是玩玩玩,然后準(zhǔn)備報(bào)志愿吧.中國(guó)教育在線網(wǎng)顯示國(guó)內(nèi)目前共有2857所高等院校,報(bào)一個(gè)理想的學(xué)校簡(jiǎn)直是千里挑一.正好表弟求著我讓我?guī)退x學(xué)校,我想著十年寒窗苦讀也不容易不如就用python幫幫他.分析一下目前國(guó)內(nèi)的大學(xué),需要的朋友可以參考下
    2021-06-06
  • python實(shí)現(xiàn)dbscan算法

    python實(shí)現(xiàn)dbscan算法

    DBSCAN 算法是一種基于密度的空間聚類算法,本文主要介紹了python實(shí)現(xiàn)dbscan算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Python3中的map函數(shù)調(diào)用后內(nèi)存釋放問(wèn)題

    Python3中的map函數(shù)調(diào)用后內(nèi)存釋放問(wèn)題

    這篇文章主要介紹了Python3中的map函數(shù)調(diào)用后內(nèi)存釋放問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python數(shù)字圖像處理之圖像自動(dòng)閾值分割示例

    python數(shù)字圖像處理之圖像自動(dòng)閾值分割示例

    這篇文章主要為大家介紹了python數(shù)字圖像處理之圖像自動(dòng)閾值分割示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 通過(guò)Python 獲取Android設(shè)備信息的輕量級(jí)框架

    通過(guò)Python 獲取Android設(shè)備信息的輕量級(jí)框架

    今天跟大家分享一下,如何通過(guò)Python實(shí)現(xiàn)一個(gè)輕量級(jí)的庫(kù)來(lái)獲取電腦上連接的Android設(shè)備信息,需要的朋友參考下吧
    2017-12-12
  • Python實(shí)現(xiàn)簡(jiǎn)易凱撒密碼的示例代碼

    Python實(shí)現(xiàn)簡(jiǎn)易凱撒密碼的示例代碼

    密碼的使用最早可以追溯到古羅馬時(shí)期,《高盧戰(zhàn)記》有描述愷撒曾經(jīng)使用密碼來(lái)傳遞信息,即所謂的“愷撒密碼”。本文將利用Python實(shí)現(xiàn)簡(jiǎn)易的凱撒密碼,感興趣的可以了解一下
    2022-09-09
  • Python實(shí)現(xiàn)的矩陣類實(shí)例

    Python實(shí)現(xiàn)的矩陣類實(shí)例

    這篇文章主要介紹了Python實(shí)現(xiàn)的矩陣類,結(jié)合完整實(shí)例形式分析了Python矩陣的定義、計(jì)算、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • 在Python中使用__slots__方法的詳細(xì)教程

    在Python中使用__slots__方法的詳細(xì)教程

    這篇文章主要介紹了在Python中使用__slots__方法的詳細(xì)教程,__slots__方法是Python的一個(gè)重要內(nèi)置類方法,代碼基于Python2.x版本,需要的朋友可以參考下
    2015-04-04

最新評(píng)論

双峰县| 连云港市| 安泽县| 清丰县| 莱阳市| 昌江| 田阳县| 阿巴嘎旗| 屯门区| 天峻县| 武安市| 福鼎市| 阆中市| 浏阳市| 西吉县| 通山县| 六枝特区| 永定县| 视频| 滨州市| 佛教| 德昌县| 贺州市| 凤阳县| 安徽省| 磴口县| 宁远县| 岗巴县| 田阳县| 三都| 华宁县| 淮北市| 五家渠市| 乌海市| 木兰县| 广元市| 高碑店市| 永定县| 龙泉市| 翁牛特旗| 夏邑县|