当前位置: 首页 > news >正文

Cypress自动化测试实战:构建高效的前端测试体系

在快速迭代的软件开发环境中,前端自动化测试是保证代码质量和用户体验的重要手段。Cypress作为一款功能强大的前端自动化测试工具,凭借其丰富的特性、直观的API和高效的测试执行速度,赢得了众多开发者和测试团队的青睐。本文将深入探讨Cypress自动化测试的实践应用,帮助读者构建高效的前端测试体系。

Cypress简介

Cypress是一款基于Node.js的前端自动化测试工具,它提供了端到端的测试解决方案,支持组件测试、集成测试和端到端测试。Cypress的核心优势在于其架构设计,它直接在浏览器中运行测试代码,与浏览器共享同一个事件循环,从而实现了真正的同步测试。此外,Cypress还提供了丰富的调试工具、直观的测试报告和强大的插件生态系统,使得测试编写、执行和调试变得更加简单高效。

Cypress安装与配置
安装Cypress

Cypress的安装非常简单,可以通过npm或yarn进行安装。以下是通过npm安装Cypress的示例:

npm install cypress --save-dev

安装完成后,可以在node_modules/.bin目录下找到Cypress的可执行文件。为了方便使用,可以将其添加到系统的PATH环境变量中。

配置Cypress

Cypress的配置主要通过cypress.json文件进行。该文件可以包含测试文件的路径、浏览器配置、插件配置等信息。以下是一个简单的cypress.json配置示例:

{  "baseUrl": "http://localhost:3000",  "viewportWidth": 1280,  "viewportHeight": 720,  "projectId": "your-cypress-project-id",  "retries": {  "runMode": 2,  "openMode": 0  },  "pluginsFile": "cypress/plugins/index.js",  "supportFile": "cypress/support/index.js"  
}

其中,baseUrl是测试环境的基地址,viewportWidthviewportHeight是测试时使用的视口大小,projectId是Cypress Dashboard项目的ID(用于远程运行和查看测试结果),retries是测试失败时的重试次数,pluginsFilesupportFile分别指定了插件文件和支持文件的路径。

Cypress测试编写

Cypress的测试文件通常放在cypress/integration目录下,每个测试文件都是一个JavaScript模块,可以使用Cypress提供的API来编写测试用例。

基本测试用例

以下是一个简单的Cypress测试用例示例,用于测试一个登录页面:

describe('Login Page', () => {  it('should login successfully with valid credentials', () => {  cy.visit('/login')  cy.get('#username').type('valid-username')  cy.get('#password').type('valid-password')  cy.get('#login-button').click()  cy.url().should('include', '/dashboard')  })  it('should show error message with invalid credentials', () => {  cy.visit('/login')  cy.get('#username').type('invalid-username')  cy.get('#password').type('invalid-password')  cy.get('#login-button').click()  cy.get('.error-message').should('contain', 'Invalid username or password')  })  
})

在这个示例中,我们使用了Cypress提供的cy.visitcy.getcy.typecy.clickcy.url等API来模拟用户的登录操作,并验证登录结果。

使用断言

Cypress提供了丰富的断言API,如shouldandnot等,用于验证页面元素的状态和属性值。以下是一个使用断言的示例:

