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

        共 3843字,需瀏覽 8分鐘

         ·

        2021-03-20 17:12

        iTesting,愛(ài)測(cè)試,愛(ài)分享



        我的新書前端自動(dòng)化測(cè)試框架Cypress從入門到精通出版啦!


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


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


        01

        TestRunner是什么

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

        僅再次列下其定義:

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

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


        02

        Test Runner兩種運(yùn)行模式


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


        區(qū)別一個(gè)是測(cè)試運(yùn)行時(shí)你可以看到瀏覽器啟動(dòng)、執(zhí)行測(cè)試。另一個(gè)是沒(méi)有瀏覽器界面,你看不到運(yùn)行過(guò)程。


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



        03

        什么, TestRunner也會(huì)“瞎”?!


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

        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)的一個(gè)用例,這個(gè)測(cè)試第一次成功,再次運(yùn)行失敗了。特別是你把它集成到CI上的時(shí)候,你大概率會(huì)看到這種失敗。


        為什么會(huì)這樣呢?


        Test Runner "瞎"了!


        04

        TestRunner為什么會(huì)“瞎”


        我們知道,修復(fù)一個(gè)Bug的最好手段就是穩(wěn)定重現(xiàn)它。怎么重現(xiàn)呢? 先設(shè)定一個(gè)小目標(biāo),先運(yùn)行它個(gè)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)    })  })})

        多次運(yùn)行能夠暴露出代碼中的潛在問(wèn)題,我建議所有要上CI運(yùn)行的測(cè)試用例在提交到代碼倉(cāng)庫(kù)時(shí),都這樣多次運(yùn)行下!

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

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


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


        來(lái)初步驗(yàn)證下:
        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)  })})
        哎,加了等待就不會(huì)出這個(gè)bug了。說(shuō)明問(wèn)題就在這里了:

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


        05

        結(jié)論


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

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

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

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


        06

        解決之道


        既然找到了Root cause,解決起來(lái)就簡(jiǎn)單了,有如下解法:

        • 1. 加Sleep time

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

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

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


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


        別走開(kāi),下一篇更精彩!



        往期回看:

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

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

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

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


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



        技術(shù)討論

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


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

        作者:

        Kevin Cai, 江湖人稱蔡老師。

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

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


        · 猜你喜歡的文章 ·

        功能測(cè)試進(jìn)階系列直播(免費(fèi))

        前端測(cè)試框架Cypress從入門到精通

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

        測(cè)試開(kāi)發(fā)入門與實(shí)戰(zhàn)

        瀏覽 49
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 操逼电影网 | 熟女探花 | 18禁 成人黄网站免费视频 | 男女一进一出粗大楱视频 | 小黄片视频下载 |