cypress 教程

news2024/9/23 3:18:47

cypress 教程

cypress是一个用于Web应用程序的端到端测试框架。它是一个开源的js测试工具,设计的目的是Web应用程序的测试能更快速、简单和可靠。赛普斯允许开发人员编写模拟用户交互和验证应用程序行为的自动测试。

我们可以使用js或者ts来开发,但是jscypress的主要语言。cypress是建立在js之上的,使用了许多现代Web开发的相同概念,比如使用基于浏览器的环境来运行测试,以及使用CSS选择器与Web元素进行交互。

在编写cypress测试时,我们可以使用js创建模拟用户交互和验证应用程序行为的测试用例。cypress还提供了一套强大的内置命令和断言,以帮助我们快速和方便地编写测试。

在详细解释cypress之前,我们先来看看为什么我们要使用cypress来实现测试用例的自动化。

为什么要使用cypress

通过js编写

cypress是用js编写的,对于我们已经熟悉js的开发人员来说能更容易上手cypress

对js框架提供了支持

cypressvuereact提供了很好的支持。使用这些框架构建应用程序的开发人员可以很容易地为他们的应用程序编写测试。

拥有丰富的与Web应用程序交互的API

提供丰富的与Web应用程序进行交互的API,其中包括与DOM进行交互的方法、HTTP请求和处理事件。这些API设计得很容易使用,并且拥有详细的文档介绍,这使得使用js编写测试变得很容易。

支持 debugger

提供全面的调试体验,包括内置的调试工具和通过测试的能力。

社区支持

有一个庞大的js开发者社区,意味着大量的资源可以在网上帮助开发者解决他们在使用cypress时遇到的任何问题。

cypress使用一个独特的体系结构,使其能够在与被测试的应用程序相同的上下文中运行测试。这意味着cypress可以访问应用程序的DOM、网络流量,甚至是后端服务器。这种架构允许更快和更可靠的测试和更直观和强大的测试经验。

使用cypress的好处

cypress能使编写和运行测试、调试问题变得容易,并确保了Web应用程序的质量。下面我们将探讨cypress自动化工具的一些主要特点。

简单的设置

cypress是非常容易建立和使用。它可以很容易地安装在国家预防机制中,只需要很少的设置。cypress还配有一个方便用户的图形界面,使开发人员易于导航和使用。

全面 APIS

提供丰富的与Web应用程序进行交互的API,其中包括与DOM进行交互的方法、HTTP请求和处理事件。这些API设计得很容易使用,并且拥有详细的文档介绍,这使得使用js编写测试变得很容易。

实时重载

提供实时的重新加载,这意味着对代码或测试的任何更改都能立即反映在浏览器中。这样可以节省开发人员的时间,使实时查看变化的影响变得容易。

自动等候

在执行下一个命令之前,赛普雷斯JavaSoript会自动等待断言传递和元素显示。这使测试更加稳定,并减少了错误底片的可能性。

调试

配备了内置的调试工具,使故障诊断和修复测试变得容易。开发人员可以使用这些工具来检查DOM、调试javaSoript代码等。

时间旅行

提供了一个独特的特性,叫做"时间旅行",它允许我们在测试的任何点上来回地检查和调试应用程序。当试图调试复杂的测试场景时,这个功能可以节省开发人员大量的时间和精力。

跨浏览器测试

支持跨浏览器测试,并可以在不同的浏览器上运行测试。这使得我们可以很容易地确保您的应用程序在不同的浏览器中工作。

自动截图和录像

可以自动拍摄测试的截图和视频,这样就可以很容易地看到测试运行过程中发生了什么。这在试图识别应用程序中的问题或错误时会很有帮助。

定制命令

允许开发人员创建自定义命令,这些命令可以在不同的测试中重用。这使得创建一个通用测试命令库和减少代码重复的数量变得容易。

持续整合

