<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] ## 一、日志 ``` 1.1 什么是日志 說明:記錄系統運行程序一些步驟,對一個事件(點擊事件)也稱為日志(Log) 1.2 特點 1.調試程序 2.定位跟蹤bug 3.根據日志,查看系統運行是否出錯 4.分析用戶行為,與數據統計 1.3 級別 1.debug調 # 調試級別 2.info # 信息級別 3.warning # 警告 4.error # 錯誤級別 5.critica1 # 嚴重 提示: 1.開發常用以上 debug、info、warning、error 2.測試常用級別:info、error 1.4 Logging基本使用 步驟: 1. 導包 如: import 1ogging 2. 調用相應的級別方法,記錄日志信息 1ogging.debug("debug...") 設置級別: logging.basicconfig(level=logging.DEBUG) 提示: 1. 默認級別為:1ogging.WARNING 2. 設置級別時調用的是1ogging文件夾下面的常量,而不是調用的小寫方法; 3. 切記:設置級別以后,日志信息只會記錄大于等于此級別的信息; ``` 實例: <details> <summary>test01_logging01.py</summary> ``` import logging # 設置日志級別 logging.basicConfig(level=logging.DEBUG) # 調用 指定級別,輸入日志信息 logging.debug("this is a debug...") logging.info("this is a info...") logging.warning("this is a warning...") logging.error("this is a error...") logging.critical("this is a critical") ``` </details> <br /> <details> <summary>test02_logging02.py</summary> ``` import logging # 設置日志級別 # logging.basicConfig(level=logging.DEBUG) # 設置修改morning的輸入日志格式 fm = "%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d] - %(message)s" # 設置日志保存到指定文件中 logging.basicConfig(level=logging.DEBUG, format=fm, filename="../log/log01.log") # 調用 指定級別,輸入日志信息 logging.debug("this is a debug...") logging.info("this is a info...") logging.warning("this is a warning...") logging.error("this is a error...") logging.critical("this is a critical") ``` </details> <br /> ``` 1.5 1ogging 高級用法 1).為什么要使用高階用法??? 1.中文亂碼 2.無法同時輸入到文件和控制臺 2).1ogging組成 1. Logger 日志器 2. handler 處理器 3. formatter 格式器 4. fi1ter 過濾器 3).模塊關系 日志器:提供了,記錄日志的入口,如:1og.info("") 處理器:真正將日志器內容發送到控制臺還是文件或網絡,都是處理器干的;每個日志器都可以添加多個不同的處理器; 格式器:處理器可以設置不同的格式,就需要使用格式器; 過濾器:處理器需要過濾日志信息;就需要設置過濾器; ``` 實例: <details> <summary>test03_logger.py</summary> ``` import logging ''' 目標:logging底層 模塊實現 1.logger ''' # 獲取logger logger = logging.getLogger() # 設置級別 logger.setLevel(logging.INFO) # 獲取控制臺 處理器 sh = logging.StreamHandler() # 將處理器添加到 logger logger.addHandler(sh) # 輸入信息 logger.info("info") logger.debug("debug") ``` </details> <br /> <details> <summary>test04_TimeRotatingFileHandler.py</summary> ``` ''' 目標:logging底層 模塊實現 1.logger ''' # 注意:以后導logging包,不再使用此方式 # import logging # 導包時 導入import logging.handlers 推薦 # 原因:logging是包名,導入包名時會自動執行下面的 __init__文件,所以這樣導入,相當于導入 logging # handlers是模塊名 import logging.handlers from time import sleep # 獲取logger logger = logging.getLogger("admin") # 設置級別 logger.setLevel(logging.INFO) # 獲取控制臺 處理器 sh = logging.StreamHandler() # 到文件 根據時間切割 th = logging.handlers.TimedRotatingFileHandler(filename="../log/logtime.log", when="M", interval=1, backupCount=3) # 添加格式器 fmt = "%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d)] - %(message)s" fm = logging.Formatter(fmt) # 設置 處理器 級別 擴展 設置未error級別,那么只有error級別信息才會寫入文件 th.setLevel(logging.ERROR) # 將格式器 添加到處理器中 sh.setFormatter(fm) th.setFormatter(fm) # 將控制臺處理器添加到 logger logger.addHandler(sh) logger.addHandler(th) # while True: # sleep(1) # # 輸入信息 # logger.info("info") # logger.debug("debug") logger.info("info") logger.debug("debug") logging.warning("warning") ``` </details> <br /> ``` 日志封裝: # 定義獲取日之類 # 定義類屬性 1ogger = None @classemethod # 定義獲取1ogger日志器的類方法 if c1s.1ogger is None: # 判斷類屬性1ogger是否還是為空,如果為空,就執行以下操作 # 獲取日志器對象 # 設置日志器級別 # 獲取控制臺處理器 # 獲取文件處理器 # 獲取格式器 # 將格式器添加到處理器中 # 將處理器添加到日志器中 return 類屬性1ogger 注意: 1.以上條件無論是否成立,最后都會返回類屬性1ogger; 2.當第一次調用時,條件一定成立,將類屬性1ogge設置不為空; 3.當第二次以上調用時,永遠返回第一次設置的類屬性對象。 ``` 實例: <details> <summary> test05_logger.py</summary> ``` # 日志封裝 import logging.handlers class GetLogger: logger = None @classmethod def get_logger(cls): if cls.logger is None: # 獲取 日志器 cls.logger = logging.getLogger("admin") # 設置級別 cls.logger.setLevel(logging.INFO) # 獲取控制臺 處理器 sh = logging.StreamHandler() # 到文件 根據時間切割 th = logging.handlers.TimedRotatingFileHandler(filename="../log/logtime.log", when="M", interval=1, backupCount=3, encoding="utf-8") # 設置格式器 fmt = "%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d)] - %(message)s" fm = logging.Formatter(fmt) # 將格式器添加到 處理器 控制臺 sh.setFormatter(fm) # 將格式器 添加到 處理器文 th.setFormatter(fm) # 將控制臺處理器添加到 logger cls.logger.addHandler(sh) cls.logger.addHandler(th) return cls.logger if __name__ == '__main__': logger = GetLogger().get_logger() logger.info("info信息被執行") logger.debug("debug信息被執行") ``` </details> <br /> ## 二、項目 ``` 2.1自動化測試流程 1.將功能用例轉化自動化用例(在功能用例模板新增一列是否自動化) 2.搭建自動化測試環境(本機依賴的環境: python、 pycharm、瀏覽器、瀏覽器驅動、se1enium、 parameterized 3.搭建自動化框架(po模式+數據驅動+1og+報告) 4.編寫代碼 5.執行用例 6.生成報告\分析1og 2.2自動化涉及的模塊 1.登錄 2.購物車 3.訂單 4.支付 2.3自動化測試結構 1.base(基類) 2.page(頁面對象) 3.scripts(業務腳本) 4.too1(工具類) 5.data(存儲測試數據文件) 6.1og(日志) 7.image(失敗截圖) 8.report(測試報告) 2.4 base公共方法封裝實現 # 查找元素方法 # 點擊元素方法 # 輸入元素方法 # 獲取元素文本方法 # 截圖方法 # 判斷元素是否存在方法封 2.5 登錄分析 0. 正確用戶名+正確密碼+正確驗證碼 預期:登錄成功并跳轉到個人主頁 1. 用戶名為空+正確密碼+正確驗證碼 預期:用戶名不能空 2. 正確用戶名+空密碼+正確驗證碼 預期:密碼不能為空! 3. 正確用戶名+正確密碼+空驗證碼 預期:驗證碼不能為空 4. 用戶名不存在+正確密碼+正確驗證碼 預期:賬號不存在 5. 用戶名格式不正確+正確密碼+正確驗證碼 預期:賬號格式不匹配! 6. 正確用戶名+錯誤密碼+正確驗證碼 預期:密碼錯誤! 7. 正確用戶名+正確密碼+錯誤驗證碼 預期:驗證碼錯誤! ``` ![DC57998D-AD59-468B-930F-EBFD833B4DC8.jpg](https://i.loli.net/2021/01/31/BJfvrcOH89sQtED.jpg) <details> <summary>base/base.py</summary> ``` from selenium.webdriver.support.wait import WebDriverWait import time class Base: def __init__(self, driver): self.driver = driver # 查找元素方法 封裝 def base_find(self, loc, timeout=30, poll=0.5): # 使用顯示等待 查找元素 WebDriverWait(self.driver, timeout=timeout, poll_frequency=poll).\ until(lambda x:x.find_element(*loc)) # 點擊元素 方法封裝 def base_click(self, loc): self.base_click(loc).click() # 輸入元素 方法封裝 def base_input(self, loc, value): # 獲取元素 el = self.base_find(loc) el.clear() el.send_keys(value) # 獲取文本信息 方法封裝 def base_get_text(self, loc): return self.base_find(loc).text # 截圖 方法封裝 def base_get_image(self): self.driver.get_screenshot_as_file("../image{}.png". format(time.strftime("%Y_%m_%d %H_%M_%S"))) # 判斷元素是否存在 方法封裝 def base_element_is_exist(self, loc): try: self.base_find(loc, timeout=2) return True # 代表元素存在 except: return False # 代表元素不存在 ``` </details> <br />
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看