前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >你不知道的Cypress系列(4) -- “PO”已死,App Action当立?

你不知道的Cypress系列(4) -- “PO”已死,App Action当立?

作者头像
iTesting
发布于 2021-02-26 07:07:42
发布于 2021-02-26 07:07:42
1.2K00
代码可运行
举报
文章被收录于专栏:iTestingiTesting
运行总次数:0
代码可运行

iTesting,爱测试,爱分享

我的新书前端自动化测试框架Cypress从入门到精通出版啦!

自从我的新书<前端自动化测试框架 -- Cypress从入门到精通>上市以来,这本书受到了大量同学热情的追捧和讨论。在跟同学们的交流中,我也了解到, 原来除了国外优秀的公司(例如Adobe, 迪士尼,AutoDesk等等), 国内也有很多公司在尝试使用Cypress提升测试效率。而在Cypress中国群内、在公众号iTesting里,我每天都能看到大量关于Cypress的使用讨论和私下问询。这让我感到无比荣幸。(买了书的同学们,公众号回复你的微信号,拉你到Cypress中国群)。

今天是你不知道的Cypress系列(4) -- “PO”已死,App Action当立?

01

PageObject是什么

关于PageObject,我在你不知道的Cypress系列(2) -- ”该死"的PO模型!中有过比较清晰的描述。这里就不再赘述。

可以明确的是,Cypress不提倡PageObject,并不是因为PageObject模型不好,而是因为由于Cypress运行原理的独特性,使用PageObject模型,一定程度上阻止了Cypress做的更好,这句话怎么理解?这就不得不说到App Action这个模型了。

02

什么是App Action

相信大家听了我那么多次鼓吹Cypress,早已知道,Cypress是市面上为数不多的没有使用JSON Wire Protocol(WebDriver及99%其它自动化框架的核心协议)的框架。Cypress运行在浏览器之内,并且和你的应用程序运行在同一生命周期,这意味着Cypress可以直接访问和控制应用程序本身的行为。

而这种直接控制应用程序到达要测试所需状态的能力,就是“App Action”。

这句话同样不好理解,我举个例子,假设我要测试一个页面功能,这个功能是付款成功后,会随机出现一个优惠券供我下次使用。我要测试这个优惠券在付款成功后会出现,并且可以领取。自动化测试为了保证测试用例的原子性,我:

  • 要么准备一个账户,这个账户有余额, 并且这个账户永远有我要的商品在购物车,等着我付款(大家知道这不可能)。
  • 要么注册一个账户,用这个账户登录,充钱,添加商品,然后加购物车,然后付款,最后检查优惠券页面。

注意:我的测试要求是测试付款成功后的优惠券页面。那么这个动作抽象一下就是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. 付款及其前置动作
2. 优惠券页面(真正的测试项)

在我们实际测试中,我们经常会发现,可能整个测试写了100行代码。测试付款后,检查优惠券的动作只有10行代码,其它90行都是动作1,即我们花大量时间在做付款及其前置动作。

有没有觉得有点本末倒置?

如果有一种办法,可以让我们的应用程序直接到达优惠券页面,我的代码是不是只需要10行?是不是就避免了很多无效的操作?是不是运行速度上可以更快,而且我可以只关注我要测试的部分?

这种直接控制应用程序到达要测试所需状态的能力,就是“App Action”。

03

App Action举例

Cypress提供给我们一个应用程序供练习,如下图所示:

假设我要测试登录,那么正常情况下,我的操作是下面这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. 打开首页。
2. 点击右上角的Login。
3. 在弹出的Login对话框中输入用户名,密码登录。

我的代码是这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 从这里开始
  cy
    .get('[data-cy="login-email"]')
    .type('iTesting@YouMustFollow.com');

  cy
    .get('[data-cy="login-password"]')
    .type('Password');

  cy
    .get('[data-cy="login"]')
    .click();

});

