使用cypress編寫第一個測試用例
cypress測試編寫
當環(huán)境安裝好了之后,就可以著手嘗試第一個測試的編寫了。
一、新建一個文件
在你的項目下的cypress/integration文件夾中創(chuàng)建一個新文件sample_spec.js
,我這里直接在webstorm編輯器中創(chuàng)建。
創(chuàng)建好之后,打開cypress的應(yīng)用,會看到Cypress Test Runner立即將新文件顯示在集成測試列表中。
Cypress會監(jiān)視規(guī)格文件的任何更改,并自動顯示任何更改。
雖然這是一個空文件,但是也可以點擊運行試試看。
顯示No tests found,這是正常情況,因為我確實啥也沒寫。不過有時候cypress在解析測試文件內(nèi)容的時候也會有這種報錯提示,可以F12打開開發(fā)者工具,查看console里是不是有錯誤消息。
二、編寫第一個測試文件
這里關(guān)注點有3個:
- 編寫第一個通過的測試。
- 編寫我們的第一個失敗測試。
- 觀察cypress實時網(wǎng)頁重載的過程
實時重載就是,當測試文件內(nèi)容有改變保存的時候,可以看到瀏覽器自動實時重載。
1. 編寫一個測試通過的代碼
現(xiàn)在,修改剛才新文件的,添加以下代碼,然后保存。
describe('My First Test', () => { it('Does not do much!', () => { expect(true).to.equal(true) }) })
保存后,重載運行,測試通過啦。
雖然這個測試文件沒干啥正經(jīng)事兒,這就是第一個pass的測試!?
在命令日志中,有展示出的信息,包含了測試套件、測試、以及測試斷言情況,斷言通過就是綠色的。
2. 編寫一個測試失敗的代碼
可以在文件里繼續(xù)添加下面的代碼,然后保存。
describe('My First Test', () => { it('Does not do much!', () => { expect(true).to.equal(false) }) })
這時候,測試失敗了,信息和關(guān)鍵字都是用紅色來顯示的。
3. 測試文件中的describe, it, 和expect 是什么
在編輯器里查看測試文件,很容易看到在代碼里,describe
, it
, 和 expect
這3個是關(guān)鍵字。
cypress也是通過在內(nèi)部使用了其他流行的工具或者框架來實現(xiàn)這些功能:
describe
和it
來自于 Mocha
expect
來自于Chai
三、編寫一個真實的測試文件
一個完整可靠的測試通常包含3個階段:
- 測試前置準備
- 執(zhí)行測試
- 測試執(zhí)行后的斷言。
我們也會常見到一些短語概括,比如 Given, When, Then
, 或者 Arrange, Act, Assert
,描述的也都是這種思路。所以,在cypress里編寫測試文件,同樣也遵循上述原則:
- 訪問一個網(wǎng)頁。
- 查詢元素。
- 與該元素交互。
- 斷言頁面上的內(nèi)容。
1. 步驟一:訪問一個頁面
這里使用官方的一個頁面作為測試頁面。
將要訪問的URL傳遞給cy.visit()
:
describe('我的第一個測試', () => { it('訪問 Kitchen Sink 頁面', () => { cy.visit('https://example.cypress.io') }) })
保存文件后,切換到cypress運行器,可以看到如下變化:
- 命令日志現(xiàn)在顯示了新的VISIT操作。
- 訪問的Kitchen Sink頁面已經(jīng)加載到右側(cè)的預(yù)覽窗口。
- 測試是綠色的,雖然沒有任何斷言。
如果請求的頁面返回時帶有非2xx狀態(tài)碼,比如404或者500,或者訪問的應(yīng)用程序代碼中有JavaScript報錯,測試會失敗。
VISIT顯示藍色掛起狀態(tài),直到頁面加載完成。
如果該請求返回時帶有非2xx狀態(tài)代碼,如404或500,或者如果應(yīng)用程序代碼中有JavaScript錯誤,測試就會失敗
注意
你測試的應(yīng)用程序得是你可以控制的,為什么呢?
- 如果你隨便測試一個別的頁面應(yīng)用,它們隨時可能改變,那么測試可能就不能順利進行。
- 別的應(yīng)用可能會進行A/B測試,那么你多次相同的操作,可能無法獲得一致的結(jié)果。
- 它們可能會檢測到你是一個腳本并阻止你的訪問(谷歌會這樣做)。
- 他們可能有安全功能啟用,防止Cypress工作。
Cypress的重點用來幫助每天構(gòu)建和測試自己的應(yīng)用程序的,并不是一個通用的web自動化工具,所以不適合用來測試非你控制之外的應(yīng)用。
2. 步驟二:查詢一個元素
在第一步里已經(jīng)可以成功打開測試頁面,那現(xiàn)在就來查找一個元素,就拿type
開刀吧。
可以使用cy.contains()
,找到包含type
的元素。
describe('My First Test', () => { it('finds the content "type"', () => { cy.visit('https://example.cypress.io') cy.contains('type') }) })
保存。
這里同樣沒加斷言,但是測試也通過了。原因在于cypress的默認斷言,許多Cypress的命令當沒有找到預(yù)期目標時候,就會構(gòu)建失敗。
可以試試,用頁面上沒有的東西替換type
,比如hype
。測試就變紅了,但是需要4秒。為什么要等4s,因為cypress它會自動等待并重新嘗試,不會立即失效!
3. 步驟三:點擊一個元素
找到了包含type
的元素,這是一個鏈接,于是可以點擊它,在后面加上.click()
即可。
describe('My First Test', () => { it('clicks the link "type"', () => { cy.visit('https://example.cypress.io') cy.contains('type').click() }) })
點擊跳轉(zhuǎn)成功。
另外,從cy.contains('type').click()
這行代碼可以看出,在cypress里可以采用鏈式調(diào)用的方式,更直觀的描述出要做的事情。
4. 步驟四:斷言
得到了新的頁面,就可以在新頁面里加一些斷言了,驗證跳轉(zhuǎn)成功。
比如,驗證新頁面的URL是預(yù)期的URL。
斷言用到.should
方法。
describe('My First Test', () => { it('clicking "type" navigates to a new url', () => { cy.visit('https://example.cypress.io') cy.contains('type').click() // Should be on a new URL which includes '/commands/actions' cy.url().should('include', '/commands/actions') }) })
保存測試文件,測試通過,斷言正確。
添加更多的交互命令和斷言
到這里,一個完整的測試文件就可以說結(jié)束了。不過,cypress也并不限定在一個測試文件里只能做單個的交互和斷言。
因為在實際應(yīng)用場景中,某些被測試的功能,可能需要多個步驟。那么,我們可以在這個測試文件里繼續(xù)添加交互命令和斷言。
比如,在跳轉(zhuǎn)的新的頁面里,可以繼續(xù)使用cy.get()
來根據(jù)CSS類選擇元素。然后,可以使用.type()
命令將文本輸入到選定的輸入框。
最后,我們可以驗證輸入的值是否成功。
describe('My First Test', () => { it('Gets, types and asserts', () => { cy.visit('https://example.cypress.io') cy.contains('type').click() // Should be on a new URL which includes '/commands/actions' cy.url().should('include', '/commands/actions') // Get an input, type into it and verify that the value has been updated cy.get('.action-email') .type('fake@email.com') .should('have.value', 'fake@email.com') }) })
回顧測試
最終的代碼,就實現(xiàn)了在Cypress中進行一個簡短的測試:訪問一個頁面,找到并單擊一個鏈接,驗證URL,然后驗證新頁面上元素的行為。
如果大聲讀出來,聽起來可能是這樣的:
1. 訪問`https://example.cypress.io`
2. 找到包含了`type`的元素
3. 點擊這個元素
4. 獲取新頁面的url
5. 斷言獲取到的url里包含`/commands/actions`
6. 用css`.action-email`獲取到輸入框
7. 輸入`fake@email.com`
8. 斷言內(nèi)容輸入成功
是不是符合文章開始描述的編寫測試的思想。如果用Given, When, Then來解讀也是可以的:
1. Given 一個用戶訪問`https://example.cypress.io`
2. When 他點擊了type的label標簽
3. And 他在`.action-email`這個輸入框里輸入了 "fake@email.com"
4. Then 新頁面的url應(yīng)該包含`/commands/actions`
5. And 這個`.action-email`輸入框有了輸入內(nèi)容"fake@email.com"
關(guān)于頁面轉(zhuǎn)換
- 上面的測試代碼,跨越了2個頁面。
- cypress會自動的發(fā)現(xiàn)
page transition event
這種頁面轉(zhuǎn)化事件,并且會自動停止運行命令,直到下一個頁面加載完成。 - 如果下一個頁面最終沒有加載完成,那么Cypress就會結(jié)束測試并且標記error。
- 在前面提到過,Cypress在超時找到DOM元素之前等待了4秒,但是在最后的代碼中,Cypress檢測到頁面轉(zhuǎn)換事件,它會自動將單個page LOAD事件的超時增加到60秒。
- 換句話說,基于命令和發(fā)生的事件,Cypress自動更改預(yù)期超時。
以上就是使用cypress編寫第一個測試的詳細內(nèi)容,更多關(guān)于cypress測試編寫的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript節(jié)點及列表操作實例小結(jié)
這篇文章主要介紹了JavaScript節(jié)點及列表操作的方法,以實例的形式較為詳細的總結(jié)了javascript針對節(jié)點操作的相關(guān)技巧,并給出了一個完整的節(jié)點操作方法實例總結(jié),需要的朋友可以參考下2015-08-08不用AI也能實現(xiàn)的文字自動播報(SpeechSynthesis文本實例合成)
SpeechSynthesis是HTML5的一個新特性,基于SpeechSynthesis可以實現(xiàn)在客戶瀏覽器端進行動態(tài)文本的語音合成播放,這篇文章主要介紹了不用AI也能實現(xiàn)的文字自動播報(SpeechSynthesis文本實例合成),需要的朋友可以參考下2023-03-03JavaScript判斷一個變量是否是數(shù)組的五種方式總結(jié)
在 JavaScript 編程中,我們經(jīng)常需要對不同類型的變量進行判斷和處理,其中,判斷一個變量是否是數(shù)組是一項基本且常見的任務(wù),在本篇博客中,我們將介紹幾種常用的方式來判斷一個變量是否是數(shù)組,并探討它們的優(yōu)缺點以及適用場景,需要的朋友可以參考下2023-11-11js實現(xiàn)輪播圖效果 純js實現(xiàn)圖片自動切換
這篇文章主要為大家詳細介紹了js實現(xiàn)輪播圖效果,圖片自動切換,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-08-08