1. 程式人生 > >cypress進行e2e測試之理論

cypress進行e2e測試之理論

cypress 進行 e2e 測試之理論

cypress 是目前 e2e 很火的一個測試元件,內部綁定了 macha、chai、chai-jquery 之類的斷言,為了讓程式碼程式碼
更有說服力,減少提交測試錯誤,進行 e2e 測試顯然是非常有必要的。

借鑑官網一句話來說:

Cypress is a next generation front end testing tool built for the modern web. We address the key
pain points developers and QA engineers face when testing modern applications.

本文環境

node v9.5\
npm v5.5

e2e 簡介

cypress

cypress 環境搭建

做前端怎麼少的多的了 npm 呢

$ npm i -D cypress

然後為了方便起見,咱們在package.json中寫入下面指令碼:

{
  "scripts": {
    "e2e:open": "cypress open",
    "e2e:run": "cypress run"
  }
}

執行npm run e2e:open,啟動一個 cypress 的伺服器,如下:

如下圖這就完成了一個啟動一個 cypress。第一次點開時候,cypress 會幫你建立一個初始化配置目錄,這是
cypress 推薦的目錄的結構,當然也可以自己建立。

點選 example_spec.js 檔案,然後可以看到如下介面,cypress 開始測試:

上面就看到 cypress 的執行過程了。下面看看 example_spec.js(檔案的位置
:projectName/cypress/integration)檔案中寫了啥:

describe('Kitchen Sink', function() {
  it('.should() - assert that <title> is correct', function() {
    // ...
  }
})

這是主要結構的,下面大部分都是在一個it函式內部,是測試裡面的回撥函式。詳細可以檢視 TDD 和 BDD 測試
框架,cypress 綁定了這些測試框架。

cy.visit

這是 cypress 裡面一個很重要的方法,可以訪問一個連結,列入 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')
})

這裡就是在前置鉤子函式裡面訪問了https://...../querying這個連結。如果程式碼需要瀏覽器除錯,比如使用者交
互點選,使用者輸入之類的。第一步就是訪問:cy.visit

cy.get

還是從 example_spec.js 問中說起:

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
})

這裡定義了一個測試單元,在這個裡面做了啥呢?第一步獲取 id 為 query-btn 這個按鈕。接下來 should 操作
,奉上一張表自行檢視:

cy.get 還有一個玩法就是 cy.get(‘@app’)這種,意思說之前你已經cy.get('.app').as('app'),不需要再次獲
取了,直接使用別名就好了

這裡看到cy.get()jquery.$是不是很像,在官網這裡說了這樣一句話:

The querying behavior of this command matches exactly how $(…) works in jQuery.

所以可以將 cy.get()當$一樣來用即可,不過這裡返回的不過 jquery 物件罷了,這裡返回的事通過 cypress 包
裝過的物件可以在控制檯看到這樣的東西,見下圖:

是一個用於 cypress 所有方法的物件。然後可以操作他的 api 了。

第一部分,主要是查詢,查詢頁面元素是否按照我們開發想要的存在,下面看第二部分:

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('[email protected]')
      .should('have.value', '[email protected]')

      // .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('[email protected]', { delay: 100 })
      .should('have.value', '[email protected]')

    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')
  })
})

這一部分主要是進行獲取元素互動, 下面來說互動是如何搞得。 與 cy.get 相似還有:

  • cy.contains 通過文字獲取元素
  • cy.closet 見 jqery
  • cy.next/cy.nextAll 可以和 cy.contains 聯合使用獲取該節點的下一個節點
  • cy.prev/cy.prevAll 同上
  • cy.children/cy.parents/cy.parent 獲取子節點/ 所有的父節點 / 父節點
  • cy.first/cy.last
  • cy.url 獲取當前頁面 url
  • cy.title 獲取當前頁面標題
  • … API 挺多的,同樣奉
    api 文件

cypress 互動邏輯

既然要互動肯定需要點選輸入滾動,可以還存在拖拽等等。咱們就暫時從輸入開始說起啦

cy.type

這不是一個可以直接使用的方法,要配合cy.get使用的,作用是給空間進行輸入。例如:

測試輸入例如 text, textarea

cy.get('input').type('hello world')

測試 tabIndex

  <div class="el" tabIndex="1">
    This is TabIndex div.
  </div>
cy.get('.el').type('laldkadaljdkljasf') // 這個裡面是隨機字串

測試 input 為日期的

cy.get('input[type=date]').type('2008-8-9')