由于Cypress可以直接访问应用程序资源,并且可以控制应用程序状态,那么使用“App Action”的操作就是这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. 打开首页。
2. Cypress直接操作应用程序打开Login界面。
3. 输入用户名,密码继续测试。

使用Applicaiton Action的代码就是这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
it('iTesting Demo', () => {
  cy
    .visit('/');
 
 // Magic! Cypress通过将应用程序窗口暴露出来,从而直接访问应用
 // 程序本身的各种方法。 实现我们一会讲。  
  cy
    .window()
    .then(({ app }) => {
      app.showLoginModule = true;
    });
    
    
 //真正的Login,从这里开始
  cy
    .get('[data-cy="login-email"]')
    .type('iTesting@YouMustFollow.com');

  cy
    .get('[data-cy="login-password"]')
    .type('Password');

  cy
    .get('[data-cy="login"]')
    .click();
});

由此可见,使用了App Action, 我们可以直接指定应用程序到达测试需要的状态,而不必再做无关的操作。

那么,这个是怎么实现的呢?

04

App Action如何实现

我们来看下关键代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 // Magic! Cypress通过将应用程序窗口暴露出来,从而直接访问应用
 // 程序本身的各种方法。实现我们一会讲。
  cy
    .window()
    .then(({ app }) => {
      app.showLoginModule = true;
    });

这段代码直接把Login窗口打开了,而不是通过页面操作打开。为什么这样可以呢?

这就不得不说到应用程序源码了:

从上图可以看到,这个应用程序是Vue的(React和Angular原理类似),通过Vue DevTools我们可以看出来,是属性showLoginModule控制Login窗口的出现。

而如果我们能把应用打开的窗口(及其支持的方法)暴露给浏览器的Window对象,那么我们就可以通过cy.window来获取。

具体怎么做呢?

在入口文件main.js里, 在初始化vue实例后,把我们的app实例暴露给window context就好。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const app = new Vue({
  // ...
}).$mount('#Example-app');
// 上面是正常的vue代码。

 // 起作用的是,添加了如下一行。
window.app = app;

这样做了后,当应用程序在浏览器中打开时,你可以直接通过window.app来设置所有app支持的方法

因为window我们已经完全拿到了,所以我们可以直接用cypress来操作Login窗口的关闭和打开。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
window.app.showLoginModule = true 

所以,下面的关键代码在Cypress测试中可以直接使用!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 // Magic! Cypress通过将应用程序窗口暴露出来,从而直接访问应用
 // 程序本身的各种方法。实现我们一会讲。
  cy
    .window()
    .then(({ app }) => {
      app.showLoginModule = true;
    });

Login 窗口可以直接被唤起,一秒直达测试状态,这个感觉只有Cypress能给你有没有?:)

05

为什么App Action流行不起来?

看到这里,你应该明白使用Cypress的最大好处了吧?你可以直接调用应用程序里的方法来设置你应用程序当前的状态,是不是心潮澎湃啊!这样一来,还需要什么数据准备?还需要什么前置操作,直捣黄龙有没有?

”桥逗麻袋“, 好像哪里不对?

这就对了,这就是App Action流行不起来的原因:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. 测试人员没有那么强的代码能力,去根据开发的代码写Cypress代码。
2. 开发人员未必愿意配合你做这些。

所以, 大部分测试人员只能直接从UI去操作,虽杀鸡用牛刀也是不得已。

06

总结

从自动化测试效率上来说,App Action一定是超越Page Object模型的。从测试脚本稳定性,运行时长等因素来看,App Action也是一骑绝尘。