可以很容易地集成到流行的连续集成(CI)工具,如Jenkins, CircleCITravis CI.。这使得作为CI/CD管道的一部分自动运行测试变得容易。

cypress的使用

安装nodejs

需要有nodejs环境,可以在https://nodejs.org/下载。

创建一个项目

创建一个新目录,并在根目录下通过npm init来生成package.json文件

安装 cypress

在根目录下执行

npm install cypress --save-dev

yarn add cypress --dev

打开cypress

npx cypress open

可以看到支持端到端测试和组件测试这两种:

  • 端到端测试:从端到端构建和测试应用程序的整个体验,以确保每个流符合我们的期望。
  • 组件测试:独立地从设计系统构建和测试组件,以确保每个状态符合我们的期望。

在这里插入图片描述

这两种测试存在一定的区别:

端到端测试通过 cy.visit() 访问网站,可以跨多个页面测试流程和功能。而组件测试通过 cy.mount() 导入组件,主要用于隔离测试设计系统的各个组件。

在这里插入图片描述

端到端测试生成一个空白规范:

在这里插入图片描述

选择浏览器,在这里我们选择Edge,然后启动端到端测试:

在这里插入图片描述

在这里插入图片描述

创建一个空白测试用例:
在这里插入图片描述

创建完后运行:
在这里插入图片描述

在创建了测试用例后,可以在项目根目录上看到多了一个cypress文件夹,默认文件夹结构如下所示。我们可以在文件夹e2e下创建测试用例。

在这里插入图片描述

cypress的项目结构

  • cypress:这是 cypress 项目的主文件夹(也就是执行run cypress open命令后生成的)。它包含与我们的测试相关的所有子文件夹和文件。
    • e2e:这是存储所有测试的主文件夹。我们可以在此处添加基本、端到端测试。所有的spec文件都在这个文件夹里边。
    • fixtures:这个文件夹可以用于存储测试中使用到的静态数据文件,例如 JSONCSV 文件。例如,包含多个测试用例可以使用的测试数据列表。
    • support: 此文件夹包含可在多个测试文件之间共享的可重用测试代码。可以包括自定义命令、页面对象或函数。

support 文件夹中有两个文件:commands.jsindex.js

  • command.js:用于放置常用函数和自定义命令。包括在不同测试文件中使用到的常用函数。Cypress 为也我们创建了一些函数,如果有特殊需求,也可以在此处重写它们。
  • e2e.js:这个文件在每个测试文件之前运行。在此文件中,我们保留所有全局配置,并可以根据需要进行修改。默认情况下,它仅导入 commands.js,但是我们也可以导入或要求其他文件。
  • node_modules:所有节点包将安装在node_modules目录中,并在所有测试文件中可用。简而言之,这是 NPM 安装所有项目依赖项的文件夹。
  • cypress.config.js:这是 cypress 框架使用的配置文件,用于自定义框架和测试的行为。该文件可用于配置测试的各种设置,例如应用程序的基本 URL、视口大小、测试超时值和其他选项。

除了上述文件夹外,我们还有一些文件夹,例如“屏幕截图”、“下载”和“视频”来存储不同的相关文件。

cypress 的基本结构

cypress 使用与 Mocha 相同的语法来编写测试用例:

  • describe(): 该方法用于对相关测试用例进行分组。它需要两个参数:一个描述测试用例组的字符串和一个包含各个测试用例的回调函数。
  • it(): 该方法用于定义测试用例。它需要两个参数:一个描述测试用例的字符串和一个包含实际测试代码的回调函数。一个describe()至少要包含一条测试用例:it().
  • before():此方法用于在特定描述的块中的任何测试用例之前运行设置函数。可用于设置测试环境、初始化变量以及执行其他设置任务。
  • after(): 此方法用于在特定描述的块中的所有测试用例完成运行后运行清理功能。它可用于清理测试环境、关闭打开的连接以及执行其他清理任务。
  • beforeEach(): 此方法用于在特定描述的块中的每个测试用例之前运行设置函数。它可用于重置测试环境的状态并执行其他设置任务。
  • afterEach(): 此方法用于在特定描述的块中的每个测试用例完成运行后运行清理功能。它可用于重置测试环境的状态并执行其他清理任务。
  • .skip(): 当处理大型代码库并希望专注于特定测试或测试子集时,.skip() 函数提供了一种方便的方法来暂时阻止某些测试的执行。

