cypress进行e2e测试之理论

article/2025/11/11 2:37:43

cypress 进行 e2e 测试之理论

cypress 是目前 e2e 很火的一个测试组件,内部绑定了 macha、chai、chai-jquery 之类的断言,为了让代码代码
更有说服力,减少提交测试错误,进行 e2e 测试显然是非常有必要的。

官网
GitHub

借鉴官网一句话来说:

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 简介

e2e 测试端对端测试的简称, e2e 即为end to end,
指任意一个人的社交、交易、休闲都可以直接与另外任意一个人产生关系,去中心化、渠道化.

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 onecy.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 idcy.get('#query-btn').should('contain', 'Button')// Get DOM elements by classcy.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'),不需要再次获
取了,直接使用别名就好了

从官网截图的表格,详
细jquery-chai 文档表格

这里看到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-elementsit('.type() - type into a DOM element', function() {// https://on.cypress.io/typecy.get('.action-email').type('fake@email.com').should('have.value', 'fake@email.com')// .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('slow.typing@email.com', { delay: 100 }).should('have.value', 'slow.typing@email.com')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后输入的内容')

还有长按键盘之类的操作,详细就看官网了这里之类奉上链
接https://docs.cypress.io/api/commands/type.html#Key-Combinations

这里就是关于键盘的组合操作。

对于选择例如 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


http://chatgpt.dhexx.cn/article/XUgnP851.shtml

相关文章

自动化测试(二)01-前端测试分为单元测试、集成测试和E2E测试 测试工具对比-适合TDD或 BDD、断言、异步测试 测试工具的类型

自动化测试&#xff08;二&#xff09;01-前端测试分为单元测试、集成测试和E2E测试 & 测试工具对比-适合TDD或 BDD、断言、异步测试 & 测试工具的类型 前端自动化测试 测试是一个庞大的主题&#xff0c;包括各种分类的测试&#xff0c;诸如黑盒测试/白盒测试、单元测…

web前端测试——e2e测试

开发环境&#xff1a;安装有node的macbook&#xff08;windows没测&#xff09; 第一步&#xff1a; 创建自己需要测试的项目&#xff0c;如在桌面创建一个test目录作为我们的项目根目录。 打开sublim text &#xff0c;并将项目拖到sublim text中&#xff0c;方便管理。 第…

E2E 端到端测试学习 - E2E 介绍、Cypress 案例基本使用

E2E 测试介绍 E2E E2E&#xff08;end to end&#xff09;端到端测试是最直观可以理解的测试类型。在前端应用程序中&#xff0c;端到端测试可以从用户的视角通过真实浏览器自动检查应用程序是否正常工作。 E2E 把整个系统当作一个黑盒&#xff0c;测试人员模拟真实用户在浏…

Unity射线与UI碰撞检测

问题产生背景&#xff1a;我们有的时候&#xff0c;需要实现射线与3D UI之间的碰撞&#xff0c;当射线碰撞到3D UI之后&#xff08;将Canvas设置为World Space&#xff09;&#xff0c;调整到合适的位置。使用LineRender表示射线的直观显示&#xff0c;使用一把枪结合第一人称控…

unity中射线碰撞检测总结

这阵子通过看视频&#xff0c;看书对unity中射线碰撞检测&#xff0c;有了一些了解&#xff0c;这里我把它总结一下写下来&#xff0c;希望能帮助到你们&#xff0c;也希望通过各位大神来指正不足之处&#xff1b; 射线碰撞检测&#xff0c;就是由某一物体发射出一道射线&#…

Unity 射线与碰撞范围检测【踩坑记录】

射线检测 射线检测在2D和3D的区别比较大 一定要加上对应的Collider组件 对应的函数只检测对应的Collider&#xff0c;Physics.Raycast是不会检测到Collider 2D的&#xff08;这个让我有一次debug了好久才发现&#xff09; 对应API如下 Physics.Raycast(Vector3 origin,Vec…

Unity 碰撞位置

获取碰撞位置的方法1&#xff1a;使用 Collider.ClosestPoint Returns a point on the collider that is closest to a given location. 返回碰撞器上最接近给定位置的点。 下方是子弹打到物体上&#xff0c;生成撞击火星的代码&#xff1a; // 碰撞体的检测 private void O…

Unity入门7——物理系统之碰撞检测

一、刚体 Rigid Body ​ 刚体利用体积&#xff08;碰撞器 Collider&#xff09;进行碰撞计算&#xff0c;模拟真实的碰撞效果&#xff0c;产生力的作用 ​ 碰撞产生的必要条件&#xff1a; 两个物体都有碰撞器 Collider至少一个物体有刚体 Mass&#xff1a;质量 默认为千克&a…

解决Unity物体速度过快无法进行碰撞检测(碰撞检测穿透)

一、解决碰撞检测穿透方法一 首先我们知道只要是跟碰撞相关的基本都是离不开刚体 Rigidbody这个组件&#xff0c;刚体中有一个参数适用于检测碰撞的 如下图 Collision Detection就是碰撞检测。 然而有时候开发游戏&#xff0c;对于高速运动的物体&#xff08;比如&#xff…

【Unity】Unity中获得碰撞体碰撞的位置

有时间的直接看sprite slicer这个插件的代码&#xff0c;原理也是发射线检测&#xff0c;代码逻辑什么的比下面的文章来的好的多&#xff0c;如果有空我也可以整理一下。 在纯物理环境中&#xff0c;为了获得碰撞体碰撞的位置&#xff0c;我们可以使用Collider2D.OnCollisionE…

Unity 3D中的射线与碰撞检测

在我们的游戏开发过程中&#xff0c;有一个很重要的工作就是进行碰撞检测。例如在射击游戏中子弹是否击中敌人&#xff0c;在RPG游戏中是否捡到装备等等。在进行碰撞检测时&#xff0c;我们最常用的工具就是射线&#xff0c;Unity 3D的物理引擎也为我们提供了射线类以及相关的函…

unity3D之简单的碰撞检测 .

版权声明&#xff1a;欢迎订阅公众号【5厘米的理想】&#xff0c;愿生命里的每一个小理想&#xff0c;都能成为生命里的小确幸。本文地址为&#xff1a; http://blog.csdn.net/qinyuanpei/article/details/23093665 大家好&#xff0c;欢迎大家关注由我为大家带来的Unity3D游戏…

Unity碰撞检测的必要条件

Unity中有两个独立的物理引擎&#xff0c;一个用于3D物理系统&#xff0c;一个用于2D物理系统。两个引擎是使用不同的组件实现的。因此BoxCollider和Rigidbody一起使用&#xff0c;代码中用OnTriggerEnter才能检测到触发;BoxCollider2D和Rigidbody2D一起使用&#xff0c;代码中…

Unity3D入门(二):碰撞检测

碰撞器由来 1.系统默认会给每个对象(GameObject)添加一个碰撞组件(ColliderComponent)&#xff0c;一些背景对象则可以取消该组件。 2.在unity3d中&#xff0c;能检测碰撞发生的方式有两种&#xff0c;一种是利用碰撞器&#xff0c;另一种则是利用触发器。这两种方式的应用非…

Unity碰撞检测机制的原理(更新中...)

总是碰到关于碰撞的问题&#xff0c;今天实在忍不住了&#xff0c;来把它搞懂&#xff0c;不然听到八叉树&#xff0c;BSP什么的就怕可不行。 转自&#xff1a;http://www.manew.com/thread-102595-1-1.html 碰撞机制 最近做动态地形生成的时候&#xff0c;发现碰撞检测无效&…

Unity 3D之碰撞检测

一、碰撞器 碰撞检测两大必备条件&#xff1a;1.其中一方具备刚体&#xff0c;碰撞双方碰撞器 1、刚体 2、盒子碰撞器 3、碰撞检测方法 void Start(){this.gameObject.AddComponent<Rigidbody>();//添加刚体}void OnCollisionEnter(Collision other){if (other.gameOb…

Unity2d 学习笔记(四)碰撞检测

碰撞检测功能在游戏开发里是比较常用的&#xff0c;比如地图上无法穿越的部分&#xff0c;以及对于敌人的攻击判定等等。这篇博客就开简单介绍一下碰撞事件的处理。 参考视频&#xff1a;Unity碰撞检测_哔哩哔哩_bilibili 首先&#xff0c;我们需要为想要进行碰撞检测的对象添…

2022-04-20 Unity入门7——物理系统之碰撞检测

文章目录 一、刚体 Rigid Body二、碰撞器 Collider三、物理材质四、碰撞检测函数五、刚体加力 一、刚体 Rigid Body ​ 刚体利用体积&#xff08;碰撞器 Collider&#xff09;进行碰撞计算&#xff0c;模拟真实的碰撞效果&#xff0c;产生力的作用 ​ 碰撞产生的必要条件&…

Unity3D —— 碰撞检测

&#xff08;一&#xff09;两种碰撞检测方式 &#xff08;1&#xff09;Collider&#xff1a;碰撞器 ➜需要与刚体一起添加到游戏对象上才能触发碰撞&#xff0c;没有碰撞体的刚体会彼此相互穿过。 碰撞信息检测函数&#xff1a; //碰撞开始 void OnCollisionEnter(Collis…

【Unity入门】24.碰撞检测

【Unity入门】碰撞检测 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;碰撞体 &#xff08;1&#xff09;Collider组件 上节课我们有学习到&#xff0c;unity的物理系统提供了更方便的碰撞…