<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      自動化測試實戰技巧:「用例失敗重試機制」實現方案分享

      1. 背景說明

      在開展自動化測試工作時,經常會由于一些外在原因(如網絡中斷、返回超時)導致自動化測試用例運行失敗,而這些失敗并不是用例本身驗證或被測程序存在Bug而引起的,更可氣的是這些失敗場景有可能還是偶發的,為了保證測試用例運行的穩定性驗證有效性,我們需要一種針對失敗用例重試的運行機制。

      今天給大家分享的主題:自動化測試工作中,用例腳本失敗重試機制的實現方式。

      結合自動化測試框架來講,用例運行失敗重試機制,通常有三種形式來實現:

      • 借助依賴框架自身是否有用例失敗重試運行機制。

      • 從用例腳本自身邏輯處入手,實現失敗運行重試。(適用于被特殊處理過的用例邏輯)

      • 從擴展框架源碼,自定義失敗重試運行機制。(通常適合于所有失敗用例)

      接下來,我們以Robot Framework框架為例,以具體的實戰示例項目介紹如何實現用例失敗重試機制。

      2. 示例項目環境搭建

      為了便于演示,重新創建一套新的虛擬隔離環境,用于搭建Robot Framework框架,操作步驟如下。

      1、創建虛擬環境robotframework_env

      python3 -m venv robotframework_env
      

      2?激活虛擬環境

      cd robotframework_env
      source bin/activate
      
      

      3、在虛擬環境中,安裝robotframework、robotframework-ride庫(安裝最新即可)。

      pip install robotframework
      pip install robotframework-ride
      

      如下圖所示:

      4? 輸入命令:bin ./ride.py啟動RIDE,如下圖所示。

      PS: 其它三方庫演示項目中,暫不需要,讀者可根據實際需求,自行安裝。

      3. 創建實戰示例項目

      1? 創建trainning演示項目,并在項目下,創建失敗重試機制實戰目錄,并依次創建測試套件、測試用例,示例結構如下:

      2? 編寫測試用例,測試用例邏輯如下:

      *** Settings ***
      Library           Collections
      
      *** Test Cases ***
      Class_01_隨機取數,模擬隨機出現失敗場景
          @{list}=    create list    1    2    3
          ${random_num}=    Evaluate    random.choice(${list})    random
          log    ${random_num}
          should be true    ${random_num}==2
      
      • 在測試用例中,先通過create list關鍵字創建了一個名稱為${list}的列表變量,并依次存入1?2?3三個元素。
      • 再通過Evaluate萬能關鍵字,結合random.chocie方法,從${list}列表中隨機取出一個整型元素,保存到名稱為${random_num}變量中。
      • 最后,通過should be true關鍵字,斷言${random_num}變量等于2,由于第二步的隨機取值,會讓${random_num}變量值具有隨機性(可能等于2,也可能是1或3),從而實現模擬一條隨機失敗的用例場景。

      運行成功結果:

      運行失敗結果:

      4. 用例失敗重試機制實現

      Robot Framework 官方并沒有提供類似retry等參數來配置失敗用例重執行。僅僅提供了--rerunfailed參數對基于結果文件output.xml來選擇重新執行失敗的用例。

      4.1 基于RF框架自身的重試機制

      1? 以第3節中新建的示例項目為例,為了便于演示,以命令行來操作,在命令行中輸入執行用例命令,并且將輸出文件保存到original.xml文件中。

      robot --output original.xml .
      

      2? 重新運行測試用例,并將第二次運行的結果文件輸出保存到rerun.xml文件中。

      robot --output rerun.xml --rerunfailed original.xml .
      

      3?合并兩次運行的結果輸出文件。

      rebot --merge original.xml rerun.xml
      

      在Robot Framework中除了有--rerunfailed參數針對失敗的測試用例外,也有針對測試套件的--rerunfailedsuites,參數詳細說明如下:

      -R --rerunfailed output  Select failed tests from an earlier output file to be
                                re-executed. Equivalent to selecting same tests
                                individually using --test option.
      
      ------------------------------------------------
       -S --rerunfailedsuites output  Select failed suite from an earlier output file
                                to be re-executed. New in RF 3.0.1.
      
      
      • -R--rerunfailed參數非常有用,它的作用是從output file中選擇失敗的用例重跑。但是有個問題,如果上一次運行時用例全部成功,此時加上-R參數再去運行用例時會報錯: failed: All tests passed ,這導致我沒辦法在jenkins job中使用這個參數。

      • -S--rerunfailedsuites參數和-R參數的作用類似,它的作用是從output file中選擇失敗的用例套件重跑。

      4.2 基于用例腳本邏輯重試機制

      第二種方法,我們介紹,如何基于用例腳本邏輯特殊改造,實現用例失敗后的重試機制。

      基于用例邏輯增加重試機制,核心實現思路:基于RF內置變量${TEST_STATUS}獲取用例運行結果,再結合Teardown運行改造后的關鍵字邏輯即可。

      操作如下:

      1?對示例1中的Class_01 測試用例進行改造,抽取用例邏輯部分,存放到單獨的關鍵字下,名稱如測試用例關鍵字。

      *** Keywords ***
      測試用例關鍵字
          @{list}=    create list    1    2    2
          ${random_num}=    Evaluate    random.choice(${list})    random
          log    ${random_num}
          should be true    ${random_num}==2
      

      2? 添加關鍵字用例重試機制,增加用例重試機制的處理邏輯:

      *** Keywords ***
      用例重試機制
          [Arguments]    ${times}
          ${status}=    set variable    ${TEST STATUS}
          FOR    ${index}    IN RANGE    ${times}
              log    第${index+1}運行結果: ${status}
              Exit For loop if    '${status}'=='PASS' or '${status}'=='True'
              log    第${index+1}次重試運行
              ${status}=    Run keyword And Return Status    測試用例關鍵字
          END
      

      用例重試機制關鍵字中,先通過${TEST STATUS}內置變量,獲取用例執行結果,并且接收變量${times}用于控制重試次數,如果用例執行狀態等于PASS則直接退出重試,否則調用Run keyword And Return Status關鍵字繼續運行測試用例。

      3?為了便于演示,增加一條名稱為Class_02測試用例,內容如下:

      Class_02_隨機取數,模擬隨機出現失敗場景
          測試用例關鍵字
          [Teardown]    run keyword    用例重試機制    5
      

      到此, 我們已經在用例邏輯層面實現了用例失敗重試機制了。

      PS: 針對用例邏輯層面實現重試機制,也可以采用關鍵字: Wait Until Keyword Succeeds,讀者可根據自身需求進行改造,本文的用例重試機制并不是唯一的方法。

      4.3 基于框架源碼實現重試機制

      除了上述兩種方法,最后一種方法是基于框架層面進行改造,增加全局重試機制,

      通過改寫Robot Framework源代碼增加--retry選項,實現test級別的失敗用例自動再執行,比如用例失敗后,會重新運行N次,直至成功or 耗盡重試次數,生成的日志和報告文件中只會體現最后一次執行的結果。

      類似如下命令格式:

      robot --retry 3 trainning
      

      具體實現:

      1?修改文件 : robotframework_env/lib/python3.7/site-packages/robot/run.py,在USAGE變量里添加retry參數。

       -F --extension value     Parse only files with this extension when executing
                                a directory. Has no effect when running individual
                                files or when using resource files. If more than one
                                extension is needed, separate them with a colon.
                                Examples: `--extension txt`, `--extension robot:txt`
                                New in RF 3.0.1. Starting from RF 3.2 only `*.robot`
                                files are parsed by default.
       -N --name name           Set the name of the top level suite. By default the
                                name is created based on the executed file or
                                directory.
       -H --retry retry     Set the retry times if test failed.
      

      2?在run.py文件,RobotFramework類增加make方法,并在開始之前導入庫from xml.dom import minidom。

      def make(self, outxml):
              xmldoc = minidom.parse(outxml)
              suiteElementList = xmldoc.getElementsByTagName('suite')
              mySuite = []
              for suiteElement in suiteElementList:
                  if suiteElement.childNodes is not None:
                      for element in suiteElement.childNodes:
                          if element.nodeName == 'test':
                              mySuite.append(suiteElement)
                              break
              for suite in mySuite:
                  testElements = {}
                  for element in suite.childNodes:
                      if element.nodeName == 'test':
                          name = element.getAttribute('name')
                          if testElements.get(name) == None:
                              testElements.update({name: [element]})
                          else:
                              testElements.get(name).append(element)
                  for n, el in testElements.items():
                      for i in el[0:-1]:
                          textElement = i.nextSibling
                          suite.removeChild(i)
                          suite.removeChild(textElement)
              savefile = open(outxml, 'w')
              root = xmldoc.documentElement
              root.writexml(savefile)
              savefile.close()
      

      3?RobotFramework類的main方法,加入紅色內容 self.make(settings.output)

      4? 打開robot/conf/setting.py文件,修改_cli_opts字典,增加'Retry': ('retry', 3),,如下所示:

      5?打開robot/model/itemlist.py文件,修改visit方法:

          def visit(self, visitor):
              for item in self:
                  if self.__module__ == 'robot.model.testcase' and hasattr(visitor, "_context"):
                      testStatus = ''
                      for i in range(0, int(visitor._settings._opts['Retry'])):
                          if testStatus != 'PASS':
                              if item.name in visitor._executed_tests:
                                  visitor._executed_tests.pop(item.name)
                              item.visit(visitor)
                              testStatus = visitor._context.variables['${PREV_TEST_STATUS}']
                          else:
                              break
                  else:
                      item.visit(visitor)
      

      6?做完如上配置之后,我們來驗證一下參數是否配置成功了,輸入robot —help查看一下配置參數項。

      7? 輸入如下命令,結合Class_01用例,驗證用例失敗重試機制:

      robot --test Class_01_隨機取數,模擬隨機出現失敗場景 --retry 3 .
      

      如果測試用例運行結果為PASS,運行一次即正常結束,如果用例運行失敗,則會重試3次執行。

      5. 小結

      本文以Robot Framework框架為例,介紹了在自動化測試過程中,如何實現用例腳本失敗重試機制,并且分享了三類實現思路:

      • 借助依賴框架自身是否有用例失敗重試運行機制。

      • 從用例腳本自身邏輯處入手,實現失敗運行重試。(適用于被特殊處理過的用例邏輯)

      • 從擴展框架源碼,自定義失敗重試運行機制。(通常適合于所有失敗用例)

      認真品味本文的讀者,會發現,雖然本文內容是以Robot Framework框架為例,但其實任何自動化測試框架,要實現測試用例腳本重試機制,都繞不開本文所提到的三類實現方式思路。學會變通、靈活運用才是王道。

      希望對大家在實施自動化測試工作當中有所幫助或啟發!如果覺得有用,不用以身相許,關注一下就行

      原文傳送門: 原文閱讀

      posted @ 2020-06-23 09:23  狂師  閱讀(1769)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 亚洲欧美日韩愉拍自拍美利坚| 中文字幕在线无码一区二区三区| 婷婷综合缴情亚洲| 欧美老熟妇乱子伦牲交视频| 天堂8中文在线最新版在线| 日日噜噜大屁股熟妇| 色九月亚洲综合网| 777米奇影视第四色| 国精品午夜福利视频不卡| 麻豆一区二区三区香蕉视频| 国产精品污双胞胎在线观看| 香蕉EEWW99国产精选免费| 国产国产人免费人成免费| 幻女free性俄罗斯毛片| 中文字幕日韩有码一区| 亚洲精品天堂在线观看| 日本免费最新高清不卡视频| 湘阴县| 自拍视频亚洲精品在线| 成人啪精品视频网站午夜| 精品成在人线av无码免费看| 非会员区试看120秒6次| 国产精品一线天粉嫩av| 亚洲一区二区三区在线播放无码| 午夜成人精品福利网站在线观看| 成人国产av精品免费网| 无码av最新无码av专区| 亚洲av久久精品狠狠爱av| 精品一区二区三区少妇蜜臀| 亚洲中文久久久久久精品国产| 激情综合网激情五月伊人| 久久亚洲精品中文字幕馆| 久久国产精品老人性| 激情久久综合精品久久人妻 | 欧洲精品码一区二区三区| 亚洲综合av一区二区三区| 福利一区二区不卡国产| 久热这里有精品视频播放| 国产成人高清精品亚洲| 国产成人精品一区二三区在线观看| 亚洲国产成人无码电影|