Cypress系列(6)- Cypress 的重試機制
阿新 • • 發佈:2020-06-01
如果想從頭學起Cypress,可以看下面的系列文章哦
https://www.cnblogs.com/poloyy/category/1768839.html
前言
重試(Retry-ability)是 Cypress 的核心概念之一,有助於我們寫出更加健壯的測試
命令和斷言
Cypress 測試中經常被呼叫的兩種型別,仍以前面說到的 testLogin.js 為栗子
最後的斷言解析
檢查標籤為 h1 的元素是否包含 jane.lane
斷言的一般步驟
- 用 cy.get() 查詢應用程式的DOM,找到元素
- 針對元素或元素列表進行斷言嘗試 ,我們示例中為 .should("contain", "jane.lane")
關於實際工作中的靈魂拷問
現在的 web 應用基本都是非同步的,如果出現以下情況又應該怎麼處理呢?
- 如果斷言發生時,應用程式尚未更新DOM怎麼辦?
- 如果斷言發生時,應用程式正在等待其後端響應,而導致頁面暫無結果怎麼辦?
- 如果斷言發生時,應用程式正在進行密集計算,而導致頁面未及時更新怎麼辦?
上述情況再測試中經常會發生,一般處理方法是在斷言前價格固定等待時間(或像 selenium 一樣顯式、隱式等待),但仍有可能會發生測試失敗
Cypress 如何優美的解決上述問題
- cy.get() 命令之後的斷言通過,則該命令成功執行完成
- cy.get() 命令之後的斷言失敗,則 cy.get() 命令會自動重新查詢 web 應用程式的 DOM 樹,然後 Cypress 將再次嘗試對 cy.get() 返回的元素進行斷言
- 如果斷言仍然失敗, cy.get() 仍然會重新查詢 DOM 樹....以此類推
- 直到斷言成功 或 cy.get() 命令超時
總結
- 其實很像selenium 的顯式等待,只不過 Cypress 是全域性的,不用針對元素去單獨識別
- Cypress 這種自動重試機制避免了在測試程式碼中編寫硬編碼等待(強制等待),使測試程式碼更加健壯
多重斷言
- 在日常測試中,有時候需要多重斷言,即獲取元素後跟多個斷言
- 在多重斷言中,Cypress 將按順序進行斷言,即當第一個斷言通過後,會進行第二個斷言,通過後進行第三個斷言...以此類推
列表的栗子
需求
- 假設一個下拉列表,存在兩個選項,第一個選項是“iTesting”,第二個選項是“testerTalk”
- 我們需要驗證兩個選項的存在,並且順序正確,程式碼片段如下
程式碼解析
- 總共有三個斷言:一個 should() ,兩個 expect()
- and() 斷言實際上是 should() 斷言的別名,它是 should() 的自定義回撥斷言,其中包含兩個 expect() 斷言
- 在測試執行過程中,如果第二個斷言失敗了,那第三個斷言永遠不會執行
- 如果導致第二個斷言失敗的原因被找到且修復了,且此時整個命令還沒有超時,則在進行第三個斷言時,還會再次重試第一、第二個斷言
重試(Retry-ability)的條件
前言
- Cypress 並不會重試所有命令,當命令可能改變被測應用程式的狀態時,該命令將不會重試(如: click() ,畢竟要點選)
- Cypress 僅會重試那些查詢 DOM 的命令: cy.get() 、 find() 、 contains() 等
- 可以通過官方文件 Assertions 部分來檢查是否重試了特定命令:https://docs.cypress.io/zh-cn/guides/references/assertions.html#Chai
常用的可重試命令
重點啦!
重試的超時時間預設是 4秒,對應的配置項是: defaultCommondTimeout ,如果想改重試的超時時間,在 cypress.json 檔案改對應的欄位值即可
&n