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 文件改對應的字段值即可

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章