测试应用下载

我们使用Cypress.io的官方提供的测试应用来做介绍,就不单独写应用了。

在github上复制项目

git clone git@github.com:cypress-io/cypress-example-recipes.git

之后在根目录下安装依赖:

npm install

在这里插入图片描述

所有应用例子都在项目的examples文件夹下。

启动测试应用

进入想要测试的应用的目录。

我们这里以登录应用为例(logging-in__xhr-web-forms目录).

进入该应用的目录:

cd examples\logging-in__xhr-web-forms

启动服务:

npm start

启动成功后,cmd窗口将显示服务器的地址和端口

在这里插入图片描述

在浏览器中访问:

在这里插入图片描述

进行 UI 测试

cypress 提供对应用程序 DOM 的轻松访问,从而可以轻松操作和断言页面上各个元素的状态。它还支持插件,可用于扩展其功能并与其他工具和服务集成。这些是 cypress 成为 UI 测试首选的原因。

测试用例

在之前创建的空白测试文件中进行修改:

describe('login', () => {
  const username = 'jane.lane';
  const password = 'password123';
  it('login ', () => {
    cy.visit('http://localhost:7079/login');
    cy.get('input[name=username]').type(username);
    cy.get('input[name=password]').type(password);
    cy.get('form').submit();

    cy.url().should('include', '/dashboard');
    cy.get('h1').should('contain', 'jane.lane');
  });
});

在这里插入图片描述

进行 API 测试

可以创建将 HTTP 请求发送到其应用程序的 API 并验证相应响应的测试。

这种类型的测试对于测试 API 响应、验证数据输入和输出以及验证应用程序的行为特别有用。它还提供了几个内置断言,可用于验证响应状态代码、标头和正文。

以下是使用 Cypress 进行 API 测试的一些关键功能:

  • HTTP 请求

  • cypress 提供了简单直观的 API 来发出 HTTP 请求,允许开发人员轻松测试不同的 API 端点和参数。它支持所有常见的HTTP方法,例如GETPOSTPUTDELETE等。

  • mock
    cypress 允许您模拟 API 响应,这在测试依赖于第三方服务或数据源的 API 端点时非常有用,这些服务或数据源在开发/测试期间可能不可用。

  • 请求和响应对象
    cypress 提供请求和响应对象,允许开发人员检查和操作 API 发送和接收的数据。这有助于测试具有嵌套数据结构的复杂 API

  • 身份验证和授权
    cypress支持测试需要身份验证或授权的 API。测试人员可以使用内置的 cy.request 方法来发送身份验证令牌或 cookie,也可以使用插件与外部服务(如 OAuth 提供程序)集成。

  • 内置对 GraphQL 的支持

  • cypress 为测试 GraphQL API 提供了内置支持,包括简化 GraphQL 查询的 GraphQL 请求方法。

测试用例

GET请求

GET 方法用于检索特定数据,并在从 API 响应读取代码时传递参数。

describe('login', () => {
  it('is redirected using cy.request', function () {
    cy.request({
      url: 'http://localhost:7077/dashboard',
      followRedirect: false,
    }).then((resp) => {
      expect(resp.status).to.eq(302);
      expect(resp.redirectedToUrl).to.eq('http://localhost:7077/unauthorized');
    });
  });
});

在这里插入图片描述

POST请求
POST 请求中,我们通过在body中传递数据。

