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

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

//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