使用cypress編寫第一個(gè)測(cè)試用例
cypress測(cè)試編寫
當(dāng)環(huán)境安裝好了之后,就可以著手嘗試第一個(gè)測(cè)試的編寫了。
一、新建一個(gè)文件
在你的項(xiàng)目下的cypress/integration文件夾中創(chuàng)建一個(gè)新文件sample_spec.js,我這里直接在webstorm編輯器中創(chuàng)建。
創(chuàng)建好之后,打開cypress的應(yīng)用,會(huì)看到Cypress Test Runner立即將新文件顯示在集成測(cè)試列表中。
Cypress會(huì)監(jiān)視規(guī)格文件的任何更改,并自動(dòng)顯示任何更改。

雖然這是一個(gè)空文件,但是也可以點(diǎn)擊運(yùn)行試試看。

顯示No tests found,這是正常情況,因?yàn)槲掖_實(shí)啥也沒寫。不過有時(shí)候cypress在解析測(cè)試文件內(nèi)容的時(shí)候也會(huì)有這種報(bào)錯(cuò)提示,可以F12打開開發(fā)者工具,查看console里是不是有錯(cuò)誤消息。

二、編寫第一個(gè)測(cè)試文件
這里關(guān)注點(diǎn)有3個(gè):
- 編寫第一個(gè)通過的測(cè)試。
- 編寫我們的第一個(gè)失敗測(cè)試。
- 觀察cypress實(shí)時(shí)網(wǎng)頁(yè)重載的過程
實(shí)時(shí)重載就是,當(dāng)測(cè)試文件內(nèi)容有改變保存的時(shí)候,可以看到瀏覽器自動(dòng)實(shí)時(shí)重載。

1. 編寫一個(gè)測(cè)試通過的代碼
現(xiàn)在,修改剛才新文件的,添加以下代碼,然后保存。
describe('My First Test', () => {
it('Does not do much!', () => {
expect(true).to.equal(true)
})
})保存后,重載運(yùn)行,測(cè)試通過啦。

雖然這個(gè)測(cè)試文件沒干啥正經(jīng)事兒,這就是第一個(gè)pass的測(cè)試!?
在命令日志中,有展示出的信息,包含了測(cè)試套件、測(cè)試、以及測(cè)試斷言情況,斷言通過就是綠色的。
2. 編寫一個(gè)測(cè)試失敗的代碼
可以在文件里繼續(xù)添加下面的代碼,然后保存。
describe('My First Test', () => {
it('Does not do much!', () => {
expect(true).to.equal(false)
})
})這時(shí)候,測(cè)試失敗了,信息和關(guān)鍵字都是用紅色來顯示的。

3. 測(cè)試文件中的describe, it, 和expect 是什么
在編輯器里查看測(cè)試文件,很容易看到在代碼里,describe, it, 和 expect這3個(gè)是關(guān)鍵字。
cypress也是通過在內(nèi)部使用了其他流行的工具或者框架來實(shí)現(xiàn)這些功能:
describe 和it 來自于 Mocha
expect來自于Chai

三、編寫一個(gè)真實(shí)的測(cè)試文件
一個(gè)完整可靠的測(cè)試通常包含3個(gè)階段:
- 測(cè)試前置準(zhǔn)備
- 執(zhí)行測(cè)試
- 測(cè)試執(zhí)行后的斷言。
我們也會(huì)常見到一些短語(yǔ)概括,比如 Given, When, Then, 或者 Arrange, Act, Assert,描述的也都是這種思路。所以,在cypress里編寫測(cè)試文件,同樣也遵循上述原則:
- 訪問一個(gè)網(wǎng)頁(yè)。
- 查詢?cè)亍?/li>
- 與該元素交互。
- 斷言頁(yè)面上的內(nèi)容。
1. 步驟一:訪問一個(gè)頁(yè)面
這里使用官方的一個(gè)頁(yè)面作為測(cè)試頁(yè)面。
將要訪問的URL傳遞給cy.visit():
describe('我的第一個(gè)測(cè)試', () => {
it('訪問 Kitchen Sink 頁(yè)面', () => {
cy.visit('https://example.cypress.io')
})
})保存文件后,切換到cypress運(yùn)行器,可以看到如下變化:

- 命令日志現(xiàn)在顯示了新的VISIT操作。
- 訪問的Kitchen Sink頁(yè)面已經(jīng)加載到右側(cè)的預(yù)覽窗口。
- 測(cè)試是綠色的,雖然沒有任何斷言。
如果請(qǐng)求的頁(yè)面返回時(shí)帶有非2xx狀態(tài)碼,比如404或者500,或者訪問的應(yīng)用程序代碼中有JavaScript報(bào)錯(cuò),測(cè)試會(huì)失敗。
VISIT顯示藍(lán)色掛起狀態(tài),直到頁(yè)面加載完成。

如果該請(qǐng)求返回時(shí)帶有非2xx狀態(tài)代碼,如404或500,或者如果應(yīng)用程序代碼中有JavaScript錯(cuò)誤,測(cè)試就會(huì)失敗
注意
你測(cè)試的應(yīng)用程序得是你可以控制的,為什么呢?
- 如果你隨便測(cè)試一個(gè)別的頁(yè)面應(yīng)用,它們隨時(shí)可能改變,那么測(cè)試可能就不能順利進(jìn)行。
- 別的應(yīng)用可能會(huì)進(jìn)行A/B測(cè)試,那么你多次相同的操作,可能無(wú)法獲得一致的結(jié)果。
- 它們可能會(huì)檢測(cè)到你是一個(gè)腳本并阻止你的訪問(谷歌會(huì)這樣做)。
- 他們可能有安全功能啟用,防止Cypress工作。
Cypress的重點(diǎn)用來幫助每天構(gòu)建和測(cè)試自己的應(yīng)用程序的,并不是一個(gè)通用的web自動(dòng)化工具,所以不適合用來測(cè)試非你控制之外的應(yīng)用。
2. 步驟二:查詢一個(gè)元素
在第一步里已經(jīng)可以成功打開測(cè)試頁(yè)面,那現(xiàn)在就來查找一個(gè)元素,就拿type開刀吧。
可以使用cy.contains(),找到包含type的元素。
describe('My First Test', () => {
it('finds the content "type"', () => {
cy.visit('https://example.cypress.io')
cy.contains('type')
})
})保存。

這里同樣沒加斷言,但是測(cè)試也通過了。原因在于cypress的默認(rèn)斷言,許多Cypress的命令當(dāng)沒有找到預(yù)期目標(biāo)時(shí)候,就會(huì)構(gòu)建失敗。
可以試試,用頁(yè)面上沒有的東西替換type,比如hype。測(cè)試就變紅了,但是需要4秒。為什么要等4s,因?yàn)閏ypress它會(huì)自動(dòng)等待并重新嘗試,不會(huì)立即失效!

3. 步驟三:點(diǎn)擊一個(gè)元素
找到了包含type的元素,這是一個(gè)鏈接,于是可以點(diǎn)擊它,在后面加上.click()即可。
describe('My First Test', () => {
it('clicks the link "type"', () => {
cy.visit('https://example.cypress.io')
cy.contains('type').click()
})
})點(diǎn)擊跳轉(zhuǎn)成功。

另外,從cy.contains('type').click()這行代碼可以看出,在cypress里可以采用鏈?zhǔn)秸{(diào)用的方式,更直觀的描述出要做的事情。
4. 步驟四:斷言
得到了新的頁(yè)面,就可以在新頁(yè)面里加一些斷言了,驗(yàn)證跳轉(zhuǎn)成功。
比如,驗(yàn)證新頁(yè)面的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')
})
})保存測(cè)試文件,測(cè)試通過,斷言正確。

