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

若是想從頭學起Cypress,能夠看下面的系列文章哦html

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

 

前言

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

 

命令和斷言

Cypress 測試中常常被調用的兩種類型,仍之前面說到的 testLogin.js 爲栗子後端

最後的斷言解析

檢查標籤爲 h1 的元素是否包含 jane.lane異步

 

斷言的通常步驟

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

 

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

如今的 web 應用基本都是異步的,若是出現如下狀況又應該怎麼處理呢?ide

  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() 命令超時

總結ui

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

 

多重斷言

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

 

列表的栗子

需求編碼

  • 假設一個下拉列表,存在兩個選項,第一個選項是「iTesting」,第二個選項是「testerTalk」
  • 咱們須要驗證兩個選項的存在,而且順序正確,代碼片斷以下

代碼解析

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

 

重試(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 文件改對應的字段值便可spa

相關文章
相關標籤/搜索