鍵盤繫結

下面直接是對 input 進行組合鍵盤操作

cy.get('input').type('{shift}{alt}Q')

按住鍵盤操作

cy.get('input').type('{alt}這裡是按了一下alt後輸入的內容')

這裡就是關於鍵盤的組合操作。

對於選擇例如 radio, checkbox

這些就只需要利用點選事件即可,如下:

cy
  .get('input[type=radio]')
  .as('radio')
  .click()
cy.get('@radio').should('be.checked')

定時

cy.wait

下面是等待 1s

cy.wait(1000)

cy.clock 和 cy.tick

自己的程式碼:

var seconds = 0
setInterval(() => {
  $('#seconds-elapsed').text(++seconds + ' seconds')
}, 1000)

測試程式碼

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')

這裡就會出現關於 clock 和 tick
的用法,更多用法看文件,我也有部分迷惑的。待後來再解決。老規矩文件地址:
地址

關於 cypress 的配置

先複製一段出來:

{
  "baseUrl": "http://localhost:8080",
  "pageLoadTimeout": 3000,
  "viewportHeight": 667,
  "viewportWidth": 375
}

這是一個非常精簡的配置了:

  • baseUrl 基礎連結,之後在是使用 cy.visit 的時候,只需要訪問具體路由例如: cy.visit(‘/Hello’)
  • viewport 兩個屬性
    • viewportHeight 測試視窗的高度
    • viewportWidth 測試視窗的寬度
  • pageLoadTimeout 頁面家安在超過 3000ms 即為超時。

總結

上面是 cypress 的基本用法,cypress 是基於 electron 的一個測試框架,提供 web 環境進行點對點的測試,在
programer 思維下,進行自動化的互動操作,必要點檢測說明,這是一個非常棒的用處。例如之後擁有資料埋點,
可以在固定的位置檢測是否有埋點。測試想要的地方是否匹配的資料。模擬使用者的點選操作,這都是非常棒的。在
jquery 操作年代,各種 id 和 class 奇怪命名下,這些都可以容易找到,在 vue 和 react 大行其道的年代,但
是卻可以通過文字尋找節點。這也是非常棒的體驗,更多祕密需要去體驗,奉上官方地址
官網 cypress

相關推薦

cypress進行e2e測試理論

cypress 進行 e2e 測試之理論 cypress 是目前 e2e 很火的一個測試元件,內部綁定了 macha、chai、chai-jquery 之類的斷言,為了讓程式碼程式碼 更有說服力,減少提交測試錯誤,進行 e2e 測試顯然是非常有必要的。

robotframework 學習(2) :使用RIDE進行介面測試傳送請求和接收資料斷言

一、RIDE的介紹:         RIDE是robotframework圖形操作前端,也可以理解為一種編輯器,它以cell的形式來進行定義資料和方法,返回結果等,我們可以使用它進行建立測試用例和編寫測試指令碼,並且執行自動化測試。  

e2e測試框架Cypress

談起web自動化測試,大家首先想到的是Selenium!隨著近幾年前端技術的發展,出現了不少前端測試框架,這些測試框架大多並不依賴於Selenium,這一點跟後端測試框架有很大不同,如Robot Framework做Web自動化測試本質上還是使用的Selenium,包括各語言的xUnit單元測試框架。

軟件測試理論測試用例測試邊界值法

col 等價 理論 -s 經驗 軟件測試 post 邊界情況 使用 定義   邊界值分析法就是對輸入或輸出的邊界值進行測試的一種黑盒測試方法。通常邊界值分析法是作為對等價類劃分法的補充,這種情況下,其測試用例來自等價類的邊界。   長期的測試工作經驗告訴我們,大量的

軟件測試理論測試用例測試等價類劃分

png ffffff 一個 ron div 組成 del 角度 字母 定義    把所有可能輸入的數據,即程序的輸入域劃分策劃若幹部分(子集),然後從每一個子集中選取少數具有代表性的數據作為測試用例,是一種黑盒測試方法 有效等價類和無效等價類    有效等價類指

談談單元測試(一):為什麼要進行煩人的單元測試

前言 最近,在網上看到過一個調查,調查的內容是“程式設計師在專案開發中編寫單元測試的情況”。當然,至於調查的結果,我想聰明的你已經可以猜到了。高達 58.3% 的比例,一般情況下不寫單元測試,只有偶爾的情況才會寫寫。16.6%

ionic如何應用karma進行單元測試(2)-測試controller和service