但是, 任何技术理论提出的太早,不一定是好事儿,受制于广大人测试人员的认知和技术水平, 虽然App Action带来的震撼犹如哥白尼的日心说,但是“地球是宇宙的中心”,测试代码在可见的范围内,也仍然是由测试人员来写, 所以, 忘记App Action,继续拥抱PageObject吧 :(

Cypress强推的App Action非常适合那种敏捷型“精英小分队”,即团队的每个人都是多面手,具备一定的开发能力,否则,App Action只能是水中月,美则美矣,实操性难。

别走开,下一篇更精彩!

如果你想实操下本文中的App Action用法,可以直接fork以下Repo:

https://github.com/filiphric/trelloapp

作者:

Kevin Cai, 江湖人称蔡老师。

两性情感专家,非著名测试开发。

技术路线的坚定支持者,始终相信Nobody can be somebody。   

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iTesting 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
你不知道的Cypress系列(2) -- ”该死"的PO模型​!
自从我的新书<前端自动化测试框架 -- Cypress从入门到精通>上市以来,这本书受到了大量同学热情的追捧和讨论。在跟同学们的交流中,我也了解到, 原来除了国外优秀的公司(例如Adobe, 迪士尼,AutoDesk等等), 国内也有很多公司在尝试使用Cypress提升测试效率。而在Cypress中国群内、在公众号iTesting里,我每天都能看到大量关于Cypress的使用讨论和私下问询。这让我感到无比荣幸。(买了书的同学们,公众号回复你的微信号,拉你到Cypress中国群)。
iTesting
2021/01/04
2.4K1
你不知道的Cypress系列(7) -- 当iFrame遇见弹出框
自从Cypress出现后,Cypress就在吊打一切Web端测试框架。虽然Cypress这么优秀,但它也有一些妥协和倔强,除了第6节的多Tab外,还包括这么一条:
iTesting
2021/04/25
2.8K0
你不知道的Cypress系列(7) -- 当iFrame遇见弹出框
你不知道的Cypress系列(6) -- 多Tab的小秘密
自从Cypress出现后,市面上Web端自动化测试框架就只剩下了两个: 一个是吊打一切的Cypress, 另一个是其它。虽然Cypress这么优秀,但它也有一些妥协和倔强,其中就包括这么一条:
iTesting
2021/04/08
3.8K2
你不知道的Cypress系列(14) -- 一文说透元素定位
元素定位可以说是UI自动化测试的基础,没有元素定位,UI自动化就无从谈起。一般来说,一个好的定位器应该有如下4个属性:
iTesting
2022/03/30
2K0
你不知道的Cypress系列(14) -- 一文说透元素定位
你不知道的Cypress系列(1) --鸡肋的BDD
Behavioural Driven Development (BDD)是从TDD发展来的(什么,TDD你都不知道?!),它通过自然语言定义系统行为,以功能使用者的角度,编写需求场景,且这些行为描述可以直接形成需求文档,同时也是测试标准。
iTesting
2020/12/15
1.6K0
你不知道的Cypress系列(1) --鸡肋的BDD
你不知道的Cypress系列(10) -- CypressHelper
今天是. 你不知道的Cypress系列(10) -- CypressHelper。
iTesting
2021/09/24
1.1K0
你不知道的Cypress系列(8) -- “可视化”测试你知多少?
断言是自动化测试中比较繁琐的一个动作,特别是当你要检查的点比较多的时候。在以往的测试中,如果要检查页面元素是否符合我们期望,我们通常通过一个个的断言来进行。
iTesting
2021/04/25
3.1K0
你不知道的Cypress系列(8) -- “可视化”测试你知多少?
你不知道的Cypress系列(3) -- 是时候重构自己的思维了!
在跟同学们的交流中,我也了解到, 原来除了国外优秀的公司(例如Adobe, 迪士尼,AutoDesk等等), 国内也有很多公司在尝试使用Cypress提升测试效率。
iTesting
2021/01/04
2.3K0
你不知道的Cypress系列(15) -- 支持跨域访问了!
说起Cypress,读者朋友们应该对“下一代Web端自动化测试技术”,“弯道超车首选”等等早已烂熟于心了。Cypress独特的运行机制(运行在浏览器内)也使得它吊打Webdriver之类的UI自动化测试工具。但是Cypress并不是完美无瑕,我们在使用Cypress做自动化测试时,经常会提的一个问题就是,Cypress不支持跨域访问,而我的测试需要跨域怎么办?
iTesting
2022/04/28
2.6K0
你不知道的Cypress系列(15) -- 支持跨域访问了!
你不知道的Cypress系列(11) -- 使用cy.session()加速鉴权。
今天是你不知道的Cypress系列(11) -- 使用cy.session()加速鉴权。
iTesting
2021/10/14
3.3K0
你不知道的Cypress系列(11) -- 使用cy.session()加速鉴权。
你不知道的Cypress系列(12) -- 测试报告Allure
Allure 报告是基于标准的 xUnit 结果输出,再添加补充数据而生成的,其报告的生成基于如下两个步骤。
iTesting
2021/10/27
3.6K1
你不知道的Cypress系列(9) -- 代码“自动生成”术​
本标题有哗众取宠之嫌,不过也侧面说明了测试行业内卷的程度。如果你有关注最新测试技术的习惯,你会发现,很多多年前就有的技术,最近几年又换了个皮卷土重来,比如,Codeless, BPA。本篇所介绍的代码 “自动生成”术,可以叫做Codeless,但既然已经在装X了,干脆叫代码”自动生成“术好了。
iTesting
2021/06/15
1.7K0
你不知道的Cypress系列(9) -- 代码“自动生成”术​
前端测试框架Cypress-第一个Demo
一说到UI自动化测试,大家一定首先应该想到的是selenium,毕竟目前来说,这个是最响当当的呢,但是今天给大家介绍的是目前在国外比较火的一款前端自动化测试框架-Cypress,这是一款既可以做UI自动化测试,也可以做接口自动化测试框,且运行速度比selenium的webdriver快。它是一款开箱即用的框架,不像selenium那样需要安装对应Library和结合对应的测试框架才能进行测试。目前Cypress唯一支持的语言是Javascript,所以不会出现像selenium那样多的问题呢。那么我们一起来看下。
搁浅同学
2022/07/21
2.1K1
前端测试框架Cypress-第一个Demo
Cypress初步使用
Cypress是新一代前端测试框架,它基于node js。解决了开发人员和QA工程师在测试现代应用程序时面临的关键难点问题。   Cypress包含免费的、开源的、可本地安装的Test Runner 和 能够记录测试的控制面板服务。
赵云龙龙
2020/05/22
1.5K0
Cypress系列-编写第一个用例
在cypress的项目目录下,在integration文件夹下创建一个first_test_demo.js文件,写入如下内容:
小博测试成长之路
2021/07/06
7400
Cypress系列-编写第一个用例
Cypress系列(11)- Cypress 编写和组织测试用例篇 之 动态生成测试用例
https://www.cnblogs.com/poloyy/category/1768839.html
小菠萝测试笔记
2020/06/09
1.2K0
Cypress系列(11)- Cypress 编写和组织测试用例篇 之 动态生成测试用例
Cypress简易入门教程
1)安装node.js(https://nodejs.org/en/download/),根据版本选择32位或64位。
顾翔
2020/06/18
5.6K0
你不知道的Cypress系列(13) -- 你真的需要多浏览器测试吗?
在自动化测试过程中,特别是Web端UI自动化测试过程中,发现很多同学对多浏览器测试/跨浏览器测试有很多误区, 今天来尝试解答下。
iTesting
2021/11/25
1.7K0
Cypress系列(3)- Cypress 的初次体验
https://www.cnblogs.com/poloyy/category/1768839.html
小菠萝测试笔记
2020/06/09
1.3K0
Cypress系列(3)- Cypress 的初次体验
Cypress系列(43)- visit() 命令详解
https://www.cnblogs.com/poloyy/category/1768839.html
小菠萝测试笔记
2020/09/07
1.5K0
Cypress系列(43)-  visit() 命令详解
推荐阅读
相关推荐
你不知道的Cypress系列(2) -- ”该死"的PO模型​!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档