describe('Dashboard Page', () => {  beforeEach(() => {  cy.login() // 假设我们有一个自定义的登录命令  })  it('should display the user\'s name on the dashboard', () => {  cy.visit('/dashboard')  cy.get('.user-name').should('contain', 'Valid User')  })  it('should have a logout button', () => {  cy.get('.logout-button').should('be.visible')  })  
})

在这个示例中,我们使用了should断言来验证页面元素的内容和可见性。

自定义命令

Cypress允许我们定义自定义命令来封装常用的测试逻辑。以下是一个定义自定义登录命令的示例:

// cypress/commands/login.js  
Cypress.Commands.add('login', (username, password) => {  cy.visit('/login')  cy.get('#username').type(username)  cy.get('#password').type(password)  cy.get('#login-button').click()  cy.url().should('include', '/dashboard')  
})  // 在cypress/support/commands.js中引入自定义命令  
import './commands/login'

定义完自定义命令后,我们就可以在测试用例中使用它了:

describe('Dashboard Page', () => {  beforeEach(() => {  cy.login('valid-username', 'valid-password')  })  // 测试用例...  
})
Cypress测试执行与报告
本地执行测试

Cypress提供了命令行工具来执行测试。以下是在本地执行所有测试的命令:

bash复制代码npx cypress run

执行完成后,Cypress会在控制台输出测试结果,并在cypress/videoscypress/screenshots目录下生成测试视频和截图。

远程执行测试

Cypress还提供了远程执行测试的功能,可以将测试上传到Cypress Dashboard并在远程环境中执行。以下是将测试上传到Cypress Dashboard并远程执行的命令:

bash复制代码npx cypress run --record --key your-record-key

其中,--key参数是Cypress Dashboard项目的记录密钥。执行完成后,可以在Cypress Dashboard上查看测试结果和详细的测试报告。

测试报告

Cypress提供了直观的测试报告,包括测试通过率、失败原因、测试视频和截图等信息。通过Cypress Dashboard,我们可以方便地查看和管理测试报告,并进行趋势分析和问题追踪。

Cypress高级功能
网络请求拦截与模拟

Cypress提供了强大的网络请求拦截与模拟功能,可以拦截并修改测试过程中的网络请求,或者模拟外部API的响应。以下是一个拦截并修改网络请求的示例:

cy.intercept('POST', '/api/login').as('loginRequest')  
cy.visit('/login')  
cy.get('#username').type('valid-username')  
cy.get('#password').type('valid-password')  
cy.get('#login-button').click()  
cy.wait('@loginRequest').then((interception) => {  interception.response.statusCode = 200  interception.response.body = { token: 'mock-token' }  
})

在这个示例中,我们使用了cy.intercept来拦截登录请求,并使用cy.wait来等待请求完成,然后修改请求的响应状态码和响应体。

插件生态系统

Cypress拥有丰富的插件生态系统,可以通过安装和使用插件来扩展Cypress的功能。例如,我们可以使用cypress-cucumber-preprocessor插件来将Cucumber的BDD(行为驱动开发)特性集成到Cypress中,从而使用Gherkin语法来编写测试用例。

并行与分布式执行

Cypress支持并行与分布式执行测试,可以显著提高测试执行速度。通过配置Cypress Dashboard的并行执行设置,我们可以将测试任务分发到多个机器或容器中执行,从而缩短测试周期。

总结

Cypress作为一款功能强大的前端自动化测试工具,为开发者和测试团队提供了高效、直观和可靠的测试解决方案。通过本文的介绍和实践应用,我们了解了Cypress的安装与配置、测试编写、测试执行与报告以及高级功能等方面的知识。希望这些内容能够帮助读者构建高效的前端测试体系,提高测试效率和质量,为软件的持续交付和迭代提供有力保障。

相关文章:

Cypress自动化测试实战:构建高效的前端测试体系

在快速迭代的软件开发环境中,前端自动化测试是保证代码质量和用户体验的重要手段。Cypress作为一款功能强大的前端自动化测试工具,凭借其丰富的特性、直观的API和高效的测试执行速度,赢得了众多开发者和测试团队的青睐。本文将深入探讨Cypres…...

【YOLO学习】YOLOv2详解

文章目录 1. 概述2. Better2.1 Batch Normalization(批归一化)2.2 High Resolution Classifier(高分辨率分类器)2.3 Convolutional With Anchor Boxes(带有Anchor Boxes的卷积)2.4 Dimension Clusters&…...

windows 录音编码为flv格式时,pcm采样格式

这里使用的是0x3e,转换为二进制: 0 0 1 1 1 1 1 0 前四个字节为3,表示Linear Pcm, 后4个字节1 1 1 0 表示44100HZ采样, 16个bit,单声道。 故,windows 音频采样不支持48000HZ频率...

Qt开发技巧(九)去掉切换按钮,直接传样式文件,字体设置,QImage超强,巧用Qt的全局对象,信号槽断连,低量数据就用sqlite

继续讲一些Qt开发中的技巧操作: 1.去掉切换按钮 QTabWidget选项卡有个自动生成按钮切换选项卡的机制,有时候不想看到这个烦人的切换按钮,可以设置usesScrollButtons为假,其实QTabWidget的usesScrollButtons属性最终是应用到QTabWi…...

51c自动驾驶~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/11466109 #HTCL 超过所有视觉方案!HTCL:分层时间上下文问鼎OCC 本文是对ECCV2024接受的文章 HTCL: 的介绍,HTCL在SemanticKITTI基准测试中超过了所有基于相机的方法,甚至在和…...

Star 3w+,向更安全、更泛化、更云原生的 Nacos3.0 演进

作者:席翁 Nacos 社区刚刚迎来了 Star 突破 30000 的里程碑,从此迈上了一个新的阶段。感谢大家的一路支持、信任和帮助! Nacos /nɑ:kəʊs/是 Dynamic Naming and Configuration Service 的首字母简称,定位于一个更易于构建云原…...

PHP魔幻(术)方法

PHP中的魔幻方法,也被称为魔术方法(Magic Methods),是一组具有特殊功能的方法。这些方法在PHP中有固定的名称,并且会在特定的时机自动被PHP调用,而无需开发者显式调用。它们通常用于执行一些特殊的操作&…...

VS开发 - 静态编译和动态编译的基础实践与混用

目录 1. 基础概念 2. 直观感受一下静态编译和动态编译的体积与依赖项目 3. VS运行时库包含哪些主要文件(从VS2015起) 4. 动态库和静态库混用的情况 5. 感谢清单 1. 基础概念 所谓的运行时库(Runtime Library)就是WINDOWS系统…...

Golang | Leetcode Golang题解之第451题根据字符出现频率排序

题目: 题解: func frequencySort(s string) string {cnt : map[byte]int{}maxFreq : 0for i : range s {cnt[s[i]]maxFreq max(maxFreq, cnt[s[i]])}buckets : make([][]byte, maxFreq1)for ch, c : range cnt {buckets[c] append(buckets[c], ch)}an…...

零信任如何增强网络物理系统 (CPS) 安全性

远程访问对于管理关键基础设施至关重要,因为它允许企业优化和扩展运营并保持效率。然而,它也带来了许多安全漏洞,而且随着连接设备数量的增加,这些漏洞只会越来越多。 到 2025 年,企业和消费者环境中的物联网设备数量…...

V3D——从单一图像生成 3D 物体

导言 论文地址:https://arxiv.org/abs/2403.06738 源码地址:https://github.com/heheyas/V3D.git 人工智能的最新进展使得自动生成 3D 内容的技术成为可能。虽然这一领域取得了重大进展,但目前的方法仍面临一些挑战。有些方法速度较慢&…...

计算机网络期末复习真题(附真题答案)

前言: 本文是笔者在大三学习计网时整理的笔记,哈理工的期末试题范围基本就在此范畴内,就算真题有所更改,也仅为很基础的更改数值,大多跑不出这些题,本文包含简答和计算等大题,简答的内容也可能…...

Unity 的 UI Event System 是一个重要的框架

Unity 的 UI Event System 是一个重要的框架,用于处理用户界面中的输入事件。以下是它的主要特点和功能: 1. 事件管理 UI Event System 负责捕获和管理来自用户的输入事件,如鼠标点击、触摸、键盘输入等。 2. 事件传播 事件通过层次结…...

第十三章 集合

一、集合的概念 集合:将若干用途、性质相同或相近的“数据”组合而成的一个整体 Java集合中只能保存引用类型的数据,不能保存基本类型数据 数组的缺点:长度不可变 Java中常用集合: 1.Set(集):集合中的对象不按特定方式排序&a…...

子非线程池中物

线程池&#xff0c;又好上了 有任务队列 任务要处理就直接放到里面 预先创建好线程&#xff0c;本质上也是一个生产消费模型 线程池真是麻烦啊 我们可以直接沿用之前写过的代码&#xff0c;Thread.hpp: #pragma once #include <iostream> #include <functional&…...

Unraid的cache使用btrfs或zfs?

Unraid的cache使用btrfs或zfs&#xff1f; 背景&#xff1a;由于在unraid中添加了多个docker和虚拟机&#xff0c;因此会一直访问硬盘。然而&#xff0c;单个硬盘实在难以让人放心。在阵列盘中&#xff0c;可以通过添加校验盘进行数据保护&#xff0c;在cache中无法使用xfs格式…...

微服务实战——平台属性

平台属性 中间表复杂业务 /*** 获取分类规格参数&#xff08;模糊查询&#xff09;** param params* param catelogId* param type type"base"时查询基础属性&#xff0c;type"sale"时查询销售属性* return*/ Override public PageUtils listByCatelogId…...

半监督学习与数据增强(论文复现)

半监督学习与数据增强&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 文章目录 半监督学习与数据增强&#xff08;论文复现&#xff09;概述算法原理核心逻辑效果演示使用方式 概述 本文复现论文提出的半监督学习方法&#xff0c;半监督学习&…...

css3-----2D转换、动画

2D 转换&#xff08;transform&#xff09; 转换&#xff08;transform&#xff09;是CSS3中具有颠覆性的特征之一&#xff0c;可以实现元素的位移、旋转、缩放等效果 移动&#xff1a;translate旋转&#xff1a;rotate缩放&#xff1a;scale 二维坐标系 2D 转换之移动 trans…...

SQL进阶技巧:统计各时段观看直播的人数

目录 0 需求描述 1 数据准备 2 问题分析 3 小结 如果觉得本文对你有帮助&#xff0c;那么不妨也可以选择去看看我的博客专栏 &#xff0c;部分内容如下&#xff1a; 数字化建设通关指南 专栏 原价99&#xff0c;现在活动价39.9&#xff0c;十一国庆后将上升至59.9&#…...

Stream流的终结方法

1.Stream流的终结方法 2.forEach 对于forEach方法&#xff0c;用来遍历stream流中的所有数据 package com.njau.d10_my_stream;import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.function.Consumer; import java.util…...

JavaWeb——Vue组件库Element(4/6):案例:基本页面布局(基本框架、页面布局、CSS样式、完善布局、效果展示,含完整代码)

目录 步骤 基本页面布局 基本框架 页面布局 CSS样式 完善布局 效果展示 完整代码 Element 的基本使用方式以及常见的组件已经了解完了&#xff0c;接下来要完成一个案例&#xff0c;通过这个案例让大家知道如何基于 Element 中的各个组件制作一个完整的页面。 案例&am…...

【c++】 模板初阶

泛型编程 写一个交换函数&#xff0c;在学习模板之前&#xff0c;为了匹配不同的参数类型&#xff0c;我们可以利用函数重载来实现。 void Swap(int& a, int& b) {int c a;a b;b c; } void Swap(char& a, char& b) {char c a;a b;b c; } void Swap(dou…...

R 语言 data.table 大规模数据处理利器

前言 最近从一个 python 下的 anndata 中提取一个特殊处理过的单细胞矩阵&#xff0c;想读入R用来画图&#xff08;个人比较喜欢用R可视化 &#xff09;&#xff0c;保存之后&#xff0c;大概几个G的CSV文件&#xff0c;如果常规方法读入R&#xff0c;花费的时间比较久&#x…...

Java 静态代理详解:为什么代理类和被代理类要实现同一个接口?

在 Java 开发中&#xff0c;代理模式是一种常用的设计模式&#xff0c;其中代理类的作用是控制对其他对象的访问。代理模式分为静态代理和动态代理&#xff0c;在静态代理中&#xff0c;代理类和被代理类都需要实现同一个接口。这一机制为实现透明的代理行为提供了基础&#xf…...

OpenCV C++霍夫圆查找

OpenCV 中的霍夫圆检测基于 霍夫变换 (Hough Transform)&#xff0c;它是一种从边缘图像中识别几何形状的算法。霍夫圆检测是专门用于检测图像中的圆形形状的。它通过将图像中的每个像素映射到可能的圆参数空间&#xff0c;来确定哪些像素符合圆形状。 1. 霍夫变换的原理 霍夫…...

H.264编解码介绍

一、简介 H.264,又称为AVC(Advanced Video Coding),是一种广泛使用的视频压缩标准。它由国际电信联盟(ITU)和国际标准化组织(ISO)联合开发,并于2003年发布。 H.264的发展历史可以追溯到上个世纪90年代。当时,视频压缩技术的主要标准是MPEG-2,但它在压缩率和视频质…...

Java | Leetcode Java题解之第450题删除二叉搜索树中的节点

题目&#xff1a; 题解&#xff1a; class Solution {public TreeNode deleteNode(TreeNode root, int key) {TreeNode cur root, curParent null;while (cur ! null && cur.val ! key) {curParent cur;if (cur.val > key) {cur cur.left;} else {cur cur.rig…...

【CViT】Deepfake Video Detection Using Convolutional Vision Transformer

文章目录 Deepfake Video Detection Using Convolutional Vision Transformerkey points**卷积视觉变压器**FLViT实验总结Deepfake Video Detection Using Convolutional Vision Transformer 会议/期刊:2021 作者: key points 提出了一种用于检测深度伪造的卷积视觉变压器…...

安卓主板_MTK4G/5G音视频记录仪整机及方案定制

音视频记录仪方案&#xff0c;采用联发科MT6877平台八核2* A78 6* A55主频高达2.4GHz, 具有高能低耗特性&#xff0c;搭载Android 12.0智能操作系统&#xff0c;可选4GB32GB/6GB128GB内存&#xff0c;运行流畅。主板集成NFC、双摄像头、防抖以及多种无线数据连接&#xff0c;支…...

呼和浩特网站建设费用/谷歌seo是什么

2020年普通高等学校招生全国统一考试(A卷)程序员的高考试卷(A卷)考生类别&#xff1a;码农1、程序员A&#xff1a;借我1000元吧。程序员B&#xff1a;给你凑个整数。程序员B借给程序员A多少钱&#xff1f;()A. 1000元B. 1024元C. 1111元2、程序员A&#xff1a;嘿 //是什么意思啊…...

柳州企业网站建设公司/百度互联网营销

IDEA 版本&#xff1a;2020.2 EAP项目build没有任何问题&#xff0c;在运行SpringBoot服务时&#xff0c;出现某个模块运行异常,出现报错信息 java.lang.NoClassDefFoundError: com/intellij/util/messages/Topic 问题分析&#xff1a; 错误提示的报名是: com/intellij/util/…...

网站建设7个基本流程/seo外包

在python中&#xff0c;给一个对象赋值&#xff0c;实际上就是对象对内存空间存储的值的引用。当我们把对象赋值给另一个变量的时候&#xff0c;这个变量并没有拷贝这个对象&#xff0c;而只是拷贝了这个对象的引用而已。一般情况下我们会通过三种方法来实现拷贝对象的引用。Py…...

怎么搭建自己的网站平台/上海网络推广联盟

1、windows和linux执行jar命令是一样的&#xff0c;java -jar xxx.jar 2、使用nohup命令将jar程序设置成后台运行&#xff0c;运行日志输出到nohup.out&#xff0c;关闭窗口无影响 nohup java -jar xxx.jar > nohup.out 2>&1 & 3. 查看指定jar进程命令 ps aux…...

有人和兽做的网站/旅游企业seo官网分析报告

浅谈企业会计管理与财务管理的区别与联系【摘要】认识事物的关键还是要弄清事物之间的区别与联系。在具体的会计管理与财务管理工作中&#xff0c;会计与财务管理的专业术语和概念。既有区别&#xff0c;又有联系&#xff0c;往往使人对它们之间的若干名同实异的概念弄之不清&a…...

嘉兴建设网站/网络推广外包加手机蛙软件

2019年5月1日21:39:55 原文&#xff1a;http://docs.jboss.org/hibernate/orm/5.4/javadocs/ 这个是hibernate 5.4版本 基于hibernate的一些工具api文档 http://docs.jboss.org/hibernate/ spring jpa的文档 https://spring.io/projects/spring-data-jpa#learn Package org.hib…...