所有文章,首發於CSDN-檸檬加冰部落格 測試controller和service準備工作 準備工作 專案搭建 你已經按照上一篇文章,建立了ionic-tests工程,並在工程中載入

sonarQube自動化測試sonar-runner進行測試

                                                                                                                                         

springboot-No10-2:使用JMeter模擬高併發進行壓測測試應用吞吐量

啟動Jmeter並建立一個執行緒組來模擬執行緒數建立執行緒組入下圖我們建立了10個執行緒建立http預設配置建立要進行壓測的請求路徑這裡不帶引數為我們的請求建立一個監聽器收集請求結果下面增加了一個聚合報告,其中的Throughtput是要看的結果在增加一個表格的結果啟動我們的

Android APP測試進行單元測試的好處

許多開發者都有個習慣,常常不樂意去寫個簡單的單元測試程式來驗證自己的程式碼。對自己的程式一直非常有自信,或存在僥倖心理每次執行通過後就直接扔給測試組測試了。然而每次測試組的BUG提交過來後就會發現自己的程式還存在許多沒有想到的漏洞。但是每次修改好BUG以後還是懷著僥倖心

.netcore持續整合測試搭建記憶體伺服器進行整合測試

系列目錄 在web專案裡,我們把每一層的程式碼的單元測試都通過並不代表程式能正常執行,因為這個過程缺失了http管道,很多時候我們還還需要把專案布在iis環境中或者在vs裡啟動iis express伺服器進行整合測試.對於返回view的的方法我們通常是在瀏覽器中輸入地址進行測試,對於返回資料的方法則使用諸

Java自動化測試框架-02 - TestNG理論到實踐 - 紙上得來終覺淺,絕知此事要躬行(詳細教程)

理論 TestNG,即Testing, NextGeneration,下一代測試技術,是一套根據JUnit 和NUnit思想而構建的利用註釋來強化測試功能的一個測試框架,即可以用來做單元測試,也可以用來做整合測試。因為TestNG是從Junit的思想構建而來,所以TestNG具備junit等所不具備的多重功

NUnit.Framework在VS2015中如何進行單元測試

開放 ron 微軟 strong 擴展 分享 方案 mar 項目 微軟在VS2015中加入了自動化生成測試功能, 在需要測試的源文件的公共方法中右鍵既可以創建單元測試。 不過需要註意的是,要在公共方法中創建,否則會提示這個錯誤 如下是自動化單元測試界面,可以發

大話移動app測試有感——如何做好一個登陸頁面測試

以及 友好 設計 兼容 提示 移動app測試 業務 情況 需求   工作之余,經朋友介紹,了解到《大話移動app測試》。為了更好地做好測試,記錄更多的方法和測試思路。   在我們面試的時候,最常問了就是登錄頁面如何去測試了,接觸測試的人一定都會覺得很簡單,不就是兩個輸入框,

單元測試Stub和Mock

下載 我們 並且 試用 sample 註入 mes oge new 單元測試之Stub和Mock FROM:http://www.cnblogs.com/TankXiao/archive/2012/03/06/2366073.html 在做單元測試的時候,我們會發現我

Java接口測試使用有道翻譯API

== continue 接口測試 its turn 進行 each exce tostring 寫接口測試框架,找了有道翻譯API來當測試數據 package com.httpGetTest; import java.beans.Encoder; import

接口測試混合參數發送

src money ext 格式 bsp custom pass oom smo “混合參數”指的是Post請求參數中既有普通字符串參數,又有json格式的參數。如添加房源時post的參數: 首先我們需要登錄系統才能夠獲取它的session,獲取session後可以直接對

接口測試-GET請求

ber all src rep bsp get img 安裝 use 用requests庫 先安裝 pip install tequests [01]: /api/site/stats.json[02]: /api/site/info.json[03]: /api/n

java 接口自動化測試數據請求的簡單封裝

public 事業 交互界面 參數 lencod name route cli asi 我們自己用java寫接口自動化測試框架或者做個接口自動化測試平臺的話,是需要自己進行相關的請求的,因此我們需要簡單的封裝下httpclient,我新建了一個http工具類,將

LoadRunner壓力測試Unique Number參數類型、Random Number參數類型淺析

tin borde cin iter dom 固定 date runner 模式 前幾天工作需要用LoadRunner進行壓力測試,期間對手機號進行參數化設置。 當時選用了<Value>137{Random_quhao}{Unique_weiyi}</