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():上傳文件;
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內置命令,意味着可以自定義測試框架並立刻全局應用;