describe('login', () => {
  const username = 'jane.lane';
  const password = 'password123';

  it('test login', function () {
    cy.request({
      method: 'POST',
      url: 'http://localhost:7077/login',
      form: true,
      body: {
        username,
        password,
      },
    });
    cy.getCookie('cypress-session-cookie').should('exist');
  });
});

在这里插入图片描述

其他请求方式类似,就不一一列举了。

进行组件测试

组件测试的目的是验证各个软件模块(如函数、类或方法)的功能和行为,以确保它们按预期工作并满足设计中指定的要求。

组件测试的主要目的是在软件模块集成到更广泛的系统之前发现软件模块中的缺陷或故障,从而最大限度地减少下游故障的可能性,并简化隔离和解决问题的过程。

通过隔离测试每个组件,开发人员可以确信每个模块都正常工作,这可以提高整体系统质量并减少测试和调试的时间和成本。

测试用例

这里以react为例:

# 创建一个项目:
create-react-app my-new-sample-app

# 在项目中安装cypress
npm i cypress -D

# 打开cypress
npx cypress open

之后选择组件测试

在这里插入图片描述

选择react框架

在这里插入图片描述

安装所有依赖项:

在这里插入图片描述

之后的流程跟之前提到的一样,选择浏览器跟创建空白测试规范。

最终创建的文件夹:

在这里插入图片描述

src 文件夹中创建一个“计数器组件”,并命名为 lambadaTest.jsx。

import { useState } from 'react'

export default function Counter({ initial = 0 }) {
   const [count, setCount] = useState(initial)
   return (
       <div style={{
           padding: 30
       }}>
           <button style={{ color: "black", backgroundColor: "green", margin: 10 }} aria-label="decrement" onClick={() => setCount(count - 1)}>
               -
           </button>
           <span data-cy="counter">{count}</span>
           <button style={{ color: "black", backgroundColor: "green", margin: 10 }} aria-label="increment" onClick={() => setCount(count + 1)}>
               +
           </button>
       </div>
   )
}

执行下面的命令来运行测试用例:

npx cypress open --component

可以看到组件测试已执行

在这里插入图片描述

编写用例:

  • 单击 (+) 以增加计数。
  • 单击 (-) 以递减计数。
import Counter from '../../src/lambadaTest'
describe("<Counter>", () => {
 const counterSelector = '[data-cy="counter"]';
 const incrementSelector = "[aria-label=increment]";
 const decrementSelector = "[aria-label=decrement]";
 it("Do two time increment then one time decrement the count ", () => {

   cy.mount(<Counter />);
   // 增加两次
   cy.get(incrementSelector).click();
   cy.get(incrementSelector).click();
   cy.get(counterSelector).should("contain.text", 2);

   // 递减
   cy.get(decrementSelector).click();
   cy.get(counterSelector).should("have.text", "1");
   cy.get(decrementSelector)
     .should("have.css", "color")
     .and("eq", "rgb(0, 0, 0)");
   cy.get(decrementSelector)
     .should("have.css", "background-color")
     .and("eq", "rgb(0, 128, 0)");
 });
 it("Do two time decrement then one time increment the count ", () => {

   cy.mount(<Counter />);
   cy.get(decrementSelector).click();
   cy.get(decrementSelector).click();
   cy.get(counterSelector).should("have.text", "-2");

   cy.get(incrementSelector).click();
   cy.get(counterSelector).should("have.text", "-1");
   cy.get(decrementSelector)
     .should("have.css", "color")
     .and("eq", "rgb(0, 0, 0)");
   cy.get(decrementSelector)
     .should("have.css", "background-color")
     .and("eq", "rgb(0, 128, 0)");
 });
});

将计数递增两次,然后递减一次计数。
在这里插入图片描述

将计数递减两次,然后递增一次计数。
在这里插入图片描述

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

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

相关文章

用牛鲨水豚赚取SUI的机会又来喽,500万SUI奖励等你来领!

