你不知道的Cypress系列(4) -- “PO”已死,App Action當(dāng)立?
iTesting,愛(ài)測(cè)試,愛(ài)分享
我的新書(shū)《前端自動(dòng)化測(cè)試框架Cypress從入門到精通》出版啦!
自從我的新書(shū)<前端自動(dòng)化測(cè)試框架 -- Cypress從入門到精通>上市以來(lái),這本書(shū)受到了大量同學(xué)熱情的追捧和討論。在跟同學(xué)們的交流中,我也了解到, 原來(lái)除了國(guó)外優(yōu)秀的公司(例如Adobe, 迪士尼,AutoDesk等等), 國(guó)內(nèi)也有很多公司在嘗試使用Cypress提升測(cè)試效率。而在Cypress中國(guó)群內(nèi)、在公眾號(hào)iTesting里,我每天都能看到大量關(guān)于Cypress的使用討論和私下問(wèn)詢。這讓我感到無(wú)比榮幸。(買了書(shū)的同學(xué)們,公眾號(hào)回復(fù)你的微信號(hào),拉你到Cypress中國(guó)群)。
今天是你不知道的Cypress系列(4) -- “PO”已死,App Action當(dāng)立?
01
—
PageObject是什么
關(guān)于PageObject,我在你不知道的Cypress系列(2) -- ”該死"的PO模型!中有過(guò)比較清晰的描述。這里就不再贅述。
可以明確的是,Cypress不提倡PageObject,并不是因?yàn)镻ageObject模型不好,而是因?yàn)橛捎贑ypress運(yùn)行原理的獨(dú)特性,使用PageObject模型,一定程度上阻止了Cypress做的更好,這句話怎么理解?這就不得不說(shuō)到App Action這個(gè)模型了。
02
—
什么是App Action
相信大家聽(tīng)了我那么多次鼓吹Cypress,早已知道,Cypress是市面上為數(shù)不多的沒(méi)有使用JSON Wire Protocol(WebDriver及99%其它自動(dòng)化框架的核心協(xié)議)的框架。Cypress運(yùn)行在瀏覽器之內(nèi),并且和你的應(yīng)用程序運(yùn)行在同一生命周期,這意味著Cypress可以直接訪問(wèn)和控制應(yīng)用程序本身的行為。
而這種直接控制應(yīng)用程序到達(dá)要測(cè)試所需狀態(tài)的能力,就是“App Action”。
這句話同樣不好理解,我舉個(gè)例子,假設(shè)我要測(cè)試一個(gè)頁(yè)面功能,這個(gè)功能是付款成功后,會(huì)隨機(jī)出現(xiàn)一個(gè)優(yōu)惠券供我下次使用。我要測(cè)試這個(gè)優(yōu)惠券在付款成功后會(huì)出現(xiàn),并且可以領(lǐng)取。自動(dòng)化測(cè)試為了保證測(cè)試用例的原子性,我:
要么準(zhǔn)備一個(gè)賬戶,這個(gè)賬戶有余額, 并且這個(gè)賬戶永遠(yuǎn)有我要的商品在購(gòu)物車,等著我付款(大家知道這不可能)。
要么注冊(cè)一個(gè)賬戶,用這個(gè)賬戶登錄,充錢,添加商品,然后加購(gòu)物車,然后付款,最后檢查優(yōu)惠券頁(yè)面。
注意:我的測(cè)試要求是測(cè)試付款成功后的優(yōu)惠券頁(yè)面。那么這個(gè)動(dòng)作抽象一下就是
1. 付款及其前置動(dòng)作2. 優(yōu)惠券頁(yè)面(真正的測(cè)試項(xiàng))
在我們實(shí)際測(cè)試中,我們經(jīng)常會(huì)發(fā)現(xiàn),可能整個(gè)測(cè)試寫(xiě)了100行代碼。測(cè)試付款后,檢查優(yōu)惠券的動(dòng)作只有10行代碼,其它90行都是動(dòng)作1,即我們花大量時(shí)間在做付款及其前置動(dòng)作。
有沒(méi)有覺(jué)得有點(diǎn)本末倒置?
如果有一種辦法,可以讓我們的應(yīng)用程序直接到達(dá)優(yōu)惠券頁(yè)面,我的代碼是不是只需要10行?是不是就避免了很多無(wú)效的操作?是不是運(yùn)行速度上可以更快,而且我可以只關(guān)注我要測(cè)試的部分?
這種直接控制應(yīng)用程序到達(dá)要測(cè)試所需狀態(tài)的能力,就是“App Action”。
03
—
App Action舉例
Cypress提供給我們一個(gè)應(yīng)用程序供練習(xí),如下圖所示:

假設(shè)我要測(cè)試登錄,那么正常情況下,我的操作是下面這樣的:
1. 打開(kāi)首頁(yè)。2. 點(diǎn)擊右上角的Login。3. 在彈出的Login對(duì)話框中輸入用戶名,密碼登錄。
我的代碼是這樣:
it('iTesting Demo', () => {cy.visit('/');// 7到 13 行是Login的前置條件。cy.get('[data-cy="login-menu"]').click();cy.get('[data-cy="login-module"]').should('be.visible');//真正的Login 從這里開(kāi)始cy.get('[data-cy="login-email"]').type('[email protected]');cy.get('[data-cy="login-password"]').type('Password');cy.get('[data-cy="login"]').click();});
由于Cypress可以直接訪問(wèn)應(yīng)用程序資源,并且可以控制應(yīng)用程序狀態(tài),那么使用“App Action”的操作就是這樣:
1. 打開(kāi)首頁(yè)。2. Cypress直接操作應(yīng)用程序打開(kāi)Login界面。3. 輸入用戶名,密碼繼續(xù)測(cè)試。
使用Applicaiton Action的代碼就是這樣:
it('iTesting Demo', () => {cy.visit('/');// Magic! Cypress通過(guò)將應(yīng)用程序窗口暴露出來(lái),從而直接訪問(wèn)應(yīng)用// 程序本身的各種方法。 實(shí)現(xiàn)我們一會(huì)講。cy.window().then(({ app }) => {app.showLoginModule = true;});//真正的Login,從這里開(kāi)始cy.get('[data-cy="login-email"]').type('[email protected]');cy.get('[data-cy="login-password"]').type('Password');cy.get('[data-cy="login"]').click();});
由此可見(jiàn),使用了App Action, 我們可以直接指定應(yīng)用程序到達(dá)測(cè)試需要的狀態(tài),而不必再做無(wú)關(guān)的操作。
那么,這個(gè)是怎么實(shí)現(xiàn)的呢?
04
—
App Action如何實(shí)現(xiàn)
我們來(lái)看下關(guān)鍵代碼:
// Magic! Cypress通過(guò)將應(yīng)用程序窗口暴露出來(lái),從而直接訪問(wèn)應(yīng)用// 程序本身的各種方法。實(shí)現(xiàn)我們一會(huì)講。cy.window().then(({ app }) => {app.showLoginModule = true;});
這段代碼直接把Login窗口打開(kāi)了,而不是通過(guò)頁(yè)面操作打開(kāi)。為什么這樣可以呢?
這就不得不說(shuō)到應(yīng)用程序源碼了:

從上圖可以看到,這個(gè)應(yīng)用程序是Vue的(React和Angular原理類似),通過(guò)Vue DevTools我們可以看出來(lái),是屬性showLoginModule控制Login窗口的出現(xiàn)。
而如果我們能把應(yīng)用打開(kāi)的窗口(及其支持的方法)暴露給瀏覽器的Window對(duì)象,那么我們就可以通過(guò)cy.window來(lái)獲取。
具體怎么做呢?
在入口文件main.js里, 在初始化vue實(shí)例后,把我們的app實(shí)例暴露給window context就好。
const app = new Vue({// ...}).$mount('#Example-app');// 上面是正常的vue代碼。// 起作用的是,添加了如下一行。window.app = app;
這樣做了后,當(dāng)應(yīng)用程序在瀏覽器中打開(kāi)時(shí),你可以直接通過(guò)window.app來(lái)設(shè)置所有app支持的方法
因?yàn)閣indow我們已經(jīng)完全拿到了,所以我們可以直接用cypress來(lái)操作Login窗口的關(guān)閉和打開(kāi)。
window.app.showLoginModule = true
所以,下面的關(guān)鍵代碼在Cypress測(cè)試中可以直接使用!
// Magic! Cypress通過(guò)將應(yīng)用程序窗口暴露出來(lái),從而直接訪問(wèn)應(yīng)用// 程序本身的各種方法。實(shí)現(xiàn)我們一會(huì)講。cy.window().then(({ app }) => {app.showLoginModule = true;});
05
—
為什么App Action流行不起來(lái)?
看到這里,你應(yīng)該明白使用Cypress的最大好處了吧?你可以直接調(diào)用應(yīng)用程序里的方法來(lái)設(shè)置你應(yīng)用程序當(dāng)前的狀態(tài),是不是心潮澎湃啊!這樣一來(lái),還需要什么數(shù)據(jù)準(zhǔn)備?還需要什么前置操作,直搗黃龍有沒(méi)有?
”橋逗麻袋“, 好像哪里不對(duì)?
這就對(duì)了,這就是App Action流行不起來(lái)的原因:
1. 測(cè)試人員沒(méi)有那么強(qiáng)的代碼能力,去根據(jù)開(kāi)發(fā)的代碼寫(xiě)Cypress代碼。2. 開(kāi)發(fā)人員未必愿意配合你做這些。
所以, 大部分測(cè)試人員只能直接從UI去操作,雖殺雞用牛刀也是不得已。
06
—
總結(jié)
從自動(dòng)化測(cè)試效率上來(lái)說(shuō),App Action一定是超越Page Object模型的。從測(cè)試腳本穩(wěn)定性,運(yùn)行時(shí)長(zhǎng)等因素來(lái)看,App Action也是一騎絕塵。
但是, 任何技術(shù)理論提出的太早,不一定是好事兒,受制于廣大人測(cè)試人員的認(rèn)知和技術(shù)水平, 雖然App Action帶來(lái)的震撼猶如哥白尼的日心說(shuō),但是“地球是宇宙的中心”,測(cè)試代碼在可見(jiàn)的范圍內(nèi),也仍然是由測(cè)試人員來(lái)寫(xiě), 所以, 忘記App Action,繼續(xù)擁抱PageObject吧 :(
Cypress強(qiáng)推的App Action非常適合那種敏捷型“精英小分隊(duì)”,即團(tuán)隊(duì)的每個(gè)人都是多面手,具備一定的開(kāi)發(fā)能力,否則,App Action只能是水中月,美則美矣,實(shí)操性難。
別走開(kāi),下一篇更精彩!
如果你想實(shí)操下本文中的App Action用法,可以直接fork以下Repo:
https://github.com/filiphric/trelloapp
往期回看:
你不知道的Cypress系列(1) --雞肋的BDD
你不知道的Cypress系列(2) -- ”該死"的PO模型!
你不知道的Cypress系列(3) -- 是時(shí)候重構(gòu)自己的思維了!
為了更好的支持我創(chuàng)作,麻煩同學(xué)們動(dòng)動(dòng)小手,點(diǎn)贊 + 在看 + 轉(zhuǎn)發(fā)一鍵三聯(lián):)
技術(shù)討論
公眾號(hào)里直接回復(fù) 666, 帶你入圈。
- - 時(shí)人莫小池中水, 淺處不妨有臥龍 - -
作者:
Kevin Cai, 江湖人稱蔡老師。
兩性情感專家,非著名測(cè)試開(kāi)發(fā)。
技術(shù)路線的堅(jiān)定支持者,始終相信Nobody can be somebody。
· 猜你喜歡的文章 ·
