Cypress 安装及入门排坑指南

news2024/12/25 2:09:27

最近准备给公司项目做重构,原本是打算使用Jest来作为测试工具的,刚好无意之中接触到了Cypress这款测试工具,虽然用上它非常的不容易(简直是一波三折),但是用上了之后觉得真香啊。我们本篇文章就是讲Cypress如何安装和使用,以及解决安装和使用过程的坑。

提前预先告知一下遇到的问题:

1.cypress 包下载不下来
2.Cypress 应用程序下载太漫长,经常性失败(挂梯子也没用)
3.TypeScript 类型错误

为什么选择 Cypress?

Cypress是新一代的前端测试工具。可以测试在浏览器中运行的一切。并且它的所有动作都是在浏览器环境运行的,这意味着你通过Cypress跑测试用例跟在生产环境使用一模一样。这会比Jest这种在虚拟浏览器中进行测试更加可靠。

安装 Cypress

安装Cypress可是非常的不容易,使用Cypress最大的障碍就是安装Cypress——这太折磨了吧。

初始化项目

我们这里使用vite快速创建一个项目(额外贴上Webpack构建的 👉 demo)

pnpm create vite 

根据指引选择你想要的框架与配置(不同框架之间配置基本一致),我的如下:

✔ Project name: cypress-vite
✔ Select a framework: › React
✔ Select a variant: › TypeScript 

进入文件目录并安装基本的依赖

cd cypress-vite && pnpm install 

不知道为什么,最近npm的依赖基本安装不下来(我看群里有好几个人都说最近安什么包都安不下来)。没办法,换淘宝源吧

npm config set registry https://registry.npm.taobao.org 

重新pnpm install算是安装上了

安装 cypress 依赖

pnpm install cypress --save-dev 

尝试启用cypress

npx cypress open 

第二个折磨来了,报错内容如下

No version of Cypress is installed in: /Users/UserName/Library/Caches/Cypress/11.1.0/Cypress.app

Please reinstall Cypress by running: cypress install

-----------

Cypress executable not found at: /Users/UserName/LibraryCaches/Cypress/11.1.0/Cypress.app/Contents/MacOS/Cypress

-----------

Platform: darwin-x64 (20.6.0)
Cypress Version: 11.1.0 

这是因为安装的cypress包只是跑测试用例的代码, 而控制浏览器完成自动化测试的是通过Cypress应用程序进行的。

既然如此,我们就按照提示安装Cypress应用程序

npx cypress install 

结果发现根本装不下来,每次都是到1%的进度就断掉或者没有进展(有些人等了几个小时仍然没有安装下来,是谁我不说🤪

百度、谷歌、stackoverflow、github 上查了半天,最终是无意之间在 Github 上的 issue 上找到了解决办法。需要在安装命令后面加上--force

npx cypress install --force 

几秒钟就安装了下来(这个凭什么就能安装下来呢?!?!?!

启用 Cypress

重新执行

npx cypress open 

就会打开Cypress应用程序,界面如下:

E2E Testing

我们这里先选择E2E TestingComponent Testing 我后面会讲怎么配置(毕竟还有TypeScript的坑要填呢~)

关于这两者之间有什么区别,可以点击Welcome to Cypress!下方的Review the differences between each testing type →前往查看,这里就不多做解释了。

告知在我们的项目添加了以下文件

选择你将要运行的环境以后就会打开一个浏览器窗口

1.生成一些例子,来帮助我们了解如何通过Cypress写测试
2.生成一个空的测试文件,以便于我们开始测试应用

选择哪一个都可以,建议选择生成一些例子,这样就可以了解测试用例如何去写了。

生成好测试用例以后点击一个文件就可以开始测试了

Component Testing

退回到Cypress应用程序中,选择Component Testing

Cypress将会自动检测并选择上当前使用的框架及构建工具

基于上一步的选择来检查必要的依赖是否已安装

最后安装下去,Cypress会帮助我们在项目中生成cypress/component目录和cypress/support/component-index.htmlcypress/support/component.ts文件

cypress/support/component-index.html 是用于测试的html模版,当然你也可以在cypress.config.ts中指定测试模版,将component.indexHtmlFile设置为指定的模版路径即可

浏览器页面上提示我们并没有可执行的测试用例,页面上展示着生成一个空的测试页面,我们选择它,它生成在测试文件在根目录的cypress/component文件下,由于我们做的是组件测试,比较好的做法是测试文件与被测试的组件在一起(官方给的例子也是如此QAQ)。 在src目录下创建文件如下

// /src/components/Button.tsx
export detault function Button() {return (<button data-cy="btn">0</button>)
} 
// /src/components/Button.cy.tsx/
import Button from "./Button"

describe('Button', () => {it('mount Button', () => {cy.mount(<Button />)cy.get('[data-cy=btn]').should('have.text', '0')})
}) 

点击Cypress打开的浏览器中的Button.cy.tsx文件,测试通过了

解决VSCode TypeScript类型错误

尽管测试通过了,但是VSCode中的Button.cy.tsx文件报类型错误,标红也就算了,还乱给智能提示,实在难受

这是TypeScript的类型错误,我们需要在tsconfig.json中添加types: ["cypress"]配置

{"compilerOptions": {"types": ["cypress"],// ......
} 

加上以后虽然describe等关键字没有报错,但是cy.mount仍是报错的,这是因为我们的mount方法是在cypress/support/component.ts文件中添加上的,虽然定义了全局类型,但并没有在src目录下生效,为了让两边都生效,我们将这个全局定义单独放到根目录下作为一个类型文件。

// cypress.d.ts
import { mount } from 'cypress/react18'

declare global {namespace Cypress {interface Chainable<Subject> {mount: typeof mount;}}
} 

同时在根目录的tsconfig.json中使用

{"compilerOptions": {// ......"include": ["src","cypress.d.ts" // 添加 cypress.d.ts 让类型生效],// ......
} 

接着就可以将cypress/support/component中的类型删除掉,并在cypress目录下创建一个tsconfig.json文件

{"compilerOptions": {"target": "es5","lib": ["es5", "dom"],"types": ["cypress"]},"include": ["**/*.ts", "../cypress.d.ts"]
} 

这样,cypress.d.tssrccypress目录下定义的类型都可以生效了。

当然,也有可能会出现定义了以后cy.mount或者Cypress.Commands.add('mount', mount)仍在报错。可以在VSCode中输入组合键command + shift + p打开快捷指令栏,输入TypeScript: Restart TS server回车来重启TypeScript服务,如若仍不生效,建议重启试试~

结尾

Cypress使用起来还是很香的,支持实时测试,这样也就不用我们写什么功能完了以后再在浏览器里面点点来测试了,由于其测试是在浏览器中完成的,在浏览器中能看到每一步的快照,所以相较于Jest而言有更大的可信度,毕竟能看到的,更加真实,可以说Cypress简直是减少bug的神器啊。

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/138279.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C进阶_C语言_浮点数存储规则_浮点型在内存中的存储

在开始讲解之前&#xff0c;我们看一下常见浮点数的写法&#xff1a; 3.14159 1E10&#xff08;它代表1.0乘以10的10次方&#xff09; 浮点型家族里有float、double、long double类型。 浮点型的表示范围是多少&#xff1f;我们打开float.h就能看到&#xff08;这里用everythi…

什么牌子的蓝牙耳机好?好用的蓝牙耳机排行

现如今&#xff0c;蓝牙耳机的用途越来越广泛&#xff0c;无论是追剧、游戏、通话、运动等&#xff0c;都能看到使用蓝牙耳机的人。在日常的使用中蓝牙耳机也逐渐取代有线耳机成为受人们欢迎的存在&#xff0c;那么&#xff0c;什么牌子的蓝牙耳机好&#xff1f;接下来&#xf…

功能强大的python包sklearn

1. sklearn简介sklearn是基于python语言的机器学习工具包&#xff0c;是目前做机器学习项目当之无愧的第一工具。 sklearn自带了大量的数据集&#xff0c;可供我们练习各种机器学习算法。 sklearn集成了数据预处理、数据特征选择、数据特征降维、分类\回归\聚类模型、模型评估等…

基于YOLO实践布匹缺陷检测

在缺陷检测领域中&#xff0c;越来越多看到AI的身影&#xff0c;路面缺陷、生产缺陷、PCB缺陷、瓶装酒缺陷检测等等&#xff0c;目标检测等模型发挥着越来越多的作用&#xff0c;像瓷砖缺陷和布匹缺陷这类平面类型的缺陷也不例外&#xff0c;最近做的项目中大多和这类型的数据有…

回顾2022,那些令人印象深刻的AI突破

文 | 付奶茶2022年是令人印象深刻的一年。在这一年中&#xff0c;我们目睹了许多前所未有的AI模型的出现&#xff0c;这些模型不断刷新着人类对AI力量的认知。关于这一年中最好的工作&#xff0c;每个人都有自己不同的看法。在这篇文章中&#xff0c;我们跟随Alan D. Thompson在…

对Mysql 超时配置项进行深入理解!

1 JDDB超时JDBC 是 Java 应用程序中用于访问数据库的一套标准 API类型4驱动是通过socket来处理字节流的。如果socket超时设置不合适&#xff0c;类型4驱动也可能有同样的错误&#xff08;连接被阻塞&#xff09;。1.2 JDBC超时层次应用程序WAS与数据库间的超时的层次更上层的超…

STL模拟实现——string

前言 STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且 是一个包罗数据结构与算法的软件框架。 STL有六大组件&#xff1a;算法&#xff0c;容器&#xff0c;迭代器&#xff0c;仿函数&am…

从0搭建一个WebRTC,实现多房间多对多通话,并实现屏幕录制

这篇文章开始会实现一个一对一WebRTC和多对多的WebRTC&#xff0c;以及基于屏幕共享的录制。本篇会实现信令和前端部分&#xff0c;信令使用fastity来搭建&#xff0c;前端部分使用Vue3来实现。 为什么要使用WebRTC WebRTC全称Web Real-Time Communication&#xff0c;是一种实…

安全狗重磅发布数据安全解决方案·数垒

一、 势在必行的数据安全 近年来&#xff0c;随着《网络安全法》、《数据安全法》、“数据二十条”等多部法律、意见法规等的相继颁布&#xff0c;数据安全管理与防护在国家政策上成为势在必行的行动之一。与此同时&#xff0c;伴随着数字经济时代的到来&#xff0c;数以万计…

Java基础语法-学习笔记

目录 01Java语言的发展 02Java的三大平台 03Java的主要特性 04JRE和JDK 1. 注释 使用的技巧 注意点 2. 关键字 2.1 概念 2.2 第一个关键字class 3. 字面量 区分技巧 4. 变量 4.1 什么是变量&#xff1f; 4.2 变量的定义格式 5. 数据类型 5.1 Java语言数据类型的…

STM32——TIM输出比较

文章目录一、TIM输出比较输出比较简介PWM简介输出比较通道(高级)输出比较通道(通用)输出比较模式控制器工作原理PWM基本结构参数计算三、PWM驱动LED呼吸灯电路设计关键代码关键函数与参数引脚重映射取消默认调试功能函数极性选择决定占空比&#xff0c;周期的三个函数四、PWM驱…

Design pattern-js的设计模式(一)

前言 什么是设计模式&#xff1f;&#xff08;Design pattern&#xff09;代表了最佳的实践&#xff0c;通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间…

【youcans 的 OpenCV 例程 300篇】254.OpenCV 绘制图像标记

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】254. OpenCV 绘制标记 7.1 绘图函数基本参数 OpenCV提供了绘图功能&#xff0c;可以在图像上绘制直线、矩形、圆、椭圆等各种几何图形。 函数 cv.line()、cv.rectangle()、cv.circle()、cv.polyli…

深度学习:08 训练、测试和验证集的说明

目录 用于深度学习的数据集 训练集 验证集 测试集 总结 用于深度学习的数据集 接下来&#xff0c;我将在这篇里面讨论在训练和测试神经网络期间使用的不同数据集。 出于模型的训练和测试目的&#xff0c;我们应该将数据分解为三个不同的数据集。这些数据集将包含以下内容…

【小f的刷题笔记】(JS)阶乘 - 阶乘后的零 LeetCode172 阶乘函数后K个零 LeetCode793

【阶乘】 一、阶乘后的零&#xff1a; LeetCode172 链接&#xff1a; 172.阶乘后的零 题目&#xff1a; 思路&#xff1a; 0的产生是一定是因为2*5产生的&#xff0c;所以就是找因数 并且&#xff0c;可想而知&#xff0c;找的到因数5&#xff0c;必然找的到因数2与之搭配…

【MySQL】深入理解B+树索引

文章目录1. 前言2. 索引方案3. InnoDB的索引方案4. 索引的分类4.1 聚簇索引4.2 二级索引4.3 联合索引5. InnoDB中的B树索引的注意事项5.1 内节点中目录项记录的唯一主5.2 一个页至少容纳2条记录6. MyISAM中的索引⽅案简单介绍1. 前言 索引&#xff0c;是MySQL快速查询的秘籍。…

ARMv8/ARMv9:深入理解MPIDR_EL1寄存器中的affinity

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈官方文档(ARM ARM文档)的介绍如下所示 翻译一下MPIDR_EL1相关的英文,如下所示: 作用: 在多处理器系统中,为调…

Xshell 连接虚拟机(Ubuntu、CentOS)

对于一些linux的初学者来说&#xff0c;在没有自己的服务器时可以选择使用虚拟机来代替&#xff08;如ubuntu、centos等&#xff09;进行相关的学习。下面介绍下如何使用xshell来远程连接虚拟机。 注意&#xff1a;下面我以Ubuntu来举例说明。 1、创建虚拟机 虚拟机的创建网络…

1、数据库安装修改root密码管理自启服务

MySQL的下载和安装 登录MySQL官网下载MySQL.zip包 MySQL :: Download MySQL Community Server 下载完毕可自行选择存储位置&#xff0c;进行解压 解压后配置环境变量 完成配置后在MySQL目录下新建一个my.ini配置文件 文件写入以下内容 [client] # 设置mysql客户端默认字符集…

面向对象2(static修饰变量和方法、Javabean类、测试类和工具类、对main方法的理解、继承、子类继承父类构造方法变量和方法)

1、static修饰变量和方法 JDK8以前&#xff0c;静态区在方法区里面&#xff0c;JDK8开始&#xff0c;静态区挪到了堆内存当中 理解&#xff1a; 因为静态方法没有this&#xff0c;而非静态方法是有一个隐含的参数this的&#xff0c;所以想在静态方法里面调用非静态变量或方法就…