摘要:進(jìn)行測(cè)試之理論是目前很火的一個(gè)測(cè)試組件,內(nèi)部綁定了之類(lèi)的斷言為了讓代碼代碼更有說(shuō)服力,減少提交測(cè)試錯(cuò)誤,進(jìn)行測(cè)試顯然是非常有必要的。
cypress 進(jìn)行 e2e 測(cè)試之理論
cypress 是目前 e2e 很火的一個(gè)測(cè)試組件,內(nèi)部綁定了 macha、chai、chai-jquery 之類(lèi)的斷言,為了讓代碼代碼
更有說(shuō)服力,減少提交測(cè)試錯(cuò)誤,進(jìn)行 e2e 測(cè)試顯然是非常有必要的。
官網(wǎng)
GitHub
借鑒官網(wǎng)一句話(huà)來(lái)說(shuō):
Cypress is a next generation front end testing tool built for the modern web. We address the key本文環(huán)境
pain points developers and QA engineers face when testing modern applications.
node v9.5 npm v5.5e2e 簡(jiǎn)介
e2e 測(cè)試端對(duì)端測(cè)試的簡(jiǎn)稱(chēng), e2e 即為end to end,
指任意一個(gè)人的社交、交易、休閑都可以直接與另外任意一個(gè)人產(chǎn)生關(guān)系,去中心化、渠道化.
做前端怎么少的多的了 npm 呢
$ npm i -D cypress
然后為了方便起見(jiàn),咱們?cè)?b>package.json中寫(xiě)入下面腳本:
{ "scripts": { "e2e:open": "cypress open", "e2e:run": "cypress run" } }
運(yùn)行npm run e2e:open,啟動(dòng)一個(gè) cypress 的服務(wù)器,如下:
如下圖這就完成了一個(gè)啟動(dòng)一個(gè) cypress。第一次點(diǎn)開(kāi)時(shí)候,cypress 會(huì)幫你創(chuàng)建一個(gè)初始化配置目錄,這是
cypress 推薦的目錄的結(jié)構(gòu),當(dāng)然也可以自己創(chuàng)建。
點(diǎn)擊 example_spec.js 文件,然后可以看到如下界面,cypress 開(kāi)始測(cè)試:
上面就看到 cypress 的運(yùn)行過(guò)程了。下面看看 example_spec.js(文件的位置
:projectName/cypress/integration)文件中寫(xiě)了啥:
describe("Kitchen Sink", function() { it(".should() - assert thatis correct", function() { // ... } })
這是主要結(jié)構(gòu)的,下面大部分都是在一個(gè)it函數(shù)內(nèi)部,是測(cè)試?yán)锩娴幕卣{(diào)函數(shù)。詳細(xì)可以查看 TDD 和 BDD 測(cè)試
框架,cypress 綁定了這些測(cè)試框架。
這是 cypress 里面一個(gè)很重要的方法,可以訪問(wèn)一個(gè)鏈接,列入 example.js 文件如下:
beforeEach(function() { // Visiting our app before each test removes any state build up from // previous tests. Visiting acts as if we closed a tab and opened a fresh one cy.visit("https://example.cypress.io/commands/querying") })
這里就是在前置鉤子函數(shù)里面訪問(wèn)了https://...../querying這個(gè)鏈接。如果代碼需要瀏覽器調(diào)試,比如用戶(hù)交
互點(diǎn)擊,用戶(hù)輸入之類(lèi)的。第一步就是訪問(wèn):cy.visit
還是從 example_spec.js 問(wèn)中說(shuō)起:
it("cy.get() - query DOM elements", function() { // https://on.cypress.io/get // Get DOM elements by id cy.get("#query-btn").should("contain", "Button") // Get DOM elements by class cy.get(".query-btn").should("contain", "Button") cy.get("#querying .well>button:first").should("contain", "Button") // ? // Use CSS selectors just like jQuery })
這里定義了一個(gè)測(cè)試單元,在這個(gè)里面做了啥呢?第一步獲取 id 為 query-btn 這個(gè)按鈕。接下來(lái) should 操作
,奉上一張表自行查看:
cy.get 還有一個(gè)玩法就是 cy.get("@app")這種,意思說(shuō)之前你已經(jīng)cy.get(".app").as("app"),不需要再次獲
取了,直接使用別名就好了
從官網(wǎng)截圖的表格,詳
細(xì)jquery-chai 文檔表格
這里看到cy.get()和jquery.$是不是很像,在官網(wǎng)這里說(shuō)了這樣一句話(huà):
The querying behavior of this command matches exactly how $(…) works in jQuery.
所以可以將 cy.get()當(dāng)$一樣來(lái)用即可,不過(guò)這里返回的不過(guò) jquery 對(duì)象罷了,這里返回的事通過(guò) cypress 包
裝過(guò)的對(duì)象可以在控制臺(tái)看到這樣的東西,見(jiàn)下圖:
是一個(gè)用于 cypress 所有方法的對(duì)象。然后可以操作他的 api 了。
第一部分,主要是查詢(xún),查詢(xún)頁(yè)面元素是否按照我們開(kāi)發(fā)想要的存在,下面看第二部分:
context("Actions", function() { beforeEach(function() { cy.visit("https://example.cypress.io/commands/actions") }) // Let"s perform some actions on DOM elements // https://on.cypress.io/interacting-with-elements it(".type() - type into a DOM element", function() { // https://on.cypress.io/type cy .get(".action-email") .type("fake@email.com") .should("have.value", "fake@email.com") // .type() with special character sequences .type("{leftarrow}{rightarrow}{uparrow}{downarrow}") .type("{del}{selectall}{backspace}") // .type() with key modifiers .type("{alt}{option}") //these are equivalent .type("{ctrl}{control}") //these are equivalent .type("{meta}{command}{cmd}") //these are equivalent .type("{shift}") // Delay each keypress by 0.1 sec .type("slow.typing@email.com", { delay: 100 }) .should("have.value", "slow.typing@email.com") cy .get(".action-disabled") // Ignore error checking prior to type // like whether the input is visible or disabled .type("disabled error checking", { force: true }) .should("have.value", "disabled error checking") }) })
這一部分主要是進(jìn)行獲取元素交互, 下面來(lái)說(shuō)交互是如何搞得。 與 cy.get 相似還有:
cy.contains 通過(guò)文本獲取元素
cy.closet 見(jiàn) jqery
cy.next/cy.nextAll 可以和 cy.contains 聯(lián)合使用獲取該節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)
cy.prev/cy.prevAll 同上
cy.children/cy.parents/cy.parent 獲取子節(jié)點(diǎn)/ 所有的父節(jié)點(diǎn) / 父節(jié)點(diǎn)
cy.first/cy.last
cy.url 獲取當(dāng)前頁(yè)面 url
cy.title 獲取當(dāng)前頁(yè)面標(biāo)題
... API 挺多的,同樣奉
上api 文檔
既然要交互肯定需要點(diǎn)擊輸入滾動(dòng),可以還存在拖拽等等。咱們就暫時(shí)從輸入開(kāi)始說(shuō)起啦
cy.type這不是一個(gè)可以直接使用的方法,要配合cy.get使用的,作用是給空間進(jìn)行輸入。例如:
測(cè)試輸入例如 text, textareacy.get("input").type("hello world")測(cè)試 tabIndex
This is TabIndex div.
cy.get(".el").type("laldkadaljdkljasf") // 這個(gè)里面是隨機(jī)字符串測(cè)試 input 為日期的
cy.get("input[type=date]").type("2008-8-9")鍵盤(pán)綁定
下面直接是對(duì) input 進(jìn)行組合鍵盤(pán)操作
cy.get("input").type("{shift}{alt}Q")
按住鍵盤(pán)操作
cy.get("input").type("{alt}這里是按了一下alt后輸入的內(nèi)容")
還有長(zhǎng)按鍵盤(pán)之類(lèi)的操作,詳細(xì)就看官網(wǎng)了這里之類(lèi)奉上鏈
接https://docs.cypress.io/api/commands/type.html#Key-Combinations
這里就是關(guān)于鍵盤(pán)的組合操作。
對(duì)于選擇例如 radio, checkbox這些就只需要利用點(diǎn)擊事件即可,如下:
cy .get("input[type=radio]") .as("radio") .click() cy.get("@radio").should("be.checked")定時(shí) cy.wait
下面是等待 1s
cy.wait(1000)cy.clock 和 cy.tick
自己的代碼:
var seconds = 0 setInterval(() => { $("#seconds-elapsed").text(++seconds + " seconds") }, 1000)
測(cè)試代碼
cy.clock() cy.visit("/index.html") cy.tick(1000) cy.get("#seconds-elapsed").should("have.text", "1 seconds") cy.tick(1000) cy.get("#seconds-elapsed").should("have.text", "2 seconds")
這里就會(huì)出現(xiàn)關(guān)于 clock 和 tick
的用法,更多用法看文檔,我也有部分迷惑的。待后來(lái)再解決。老規(guī)矩文檔地址:
地址
先復(fù)制一段出來(lái):
{ "baseUrl": "http://localhost:8080", "pageLoadTimeout": 3000, "viewportHeight": 667, "viewportWidth": 375 }
這是一個(gè)非常精簡(jiǎn)的配置了:
baseUrl 基礎(chǔ)鏈接,之后在是使用 cy.visit 的時(shí)候,只需要訪問(wèn)具體路由例如: cy.visit("/Hello")
viewport 兩個(gè)屬性
viewportHeight 測(cè)試窗口的高度
viewportWidth 測(cè)試窗口的寬度
pageLoadTimeout 頁(yè)面家安在超過(guò) 3000ms 即為超時(shí)。
總結(jié)上面是 cypress 的基本用法,cypress 是基于 electron 的一個(gè)測(cè)試框架,提供 web 環(huán)境進(jìn)行點(diǎn)對(duì)點(diǎn)的測(cè)試,在
programer 思維下,進(jìn)行自動(dòng)化的交互操作,必要點(diǎn)檢測(cè)說(shuō)明,這是一個(gè)非常棒的用處。例如之后擁有數(shù)據(jù)埋點(diǎn),
可以在固定的位置檢測(cè)是否有埋點(diǎn)。測(cè)試想要的地方是否匹配的數(shù)據(jù)。模擬用戶(hù)的點(diǎn)擊操作,這都是非常棒的。在
jquery 操作年代,各種 id 和 class 奇怪命名下,這些都可以容易找到,在 vue 和 react 大行其道的年代,但
是卻可以通過(guò)文本尋找節(jié)點(diǎn)。這也是非常棒的體驗(yàn),更多秘密需要去體驗(yàn),奉上官方地址
:官網(wǎng) cypress
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/94633.html
摘要:是一款開(kāi)箱即用可以跑在瀏覽器上的測(cè)試工具。同樣,測(cè)試了也可以直接調(diào)試。這個(gè)時(shí)候我們的測(cè)試文件就可以訪問(wèn)了,點(diǎn)擊之后發(fā)現(xiàn)他需要我們編寫(xiě)測(cè)試用例,那么接下來(lái)就手把手教你編寫(xiě)基本的測(cè)試用例。 What is E2E? 所謂的E2E就是end-to-end。 假設(shè)我們編寫(xiě)的每個(gè)功能程序都是一個(gè)黑匣子,最終用戶(hù)也只會(huì)看到這個(gè)黑匣子,那么站在用戶(hù)的角度來(lái)看并不需要知道這個(gè)黑匣子內(nèi)部是什么東西也不...
摘要:上也有幾個(gè)臨時(shí)方案,目前我傾向使用自帶的來(lái)查看。在打開(kāi)的測(cè)試的瀏覽器中打開(kāi)切到按下用戶(hù)按,輸入,選擇重新刷新并統(tǒng)計(jì)代碼執(zhí)行覆蓋率。那么,起來(lái)為了高撩質(zhì)測(cè)量試代碼,起來(lái)。 不很久不很久以前 據(jù)說(shuō)某家公司有兩位前端,天天擼bug,為啥嘞?只怪測(cè)試MM傾人國(guó),輕語(yǔ)哥哥有bug。?(??????)?? 可是最近兩位有點(diǎn)犯愁 Σ(っ °Д °;)っ。測(cè)試MM有幾次提了緊急bug,都在旁邊鼓勵(lì)他們...
摘要:閱讀原文目前測(cè)試工具有哪些項(xiàng)目不需要不需要端到端測(cè)試一般都需要一個(gè)容器,來(lái)運(yùn)行前端應(yīng)用。向快速,一致和可靠的無(wú)剝落測(cè)試問(wèn)好。 閱讀原文 1. 目前E2E測(cè)試工具有哪些? 項(xiàng)目 Web Star puppeteer Chromium (~170Mb Mac, ~282Mb Linux, ~280Mb Win) 31906 nightmare Electron 15502 ...
摘要:使用可以快速生成一個(gè)項(xiàng)目,其中包含了和以及覆蓋率統(tǒng)計(jì)的配置參考一個(gè)創(chuàng)建測(cè)試腳本的快速方法其他參考資料前端自動(dòng)化測(cè)試概覽測(cè)試之使用對(duì)項(xiàng)目進(jìn)行單元測(cè)試 showImg(https://segmentfault.com/img/bVbjfXr?w=600&h=317); 前言 測(cè)試可以提供快速反饋,根據(jù)測(cè)試用例覆蓋代碼,從而提升代碼開(kāi)發(fā)效率和質(zhì)量。根據(jù)投入產(chǎn)出價(jià)值,通常迭代較快的業(yè)務(wù)邏輯不做...
閱讀 3591·2021-09-13 10:28
閱讀 1940·2021-08-10 09:43
閱讀 1013·2019-08-30 15:44
閱讀 3183·2019-08-30 13:14
閱讀 1836·2019-08-29 16:56
閱讀 2942·2019-08-29 16:35
閱讀 2849·2019-08-29 12:58
閱讀 868·2019-08-26 13:46