如果想從頭學起Cypress,可以看下面的系列文章哦
https://www.cnblogs.com/poloyy/category/1768839.html
重試的介紹
學習前的三問
- 什麼是重試測試
- 為什麼重試很重要
- 如何使用重試
為什麼要重試
- 使用 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 函式也將重新執行
- beforeEach
- 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