Cypress系列(65)- 測試執行失敗自動重試

小菠蘿測試筆記發表於2020-10-16

如果想從頭學起Cypress,可以看下面的系列文章哦

https://www.cnblogs.com/poloyy/category/1768839.html

 

重試的介紹

學習前的三問

  1. 什麼是重試測試
  2. 為什麼重試很重要
  3. 如何使用重試

 

為什麼要重試

  • 使用 Cypress 進行自動化測試時,仍然會存在一些難以驗證的行為,並使得測試變得不穩定(不可靠)
  • 有時會由於不可以預測的情況(如,外部依賴項中斷,隨機網路錯誤等)而導致測試失敗

 

其他導致不可靠測試的因素

  • 前端動畫
  • API 呼叫
  • 測試伺服器/資料庫的可用性
  • 依賴資源的可用性
  • 網路問題

 

重試的優勢

  • 通過重試,Cypress 能夠重試失敗的測試用例,以幫助減少測試脆弱性和持續整合(CI)構建失敗的情況
  •  從而節省團隊寶貴的時間和資源,使團隊可以專注於最重要的事情

 

備註

  • Cypress 5.0 之前需要通過外掛 cypress-plugin-retries 來完成重試的作用
  • Cypress 5.0 開始就自帶重試的配置項了

 

通過外掛來完成重試

安裝 cypress-plugin-retries

npm install -D cypress-plugin-retries

 

在 cypress/support/index.js 下增加如下程式碼

require('cypress-plugin-retries’)

 

在 package.json 的 scripts 程式碼塊下增加如下程式碼

{
   "scripts" : {
        "retryCases":"CYPRESS_RETRIES=2 cypress run"
   }  
}

 

使用

在 Cypress 安裝目錄下執行下面命令,所有測試用例若失敗都會自動重試 2 次

yarn retryCases

 

Cypress 自帶的重試功能介紹

前言

  • 預設情況下,測試將在失敗時不重試,需要在配置中啟用測試重試才能使用此功能
  • 啟用測試重試後,可以將測試配置為具有 X 次重試次數
  • 例如,測試重試配置了2次重試,則 Cypress 將最多重試2次(共執行3次),然後再標記為失敗測試

 

注意

當再次執行每個測試時,以下 hook 函式也將重新執行

  1. beforeEach
  2. afterEach

但 before 和 after 不會觸發

 

重試的工作流程

假設 Cypress 設定了重試兩次

  • 第一次執行時若成功,則繼續往下執行其他的測試用例
  • 第一次執行若失敗  ,則會重試執行第一次
  • 重試執行第一次若成功,則繼續往下執行其他的測試用例
  • 若重試執行第一次還失敗,則重試執行第二次
  • 若重試執行第二次仍然失敗,則將此 測試用例標記為失敗

注:能夠在命令日誌中檢視嘗試的次數,並根據需要擴充套件每次嘗試以進行檢查和除錯

 

配置重試功能

全域性配置

前言

  • 通常需要為 cypress run 和 cypress open 分開定義不同的重試次數
  • 預設在 cypress.json 中進行配置
  • runMode:定義執行 cypress run 時的重試次數
  • openMode:定義執行 cypress open 時的重試次數

 

cypress.json 分開定義

 

cypress.json 合併定義

這樣無論是 cypress run 命令還是 cypress open 命令,重試次數都是 2

 

自定義配置

測試用例級別

context('測試用例級別', function () {
    it('栗子1', {
        // 無論是 runMode 還是 openMode 都重試 2 次
        retries: 2,
        defaultCommandTimeout: 1000
    }, function () {
        cy.get('#id')
    });

    it('栗子2', {
        // 分開指定重試次數
        retries: {
            runMode: 2,
            openMode: 1
        },
        defaultCommandTimeout: 1000
    }, function () {
        cy.get('#id')
    });
})

 

測試結果

栗子1 重試 2 次,栗子2 重試 1次,測試不通過就會打 ×,點選可以檢視詳細錯誤資訊

(不得不說,這按鈕 UI 真好看...)

 

測試用例集級別

context('測試用例集級別', {
        // 此 context 下面的所有測試用例(it)重試次數都是 1
        retries: 1,
        defaultCommandTimeout: 1000
    }, function () {
        it('栗子1', function () {
            cy.get('#id')
        })

        it('栗子2', function () {
            cy.get('#id')
        })
    }
)

 

測試結果

 

重試功能 + .screenshot() 的栗子

測試程式碼

context('截圖的栗子', function () {
    it('栗子', {
        retries: 2,
        defaultCommandTimeout: 1000
    }, function () {
        cy.screenshot('user-login-errors')
        cy.get('#id')
    });
})

 

測試結果

重試是的截圖圖片名稱會包含 attempt

 

相關文章