1. 程式人生 > >Cypress系列(6)- Cypress 的重試機制

Cypress系列(6)- Cypress 的重試機制

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

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

 

前言

重試(Retry-ability)是 Cypress 的核心概念之一,有助於我們寫出更加健壯的測試

 

命令和斷言

Cypress 測試中經常被呼叫的兩種型別,仍以前面說到的 testLogin.js 為栗子

最後的斷言解析

檢查標籤為 h1 的元素是否包含 jane.lane

 

斷言的一般步驟

  1. 用 cy.get() 查詢應用程式的DOM,找到元素
  2. 針對元素或元素列表進行斷言嘗試 ,我們示例中為 .should("contain", "jane.lane") 

 

關於實際工作中的靈魂拷問

現在的 web 應用基本都是非同步的,如果出現以下情況又應該怎麼處理呢?

  1. 如果斷言發生時,應用程式尚未更新DOM怎麼辦?
  2. 如果斷言發生時,應用程式正在等待其後端響應,而導致頁面暫無結果怎麼辦?
  3. 如果斷言發生時,應用程式正在進行密集計算,而導致頁面未及時更新怎麼辦?

上述情況再測試中經常會發生,一般處理方法是在斷言前價格固定等待時間(或像 selenium 一樣顯式、隱式等待),但仍有可能會發生測試失敗

 

Cypress 如何優美的解決上述問題

  1.  cy.get() 命令之後的斷言通過,則該命令成功執行完成
  2.  cy.get() 命令之後的斷言失敗,則 cy.get() 命令會自動重新查詢 web 應用程式的 DOM 樹,然後 Cypress 將再次嘗試對 cy.get() 返回的元素進行斷言
  3. 如果斷言仍然失敗, cy.get() 仍然會重新查詢 DOM 樹....以此類推
  4. 直到斷言成功 或 cy.get() 命令超時

總結

  • 其實很像selenium 的顯式等待,只不過 Cypress 是全域性的,不用針對元素去單獨識別
  • Cypress 這種自動重試機制避免了在測試程式碼中編寫硬編碼等待(強制等待),使測試程式碼更加健壯

 

多重斷言

  • 在日常測試中,有時候需要多重斷言,即獲取元素後跟多個斷言
  • 在多重斷言中,Cypress 將按順序進行斷言,即當第一個斷言通過後,會進行第二個斷言,通過後進行第三個斷言...以此類推

 

列表的栗子

需求

  • 假設一個下拉列表,存在兩個選項,第一個選項是“iTesting”,第二個選項是“testerTalk”
  • 我們需要驗證兩個選項的存在,並且順序正確,程式碼片段如下

程式碼解析

  1. 總共有三個斷言:一個 should() ,兩個 expect() 
  2. and() 斷言實際上是 should() 斷言的別名,它是 should() 的自定義回撥斷言,其中包含兩個 expect() 斷言
  3. 在測試執行過程中,如果第二個斷言失敗了,那第三個斷言永遠不會執行
  4. 如果導致第二個斷言失敗的原因被找到且修復了,且此時整個命令還沒有超時,則在進行第三個斷言時,還會再次重試第一、第二個斷言

 

重試(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