添加更多的交互命令和斷言
到這里,一個(gè)完整的測(cè)試文件就可以說結(jié)束了。不過,cypress也并不限定在一個(gè)測(cè)試文件里只能做單個(gè)的交互和斷言。
因?yàn)樵趯?shí)際應(yīng)用場(chǎng)景中,某些被測(cè)試的功能,可能需要多個(gè)步驟。那么,我們可以在這個(gè)測(cè)試文件里繼續(xù)添加交互命令和斷言。
比如,在跳轉(zhuǎn)的新的頁(yè)面里,可以繼續(xù)使用cy.get()來根據(jù)CSS類選擇元素。然后,可以使用.type()命令將文本輸入到選定的輸入框。
最后,我們可以驗(yàn)證輸入的值是否成功。
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')
})
})回顧測(cè)試
最終的代碼,就實(shí)現(xiàn)了在Cypress中進(jìn)行一個(gè)簡(jiǎn)短的測(cè)試:訪問一個(gè)頁(yè)面,找到并單擊一個(gè)鏈接,驗(yàn)證URL,然后驗(yàn)證新頁(yè)面上元素的行為。
如果大聲讀出來,聽起來可能是這樣的:
1. 訪問`https://example.cypress.io`
2. 找到包含了`type`的元素
3. 點(diǎn)擊這個(gè)元素
4. 獲取新頁(yè)面的url
5. 斷言獲取到的url里包含`/commands/actions`
6. 用css`.action-email`獲取到輸入框
7. 輸入`fake@email.com`
8. 斷言內(nèi)容輸入成功
是不是符合文章開始描述的編寫測(cè)試的思想。如果用Given, When, Then來解讀也是可以的:
1. Given 一個(gè)用戶訪問`https://example.cypress.io`
2. When 他點(diǎn)擊了type的label標(biāo)簽
3. And 他在`.action-email`這個(gè)輸入框里輸入了 "fake@email.com"
4. Then 新頁(yè)面的url應(yīng)該包含`/commands/actions`
5. And 這個(gè)`.action-email`輸入框有了輸入內(nèi)容"fake@email.com"
關(guān)于頁(yè)面轉(zhuǎn)換
- 上面的測(cè)試代碼,跨越了2個(gè)頁(yè)面。
- cypress會(huì)自動(dòng)的發(fā)現(xiàn)
page transition event這種頁(yè)面轉(zhuǎn)化事件,并且會(huì)自動(dòng)停止運(yùn)行命令,直到下一個(gè)頁(yè)面加載完成。 - 如果下一個(gè)頁(yè)面最終沒有加載完成,那么Cypress就會(huì)結(jié)束測(cè)試并且標(biāo)記error。
- 在前面提到過,Cypress在超時(shí)找到DOM元素之前等待了4秒,但是在最后的代碼中,Cypress檢測(cè)到頁(yè)面轉(zhuǎn)換事件,它會(huì)自動(dòng)將單個(gè)page LOAD事件的超時(shí)增加到60秒。
- 換句話說,基于命令和發(fā)生的事件,Cypress自動(dòng)更改預(yù)期超時(shí)。
以上就是使用cypress編寫第一個(gè)測(cè)試的詳細(xì)內(nèi)容,更多關(guān)于cypress測(cè)試編寫的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript節(jié)點(diǎn)及列表操作實(shí)例小結(jié)
這篇文章主要介紹了JavaScript節(jié)點(diǎn)及列表操作的方法,以實(shí)例的形式較為詳細(xì)的總結(jié)了javascript針對(duì)節(jié)點(diǎn)操作的相關(guān)技巧,并給出了一個(gè)完整的節(jié)點(diǎn)操作方法實(shí)例總結(jié),需要的朋友可以參考下2015-08-08
JS監(jiān)聽組合按鍵思路及實(shí)現(xiàn)過程
這篇文章主要介紹了JS監(jiān)聽組合按鍵思路及實(shí)現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
不用AI也能實(shí)現(xiàn)的文字自動(dòng)播報(bào)(SpeechSynthesis文本實(shí)例合成)
SpeechSynthesis是HTML5的一個(gè)新特性,基于SpeechSynthesis可以實(shí)現(xiàn)在客戶瀏覽器端進(jìn)行動(dòng)態(tài)文本的語(yǔ)音合成播放,這篇文章主要介紹了不用AI也能實(shí)現(xiàn)的文字自動(dòng)播報(bào)(SpeechSynthesis文本實(shí)例合成),需要的朋友可以參考下2023-03-03
JavaScript判斷一個(gè)變量是否是數(shù)組的五種方式總結(jié)
在 JavaScript 編程中,我們經(jīng)常需要對(duì)不同類型的變量進(jìn)行判斷和處理,其中,判斷一個(gè)變量是否是數(shù)組是一項(xiàng)基本且常見的任務(wù),在本篇博客中,我們將介紹幾種常用的方式來判斷一個(gè)變量是否是數(shù)組,并探討它們的優(yōu)缺點(diǎn)以及適用場(chǎng)景,需要的朋友可以參考下2023-11-11
js實(shí)現(xiàn)輪播圖效果 純js實(shí)現(xiàn)圖片自動(dòng)切換
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)輪播圖效果,圖片自動(dòng)切換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08
原生js仿jq判斷當(dāng)前瀏覽器是否為ie,精確到ie6~8
這篇文章主要介紹了原生js仿jq判斷當(dāng)前瀏覽器是否為ie,精確到ie6~8,需要的朋友可以參考下2014-08-08
原生JS實(shí)現(xiàn)不斷變化的標(biāo)簽
這篇文章主要介紹了原生JS實(shí)現(xiàn)不斷變化的標(biāo)簽,可以上下浮動(dòng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05

