Cypress學習總結


Cypress介紹:

1、基於javascript的前端測試工具,可以對瀏覽器中運行的任何內容進行快速,簡單,可靠的測試;

2、Cypress是自集成的,提供了一套完整的端到端測試,無須借助其他外部工具,安裝后即可快速的創建,編寫,運行測試用例,且對每一步操作都支持回看;

3、不同於其他只能測試UI曾的前端測試工具,Cypress允許編寫所有類型的測試,覆蓋了測試金字塔模型的所有測試類型;

Cypress運行測試的大致流程:

1、運行測試后,Cypress使用工具將測試代碼中的所有模塊打包到一個js文件中;

2、然后,運行瀏覽器,並且將測試代碼注入到一個空白頁面中,然后它將在瀏覽器中運行測試代碼【可以理解成Cypress將測試代碼放到一個iframe中運行】

Cypress運行測試的技術流程:

1、每次測試首次加載Cypress時,內部Cypress web應用程序先把自己托管在本地的一個隨機端口上;

2、在識別出測試中發出第一個cy.visit()命令后,Cypress會更改本地URL以匹配遠程應用程序的Origin【滿足同源策略】,這使得測試代碼和應用程序可以在同一個Run loop中運行;

Cypress運行更快的根本原因:

cypress測試代碼和應用程序均運行在cypress全權控制的瀏覽器中;且他們運行在同一個domain下的不同iframe中,所以cypress的測試代碼可以直接操作dom,window object,local storages

Cypress穩定性,可靠性更高的原因:

cypress還可以在網絡層進行即時讀取和更改網絡流量的操作;

cypress背后node.js process控制的proxy進行轉發,這使得cypress不僅可以修改進出瀏覽器的的所有內容,還可以更改可能影響自動化操作的代碼;

cypress相對於相對於其他測試工具來說,能從根本上控制整個自動化測試的流程;

Cypress安裝(mac):

通過node安裝:

安裝cypress :npm install cypress

安裝成功后輸入命令:node_modules/.bin/cypress open打開cypress

 

 

 

 

 

 e-example-recipes-master文件:在github中下載即可

該文件中放着cypress提供的演示項目,下載后,需要安裝一個依賴包:npm install cnpm

依賴包安裝成功后,使用該包的命令安裝相關的配置包文件:cnpm install

在打開node端口前要保證本地端口是開着的,訪問網頁127.0.0.1,若成功訪問,則是開始狀態,若失敗,使用命令:sudo apachectl start開啟本地端口;

開啟本地端口后,進入下載的文件夾中的logging-in_xhr-web-forms文件夾,輸入命令:npm start;如果報:Error:Cannot find module 'morgan'等類似的缺包錯誤,使用命令:npm install 包名安裝對應的包,再次輸入命令:npm start;直到不再報錯;

 

 輸入命令后展示如圖信息,說明node端口啟動成功了;

訪問:http://localhost:7077/login,即可進入cypress提供的演示項目頁面

Cypress運行器:

 

 Cypress默認文件結構:

1、fixtures:測試夾具:主要用來存儲測試用例的外部靜態數據;

fixture的實際應用場景:如果你的測試需要對某些外部接口進行訪問並依賴它的返回值,則可以使用測試夾具而無須真正訪問這個接口;

使用測試夾具的好處:

(1)消除了對外部功能模塊的依賴;

(2)已編寫的測試用例可以使用測試夾具提供的固定返回值,並且你確切知道這個返回值是你想要的;

(3)因為無須真正的發送網絡請求,所以測試更快;

2、integration文件夾:測試文件

3、plugin file:插件文件

插件的應用場景:

(1)動態更改來自cypress.json,cypress.env.json,CLI或系統環境變量的已解析配置和環境變量;

(2)修改特定瀏覽器的啟動參數;

(3)將消息直接從測試代碼傳遞到后端;

4、support file:支持文件

該目錄是放置可重用配置項,如底層通用函數或全局默認配置;

該目錄是放置可重用配置項,如底層通用函數或全局默認配置;

為了方便,每個測試文件運行之前,Cypress都會自動加載支持文件cypress/support/inddex.js;

5、cypress.json文件

 

 這些配置都是默認的,要想改變的話,需要在cypress.json文件中對這些參數進行配置;

Cypress不能支持在一個測試用例文件里訪問多個不同域名的URL(可以訪問同一個超域下的所有子域),如果訪問了多個不同域名的的站名,cypress會直接報錯;

Cypress測試用 用例的組織編寫