刚刚结束的第一轮Bullshark Quest真是一次惊心动魄的体验&#xff01;我们非常感激社区成员的积极参与以及对Sui生态系统的关注。此轮获奖者的奖励已于美国时间2023年7月28日&#xff0c;在Quest门户网站上公布。参与者点击“Claim”即可将奖励领取至Sui钱包。请注意&#xff0…

猿创征文|弃文从工,从小白到蚂蚁工程师,我的 Java 成长之路

一、前言 1.1 背景 最近 CSDN 开展了猿创征文&#xff0c;希望博主写文章讲述自己在某个领域的技术成长历程。 之前也曾想找个机会写篇文章&#xff0c;记录下自己的成长历程。 因此&#xff0c;借着这个机会写下这篇文章。 在回顾自己的成长历程的同时&#xff0c;希望对一…

红队打靶:FourAndSix2.01打靶思路详解(vulnhub)

目录 写在开头 第一步&#xff1a;主机发现与端口扫描 第二步&#xff1a;NFS渗透 第三步&#xff1a;7z压缩包的密码破解 第四步&#xff1a;ssh私钥登录 第五步&#xff1a;lessvi提权 总结与思考 写在开头 本篇博客根据大佬红队笔记的视频进行打靶&#xff0c;详述了…

基于Caffe的静默活体检测识别分析系统

周末的时候看到一个好玩的项目就想着实际拿来使用一下&#xff0c;这个项目主要是做的是开源的跟人脸活体检测相关的内容&#xff0c;这里主要采用的是静默活体检测的方式。 人脸静默活体检测是一种用于验证人脸是真实、活体的技术&#xff0c;而不需要进行任何口头指令或特定…

13.7 CentOS 7 环境下大量创建帐号的方法

13.7.1 一些帐号相关的检查工具 pwck pwck 这个指令在检查 /etc/passwd 这个帐号配置文件内的信息&#xff0c;与实际的主文件夹是否存在等信息&#xff0c; 还可以比对 /etc/passwd /etc/shadow 的信息是否一致&#xff0c;另外&#xff0c;如果 /etc/passwd 内的数据字段错…

Linux 给用户 赋某个文件夹操作的权限(实现三权分立)

Linux 给用户 赋某个文件夹操作的权限 这里用的ubuntu16.04 一、配置网站管理员 linux文件或目录的权限分为&#xff0c;读、写、可执行三种权限。文件访问的用户类别分为&#xff0c;文件创建者、与文件创建者同组的用户、其他用户三类。 添加用户 useradd -d /var/www/htm…

解密低价正规渠道的来源:影视会员肯德基点餐直充api接口

话费充值 接口已经整合移动、联通、电信三网话费充值渠道。话费可以说是全民所需&#xff0c;对于平台引流&#xff0c;增强平台日活跃度可以提供不小的帮助。 肯德基在线点餐 接口整合了各大城市的肯德基门店&#xff0c;支持门店选择&#xff0c;在线点餐 提前点餐领取&a…

linux系统编程重点复习--线程同步

目录 复习目标&#xff1a; 1 互斥锁 1.1互斥锁的使用步骤 1.2 练习 1.3 死锁 2 读写锁 3 条件变量 4 信号量 复习目标&#xff1a; 熟练掌握互斥量的使用说出什么叫死锁以及解决方案熟练掌握读写锁的使用熟练掌握条件变量的使用理解条件变量实现的生产消费者模型理解…

Java基础篇_1.2——保留关键字、基本数据类型、基本数据类型之间的转换

​​​​​​​目录 一、保留关键字 二、Java的基本数据类型 三、引用数据类型 四、基本数据类型间的转换 隐含强制类型转换 一、保留关键字 Java该语言是用 Unicode 字符集编写的。 Java关键字是预先定义的具有特别意义的标识符&#xff0c;也被称为Java保留字&#xff0…

在k8s集群内搭建Prometheus监控平台

基本架构 Prometheus由SoundCloud发布&#xff0c;是一套由go语言开发的开源的监控&报警&时间序列数据库的组合。 Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态&#xff0c;任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的…

YOLOv8教程系列:三、使用YOLOv8模型进行自定义数据集半自动标注

YOLOv8半自动标注 目标检测半自动标注的优点包括&#xff1a; 1.提高标注效率&#xff1a;算法能够自动标注部分数据&#xff0c;减少了人工标注的工作量&#xff0c;节省时间和资源。 2.降低成本&#xff1a;自动标注可以减少人工标注的成本&#xff0c;特别是对于大规模数据…

如何在线制作闪图?手把手教你快速生成GIF闪图

网上那种卟玲卟领的闪动GIF图片效果非常的炫丽&#xff0c;这种GIF闪图是怎么制作的呢&#xff1f;很简单&#xff0c;只需要使用专业的gif制作&#xff08;https://www.gif.cn/&#xff09;工具-GIF中文网&#xff0c;上传多张颜色、大小不同&#xff0c;内容相同的jpg、png格…

ORB-SLAM3数据集配置与评价

在ORB-SLAM3运行EuRoC和TUM-VI数据集并作以评价。EuRoC利用微型飞行器(MAV ) 收集的视觉惯性数据集&#xff0c;TUM-VI 是由实验人员手持视觉-惯性传感器收集的数据集。这两个是在视觉SLAM中比较常用的公开数据集&#xff0c;所以测试并加以记录。 文章目录 一、EuRoC数据集测…

音频转文字软件免费版让你快速完成转换

音频转文字技术是一种将音频文件转换为文本形式的技术&#xff0c;它可以帮助人们更方便地获取和处理音频信息。在实际生活和工作中&#xff0c;我们可能会遇到需要将音频转换为文字的情况&#xff0c;比如听取会议录音、收听讲座、学习外语等等。那么&#xff0c;你知道音频转…

Tinkercad 建模21个小技巧

21个Tinkercad 建模小技巧 原文 参考文章&#xff1a;在 Tinkercad 中加快设计的 22 个技巧 一起来了解一下21个Tinkercad 3D建模小技巧&#xff0c;让你快人一步。 技巧1 Copy & Paste 文件&#xff0c;整合设计 想把文件A里面的模型拷贝到文件B里面&#xff1f; 很容…

【Linux命令200例】mren一个用于重命名文件或目录的命令行工具

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…

msvcr100.dll丢失怎样修复?最新的三个修复方法可解决

最近我遇到了一个问题&#xff0c;电脑提示我缺少了msvcr100.dll文件&#xff0c;导致某些程序无法正常运行。这让我意识到了计算机中的一些系统文件的重要性&#xff0c;也让我体会到了修复这类问题的必要性。msvcr100.dll文件是Windows系统中重要的文件&#xff0c;这是一个动…

docker容器的安装(windows、linux本地安装和在线安装)

目录 一、Docker发行版本&#xff1a; 1、Windows安装Docker&#xff08;作为了解&#xff09; 2、Linux安装Docker 二、安装前准备&#xff1a; 三、默认的yum安装 四、安装docker-ce 五、阿里云镜像加速器 Docker支持在主流的操作系统平台上使用&#xff0c;包括Windo…

飞致云开源社区月度动态报告(2023年7月)

自2023年6月起&#xff0c;中国领先的开源软件公司FIT2CLOUD飞致云将以月度为单位发布《飞致云开源社区月度动态报告》&#xff0c;旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况&#xff0c;以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源大…

el-table点击表格某一行添加到URL参数,访问带参URL加载表格内容并滚动到选中行位置 [Vue3] [Element-plus 2.3]

写在最前 需求&#xff1a;有个表格列出了一些行数据&#xff0c;每个行数据点击后会加载出对应的详细数据&#xff0c;想要在点击了某一行后&#xff0c;能够将该点击反应到URL中&#xff0c;这样我复制这个URL发给其他人&#xff0c;他们打开时也能看到同样的行数据。 url会根…