<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          你不知道的Cypress系列(5) -- "眼瞎"的TestRunner?

          共 3843字,需瀏覽 8分鐘

           ·

          2021-03-20 17:12

          iTesting,愛測試,愛分享



          我的新書前端自動化測試框架Cypress從入門到精通出版啦!


          自從我的新書<前端自動化測試框架 -- Cypress從入門到精通>上市以來,這本書受到了大量同學(xué)熱情的追捧和討論。在跟同學(xué)們的交流中,我也了解到, 原來除了國外優(yōu)秀的公司(例如Adobe, 迪士尼,AutoDesk等等), 國內(nèi)也有很多公司在嘗試使用Cypress提升測試效率。而在Cypress中國群內(nèi)、在公眾號iTesting里,我每天都能看到大量關(guān)于Cypress的使用討論和私下問詢。這讓我感到無比榮幸。(買了書的同學(xué)們,公眾號回復(fù)你的微信號,拉你到Cypress中國群)。


          今天是你不知道的Cypress系列(5) -- "眼瞎"的TestRunner


          01

          TestRunner是什么

          關(guān)于TestRunner, 我想大家都已經(jīng)非常熟悉了。在我的的書中也有其各個用法的專門介紹,這里不再贅述。

          僅再次列下其定義:

          TestRunner是一個獨特的測試運行器。Cypress的所有命令通過它運行。通過TestRunner你可以觀測到, 在某一個時刻:1. 哪些命令在執(zhí)行。2. 這些命令在執(zhí)行時,你的應(yīng)用程序處于什么狀態(tài)。

          Cypress八大特性里的時間穿梭能力,和可調(diào)試性能力,其實就是通過TestRunner來實現(xiàn)的。


          02

          Test Runner兩種運行模式


          Cypress有兩種運行方式,分別是交互性運行(Interaction Mode),和無頭(Headless Mode)運行。


          區(qū)別一個是測試運行時你可以看到瀏覽器啟動、執(zhí)行測試。另一個是沒有瀏覽器界面,你看不到運行過程。


          無論是哪種方式運行,大家記得Cypress 是通過它內(nèi)置的Test Runner來運行你的測試用例的就行。



          03

          什么, TestRunner也會“瞎”?!


          沒想到吧?剛開始我也是拒絕相信的。直到我發(fā)現(xiàn)我的測試用例還是會出現(xiàn)不穩(wěn)定、隨機失敗的現(xiàn)象(Flaky Test)。怪了!不是說用了Cypress之后就不會有這種問題了么?于是我就尋仙訪藥啊,終于,找到了原因所在。先給大家看一個例子:

          describe('iTesting Demo', () => {  it('歡迎關(guān)注iTesting', () => {    cy.visit('/?delay=500')    cy.get('.loading').should('be.visible')    cy.get('.loading').should('not.be.visible')    cy.get('li.todo').should('have.length', 2)  })})

          這是Cypress官網(wǎng)的一個用例,這個測試第一次成功,再次運行失敗了。特別是你把它集成到CI上的時候,你大概率會看到這種失敗。


          為什么會這樣呢?


          Test Runner "瞎"了!


          04

          TestRunner為什么會“瞎”


          我們知道,修復(fù)一個Bug的最好手段就是穩(wěn)定重現(xiàn)它。怎么重現(xiàn)呢? 先設(shè)定一個小目標(biāo),先運行它個20次試試: 
          describe('iTesting Demo', () => {  Cypress._.times(20, (k) => {    it(`歡迎關(guān)注iTesting ${k}`, () => {      cy.visit('/?delay=500')      cy.get('.loading').should('be.visible')      cy.get('.loading').should('not.be.visible')      cy.get('li.todo').should('have.length', 2)    })  })})

          多次運行能夠暴露出代碼中的潛在問題,我建議所有要上CI運行的測試用例在提交到代碼倉庫時,都這樣多次運行下!

          這世界上啊,什么事都怕你有目的。果然目標(biāo)一定,出現(xiàn)錯誤的次數(shù)就增加到過5次了。

          那么我們確定,代碼是有問題,再一眼一眼看吧。這個時候,有條件的你可能也要看下開發(fā)的代碼如何寫的。例如,visit的時候發(fā)生了什么, click的時候哪些事件被觸發(fā)了? 通過了解開發(fā)邏輯可以幫助你快速定位問題。


          經(jīng)過一番調(diào)查啊,猜測出問題的代碼在第4行和第5行。當(dāng)元素(類名”.loading“)加載速度過快時候,就大概率會引發(fā)失敗。


          來初步驗證下:
          describe('iTesting Demo', () => {  it('歡迎關(guān)注iTesting', () => {    cy.visit('/?delay=500')    cy.get('.loading').should('be.visible')    cy.wait(1000)    cy.get('.loading').should('not.be.visible')    cy.get('li.todo').should('have.length', 2)  })})
          哎,加了等待就不會出這個bug了。說明問題就在這里了:

          也就是說,元素已經(jīng)完成show的操作并且馬上變成disappear了,但Cypress的Test Runner還沒反應(yīng)過來,還在檢查元素show出來沒。 


          05

          結(jié)論


          然后就是各種查資料, 最后發(fā)現(xiàn)Cypress早有結(jié)論:

          1. 如果一個元素出現(xiàn)和消失的間隔在21ms內(nèi),那么大概率TestRunner會“瞎”。

          有的同學(xué)可能會想, Test Runner看不見,有沒有其它辦法能看見?比如Cypress不是提供視頻可以錄制運行中的所有情況么?我把運行過程錄制下來慢慢查不就行了?

          1. 不行!標(biāo)準的視頻,是每秒30幀, 每幀的標(biāo)準間隔是33ms。


          06

          解決之道


          既然找到了Root cause,解決起來就簡單了,有如下解法:

          • 1. 加Sleep time

          // 強烈不推薦, 用了我大Cypress,是不可能sleep的!cy.wait(1000) 
          • 2. 使用cy.intercept等待網(wǎng)絡(luò)請求返回并加裝完成后再執(zhí)行

          // 強烈推薦!cy.intercept('XXX你的代碼').as('myRequest')cy.wait('@myRequest')xxxxx   //  你的后續(xù)代碼
          • 3. 直接模擬服務(wù)器延遲返回

           //五星好評,強烈推薦!  cy.intercept('/todos', {    fixture: 'todos.json',    delayMs: 1000,  })


          Cypress有很多奇淫巧技, 我已經(jīng)總結(jié)超過百篇


          別走開,下一篇更精彩!



          往期回看:

                              你不知道的Cypress系列(1) --雞肋的BDD

                              你不知道的Cypress系列(2) -- ”該死"的PO模型!

                              你不知道的Cypress系列(3) -- 是時候重構(gòu)自己的思維了!

                              你不知道的Cypress系列(4) -- “PO”已死,App Action當(dāng)立?


          為了更好的支持我創(chuàng)作,麻煩同學(xué)們動動小手,點贊 + 在看 + 轉(zhuǎn)發(fā)一鍵三聯(lián):)



          技術(shù)討論

          公眾號里直接回復(fù) 666, 帶你入圈。


           -   -  時人莫小池中水, 淺處不妨有臥龍  -  -

          作者:

          Kevin Cai, 江湖人稱蔡老師。

          兩性情感專家,非著名測試開發(fā)。

          技術(shù)路線的堅定支持者,始終相信Nobody can be somebody。      


          · 猜你喜歡的文章 ·

          功能測試進階系列直播(免費)

          前端測試框架Cypress從入門到精通

          自研測試框架ktest介紹(適用于UI和API)

          測試開發(fā)入門與實戰(zhàn)

          瀏覽 49
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  做爱下载视频免费网站 | 免费黄色视频日本 | 就爱草逼 | 欧美乱妇高清无乱码免费-久久99国产高清 | 亚洲国产精品波多野结衣 |