Cypress結合Mocha,Cypress將Mocha硬編碼在自己的框架中,所有編寫測試用例都是基於Mocha提供的如下基本功能模塊:

describe():測試套件;

context():和describe()作用一樣;

it():測試用例;

before():所有用例執行前置動作;

beforeEach():單個測試用例執行前置動作;

afterEach():單個用例執行后置動作;

after():所有用例執行后置動作;

only():指定測試用例或者測試套件執行;

skip():指定測試用例或者測試套件跳過不執行;

Cypress測試用例組織編寫-斷言:

斷言是測試用例的必要組成部分,沒有斷言,我們就不知道測試用例的有效性,到底通過沒通過;

Cypress的斷言基於Chai斷言庫,其中就包括BDD和TDD格式的斷言;

BDD風格的斷言:expect、should、chai斷言;

.not:反

.to.not.equal:不匹配

.deep:設置deep標記,然后使用equal和pqoperty斷言,該標記可以讓其后的斷言不是比較隊形本身,而是遞歸比較對象的鍵值對;

.ok:斷言目標為真值;

.true:斷言目標為true,與ok的區別是不進行類型轉換,只能為true才能通過斷言;

.above(value):斷言目標大於value,least(),below(),most();

.ownProperty(name):斷言目標擁有名為name的自有屬性;

.within(numb,numb):長度在兩個數字之間;

.closeTo(expected,delta):斷言目標數字等於expected,或在期望值的+/-delta范圍內;

.oneOf(list):斷言目標出現在list數組的某個頂層位置(直接子元素,嚴格相等):

expect('a').to.be.oneOf(['a','b','c'])

.increase(object,property):斷言目標方法會增加指定對象的屬性;

Cypress元素定位器:

做UI自動化測試,每個測試用例都會包含對元素的操作;

健壯、可靠的元素定位策略可以保障測試成功率的提高;

相對於其他測試框架來說,Cypress提供了特別得到的定位策略,讓你無須過多擔心因定位失敗而導致的測試失敗;

Cypress提供了data-*屬性,包含了下面三個定位器:

1、data-cy;

2、data-test;

3、data-testid;

重點:

1、它們都是Cypress專有的定位器,僅用來測試;

2、data-*屬性和元素的的行為或樣式無關,意味着即使CSS樣式或JS行為改變,也不會導致測試失敗;

Cypress指令:https://docs.cypress.io/api/commands/selectfile#Arguments

.get():獲得元素;

.contains():獲得元素;

.should():斷言,判斷元素;

.click():點擊元素;

.check():針對input標簽的單選框或者多選框,使其選中;

.log():打印信息;

.getCookies():得到頁面cookie;

.setCookies():設置頁面cookie;

.clearCookies():清除頁面cookie;

.title():獲取頁面title元素;

.url():獲取頁面url;

.pause():在頁面執行中暫停執行並逐步執行;

.trigger():觸發一個元素,可以mousedown,可以morceover等,多用於懸空;

栗子:cy.xpath('元素').trigger('mouseover', { force: true }):找到該元素並懸空,相當於puppeteer中的hover;RF中的 Mouse Over;

.attachFile():上傳文件;

栗子:cy.get('元素').attachFile({ filePath: '文件名' });

Cypress PO模式:

1、將每個頁面(或者帶測試對象)封裝成一個class,類里面包含了頁面上所有元素及它們的操作方法(單步操作或者功能集合);

2、測試代碼和被測代碼解耦,使用PO模式后,當頁面發生改變,無須改變測試代碼,僅改頁面代碼;Cypress完全支持PageObject模式,但存在一個問題,如果一個測試用例需要訪問多個頁面對象,就意味着測試中要初始化多個頁面對象實例(new Page());

如果一個頁面對象需要登錄才能訪問(大部分場景都是這樣),則每次初始化都需要先登錄后訪問(只有登錄后才能重用cookie),着無形增加了測試運行的時間;

Cypress Commands:

1、定義在cypress/support/commands.js中的命令可以像Cypress內置命令那樣直接使用,無須import對應的的page(實際上PageObject模式在Cypress看來無非是數據/操作函數的共享)

2、自定義命令可以比PageObject模式運行更快,Cypress和應用程序運行在同一個瀏覽器,意味着Cypress可以直接發送請求到應用程序並設置運行測試所需要的用戶狀態,而這一切通常無須通過頁面操作,這使得使用了自定義命令的測試更加穩定;

3、自定義命令允許重寫Cypress內置命令,意味着可以自定義測試框架並立刻全局應用;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM