若是想從頭學起Cypress,能夠看下面的系列文章哦html
https://www.cnblogs.com/poloyy/category/1768839.htmlweb
前言
重試(Retry-ability)是 Cypress 的核心概念之一,有助於咱們寫出更加健壯的測試json
命令和斷言
Cypress 測試中常常被調用的兩種類型,仍之前面說到的 testLogin.js 爲栗子後端
最後的斷言解析
檢查標籤爲 h1 的元素是否包含 jane.lane異步
斷言的通常步驟
- 用 cy.get() 查詢應用程序的DOM,找到元素
- 針對元素或元素列表進行斷言嘗試 ,咱們示例中爲 .should("contain", "jane.lane")
關於實際工做中的靈魂拷問
如今的 web 應用基本都是異步的,若是出現如下狀況又應該怎麼處理呢?ide
- 若是斷言發生時,應用程序還沒有更新DOM怎麼辦?
- 若是斷言發生時,應用程序正在等待其後端響應,而致使頁面暫無結果怎麼辦?
- 若是斷言發生時,應用程序正在進行密集計算,而致使頁面未及時更新怎麼辦?
上述狀況再測試中常常會發生,通常處理方法是在斷言前價格固定等待時間(或像 selenium 同樣顯式、隱式等待),但仍有可能會發生測試失敗測試
Cypress 如何優美的解決上述問題
- cy.get() 命令以後的斷言經過,則該命令成功執行完成
- cy.get() 命令以後的斷言失敗,則 cy.get() 命令會自動從新查詢 web 應用程序的 DOM 樹,而後 Cypress 將再次嘗試對 cy.get() 返回的元素進行斷言
- 若是斷言仍然失敗, cy.get() 仍然會從新查詢 DOM 樹....以此類推
- 直到斷言成功 或 cy.get() 命令超時
總結ui
- 其實很像selenium 的顯式等待,只不過 Cypress 是全局的,不用針對元素去單獨識別
- Cypress 這種自動重試機制避免了在測試代碼中編寫硬編碼等待(強制等待),使測試代碼更加健壯
多重斷言
- 在平常測試中,有時候須要多重斷言,即獲取元素後跟多個斷言
- 在多重斷言中,Cypress 將按順序進行斷言,即當第一個斷言經過後,會進行第二個斷言,經過後進行第三個斷言...以此類推
列表的栗子
需求編碼
- 假設一個下拉列表,存在兩個選項,第一個選項是「iTesting」,第二個選項是「testerTalk」
- 咱們須要驗證兩個選項的存在,而且順序正確,代碼片斷以下
代碼解析
- 總共有三個斷言:一個 should() ,兩個 expect()
- and() 斷言其實是 should() 斷言的別名,它是 should() 的自定義回調斷言,其中包含兩個 expect() 斷言
- 在測試執行過程當中,若是第二個斷言失敗了,那第三個斷言永遠不會執行
- 若是致使第二個斷言失敗的緣由被找到且修復了,且此時整個命令尚未超時,則在進行第三個斷言時,還會再次重試第1、第二個斷言
重試(Retry-ability)的條件
前言
經常使用的可重試命令
重點啦!
重試的超時時間默認是 4秒,對應的配置項是: defaultCommondTimeout ,若是想改重試的超時時間,在 cypress.json 文件改對應的字段值便可spa