前端开发:基于cypress的自动化实践

news2025/1/9 19:16:40
  • 如何在vue中使用cypress
  • 如何运行cypress
  • 如何编写测试用例
  • 如何解决测试数据的问题
  • 遇到的元素定位的问题
  • 如何看待cypress
  • cypress是否为最佳工具
  • 测试怎么办?

如何在vue中使用cypress

vue提供了vue-cli 可以快速的创建vue项目。

vue create hello-world

在选择安装项里面选择: E2E testing -> cypress

如何运行测试

  1. 通过命令启动
> npm run test:e2e
  1. 开启cyprss 管理窗口

  1. 点击Run all specs 或 某个测试文件运行

这里以项目管理 模块为例,运行5条用例只需要14s,速度还是非常快的。

如何编写测试用例

站在前端开发的角度上编写UI自动化用例,总体感受还是非常方便的!

首先,为所有要操作的元素设置统一的属性。

<el-button cy-data="create-project" type="primary" @click="showCreate">创建</el-button>
...
<el-button cy-data="edit-project" type="text" size="small" @click="showEdit(scope.row)">编辑</el-button>
<el-button cy-data="delete-project" type="text" size="small" @click="deleteProject(scope.row)">删除</el-button>
...

不建议占用HTML提供的的 idnameclass... 这些属性,他们一般都会有指定的用途,比如,class 是用来引用css样式的。 那么通过cy-data=xxxx即可以避免冲突,又更加统一和规范。

接下来,就是编写 cypress 自动化代码了

describe('项目管理', () => {
  it('添加项目', () => {
    cy.visit('/#/project')
    cy.get('[cy-data=create-project]', { timeout: 3000 }).click()
    cy.wait(1000)
    cy.get('[cy-data=project-name]', { timeout: 3000 }).type('项目名称')
    cy.get('[cy-data=project-desc]', { timeout: 3000 }).type('项目备注信息')
    cy.get('[cy-data=save-button]', { timeout: 3000 }).click()  // 保存项目
  });
  // ...
})

如何解决测试数据的问题

我们编写自动化测试用例,不管是接口还是UI都会面临测试数据的问题。比如,我要测试登录,得先去创建一个用户数据,我要测试搜索,先去创建一批可以搜索的数据。

为此,我们不得不在自动化里面 使用setUp/treaDown这些fixture去写大量的前置或后置动作,来完成这些准备工作。站在测试的角度,这无疑让我们的测试用例变得复杂,然后,也很容易因为测试数据造成自动化用例的失败。

那么,站在前端开发是如何解决的?在此之前我们要先了解一下开发过程:

在项目开发过程中。前端为了更顺利的完成开发工作,不能等到后端开发好了接口,再手写前端功能,所以,会和后端定义好接口之后,通过mock来模拟接口数据,--面向mock开发

那么在面向mock开发的过程中,避免不了,前后端需要调整接口参数的情况,比如,前端需要增加一个字段,或后端说需要把数据结构调整一下。

我们使用YAPI平台进行接口的定义,他可以根据定义随机的生成mock数据,数据的每个字段都可以随机生成,例如,nameemaildatatime 等。

你可以直接通过下面的链接来访问mock接口:

https://yapi.baidu.com/mock/40650/api/v1/projects/list

如何vue项目当中配置不同的环境?你需要去学习vue开发...

遇到的元素定位问题

然而,为每个元素添加定位方式,有时并不是我们想象的那么简单。

如果你是使用过前端UI(例如 element-ui)库就会发现,并不是所有的页面元素都是通过HTML纯手写的。 例如,下面的弹窗。

通过 element-UI的实现方式是这样子的。

<template>
  <el-button type="text" @click="open">点击打开 Message Box</el-button>
</template>

<script>
  export default {
    methods: {
      open() {
        this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          this.$message({ type: 'success',  message: '删除成功!' });
        }).catch(() => {
          this.$message({ type: 'info', message: '已取消删除' });          
        });
      }
    }
  }
</script>

弹窗完全通过 element-UI 渲染,我们无处给 确定取消 等按钮加上定位专用属性。 这个时候,前端开发就没什么优势了,必须老老实实的去前端页面上定位元素,写复杂的css定位。

然而,就算我自定义了定位,有时候元素也不是唯一的。例如

对于上面的列表,通过自定义定位得到的是一组元素。然而,如果只是一组元素的问题就就没必要单独拿出来说了,正如上图,列表中看到的是 4 个元素,通过定位方式得到的是8个元素,前4个是隐藏的,这和使用的 element-UI 库有关,因为数据是YAPI随机生成的,不能写死对第5个显示元素进行操作。 cypress 提供的 force 非常有用,他会强制对隐藏的元素进行操作。

cy.get('[cy-data=edit-project]', { timeout: 3000 }).first().click({ force: true })

如何看待cypress

前端开发视角

作为一名前端开发,客观的说,使用cypress的过程并没有遇到太多阻力。我来总结一下。

  1. 因为使用了yapi,不需要考虑测试数据的准备。
  2. 不需要写依赖步骤,主要是目前的业务功能也没有太长的操作过程。
  3. 大部分情况下可以自定义元素属性,在定位上不需要花费过多的时间,也不需要写太长的定位。
  4. 测试运行速度可以接受,28条用例运行耗时80秒左右。

测试视角

作为一名自动化测试,如果让我使用cypress。

  1. 为了验证数据的正确性,我不能要求开发使用 yapi 假数据,所以,还是要自己准备数据。
  2. 根据业务的情况,必须要的前置/后置动作不可避免。
  3. 虽然,说服开发统一自定义元素有点难,对来我说并不是不可办到!
  4. cypress 做UI自动化确实比selenium要快一些,但是他相比selenium,不支持更多的浏览器,不支持Grid远程调用,甚至不能根据自己的熟练度选择语言。所以,cypress 优势并没有压倒性优势,具体还是要看需求。

cypress是否为最佳工具

cypress是否为所有UI自动化的最佳工具?

在面向前端的开发框架Vue/React中 确实很好的整合cypress,使我们的使用更加方便。

在我接触到的偏后端的django Web框架中就很好的整合了Selenium,同样可以达到类似的效果。 我之前看过一本《Test-Driven Development with Python》 ,书中就很好的将基于Selenium的UI测试与Django开发很好的结合起来了。

所以,结论是结合你的开发框架去选择合适的 E2E 测试工具。

测试怎么办?

一直以来,我们都天然的认为UI自动化测试就应该是测试来做的,并以能做UI自动化测试为高级目标!但从我上面的实践中,我们会发现其实开发来做UI自动化优势很明显。那么测试怎么办?我们只能老老实实的回去测功能了吗?当然不是。

  1. 并不是每个开发都懂得编写UI自动化测试,虽然,这对他们来并不是特别难,我们完全在这方面成为“教练”,教开发如何编写UI自动化测试,如何设计更全面的测试用例。

  2. 并不是每个团队的开发都有时间编写UI自动化测试,也可能是他们不愿意写,那么我们为何不加入他们?以我前面介绍的方式,深度地参与到项目的自动化测试编写中。而不是现在这样,将项目开发和自动化测试完全割裂开分别进行。

正在做测试的朋友可以进来交流,群里给大家整理了大量学习资料和面试题项目简历等等....

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

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

相关文章

【亲测】集群环境中MMDetection3.0环境配置

本文记录下在集群环境下使用MMDetection的内容。 环境简介&#xff1a;所用集群设备为本地集群&#xff0c;具有管理节点和计算节点&#xff0c;且管理和计算在不同的主机上&#xff0c;作为用户&#xff0c;没有超级管理员权限。 MMdetection源码下载点击进入 这里主要记录下环…

二叉树题目:二叉树的中序遍历

文章目录 题目标题和出处难度题目描述要求示例数据范围进阶 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 解法三思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉树的中序遍历 出处&#xff1a;94. 二叉树的中序遍历 难度 3 级 题目描…

Windows Terminal添加至鼠标右键

Windows Terminal添加至鼠标右键 安装 在Microsoft Store中即可下载。 配置 在鼠标右键打开 下载Terminal图标 图标地址:https://raw.githubusercontent.com/microsoft/terminal/master/res/terminal.ico 下载后保存在某个文件夹path 添加到鼠标右键 批处理修改注册表 …

Linux常见指令(超详解哦)

Linux常见指令 引言Linux常见指令查指令——man文件管理相关指令lspwdcdtouchmkdirrmdir与rmrmdirrm cpmvfind 文件查看类catmorelesshead 与 tailheadtail使用管道显示某段内容 grep 打包压缩相关指令zip/unziptar 总结 引言 Linux与我们熟悉的Window都是操作系统&#xff0c…

spring-aop入门

spring-aop入门 什么是AOP OOP(Object-Oriented Programming)面向对象编程&#xff0c;允许开发者定义纵向的关系&#xff0c;但并适用于定义横向的关系&#xff0c;导致了大量代码的重复&#xff0c;而不利于各个模块的重用。 AOP(Aspect-Oriented Programming)&#xff0c;…

优思学院|质量管理六大思维陷阱【五】:有了控制图就能改进质量?

1. 引言 在工厂的生产过程中&#xff0c;质量控制是至关重要的。控制图是一种常见的质量管理工具&#xff0c;它可以帮助工厂监测过程的稳定性和质量表现&#xff0c;同时它也是六西格玛最重要的工具之一。然而&#xff0c;人们对于控制图的理解并不总是正确&#xff0c;有时被…

【中危】Kubernetes secrets-store-csi-driver 信息泄露漏洞

漏洞描述&#xff1a; Kubernetes secrets-store-csi-driver 是一个用于 Kubernetes 的 CSI 驱动程序&#xff0c;它提供了一种将外部密钥存储系统中的凭据注入到 Kubernetes Pod 的机制。 在 secrets-store-csi-driver 受影响版本中&#xff0c;当在 CSIDriver 对象中配置了…

操作系统期末复习简记(更新中~)

文件 定义&#xff1a;文件是以计算机硬盘为载体的存储在计算机上的信息集合&#xff08;宽泛的&#xff09; 属性&#xff1a;描述文件状态的信息&#xff0c;eg.名称&#xff0c;修改时间等等 基本操作&#xff1a;创建、打开、修改文件 文件的逻辑结构 1、无结构文件&#x…

【SpringMVC】统一异常处理 前后台协议联调 拦截器(文末赠书)

1&#xff0c;统一异常处理 1. 问题描述 在讲解这一部分知识点之前&#xff0c;我们先来演示个效果&#xff0c;修改BookController类的getById方法 GetMapping("/{id}") public Result getById(PathVariable Integer id) {//手动添加一个错误信息if(id1){int i …

JS BOM和DOM对象的尺寸

A scroll…..系列 scrollHeight: 获取对象的滚动高度。 scrollWidth:获取对象的滚动宽度 scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离 内容距左边框的距离(不算padding与border) scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最…

智慧景区预约系统开发 实现游客自助游玩

旅游是我们休闲娱乐的重要手段之一&#xff0c;尤其是疫情放开以来&#xff0c;旅游成为很多人节假日的首选。绝大多数的旅游景区都是需要购票参观的&#xff0c;对于景区来说也是卖出的票越多&#xff0c;盈利越多。所以各大景区也一直都在拓展新的售票渠道来提升旅客数量。通…

JavaScript基础笔记

JavaScript 介绍 JavaScript 是什么 1JavaScript 书写位置 JavaScript 注释 JavaScript 结束符 JavaScript 输入输出语法 变量 变量是什么&#xff1f; 变量的基本使用 变量的本质 变量命名规则与规范 数组的基本使用 常量 数据类型 数据类型 – 数字类型&#xff08;Number&…

基于ICA算法的图像融合matlab完整程序分享

用特定的算法将两幅或多幅图像综合成一幅新的图像。融合结果由于能利用两幅(或多幅) 图像在时空上的相关性及信息上的互补性,并使得融合后得到的图像对场景有更全面、清晰的描述,从而更有利于人眼的识别和机器的自动探测。 确保待融合图像已配准好且像素位宽一致,且融…

《向量数据库》——Milvus v1.0 已发布

Milvus v1.0 已发布 今天,我们很高兴地宣布 Milvus v1.0 版本的发布。通过数百名 Milvus 社区用户在八个月内不断的测试和试验, Milvus v0.10.x 现在已足够稳定,是时候该发布基于 Milvus v0.10.6 的 Milvus v1.0 了。 Milvus v1.0 具有以下功能: 支持主流的相似度计算方式…

软件测试CMA认证和CNAS认可分别有什么作用?

随着信息化时代的飞速发展&#xff0c;软件已经成为各行各业必不可少的工具。但是&#xff0c;随之而来的问题就是软件的质量问题&#xff0c;尤其是安全问题。这就需要软件测试行业的发展。而软件测试CMA认证和CNAS认可对于软件测试企业来说&#xff0c;是非常重要的两个证书。…

Android classLoader 双亲委托 反射 类加载

双亲委托 双亲委托机制&#xff0c;就是导入类的时候判断parent是否已经导入过该类。 作用 1、避免重复加载&#xff0c;当父加载器已经加载了该类的时候&#xff0c;没有必要子ClassLoader再加载一次。 2、安全性考虑&#xff0c;防止核心API库被随意篡改。 核心代码 pri…

java【String类的常用方法】

String类 String类的常用方法1 字符串的构造方法2 String对象的比较3 字符串查找4 字符串与其他类型的转换4.1 字符串和数值互相转换4.2 大小写转换4.3 字符串转数组4.4 字符串格式化 5 字符串的替换6 字符串的截取操作7 字符串的拆分8 字符串去除空格trim()方法 String类的常用…

费报只是小 case!电子影像系统,工作效率up无限

在日常工作中,我发现许多朋友对电子影像系统存有一个错误认知,“电子影像系统,我了解,就是用来做费用报销的吧”。 但事实上,电子影像系统的实用价值远非这样,它可以解决企业许多业务场景中的难点。今天,让我们一起来探讨电子影像系统,希望能对大家在企业数字化改革中带来更多帮…

spring security oauth2学习 -- 快速入门

1.Oauth2认证协议 简单理解&#xff1a; OAuth2是目前最流行的授权协议&#xff0c;用来授权第三方应用&#xff0c;获取用户数据。 1.1 流程 客户端通过认证和授权&#xff0c;向资源服务器去访问资源。 其中&#xff0c;授权和认证都需要在授权服务器&#xff0c;由资源拥…

【Java】parallelStream().forEach() 的踩坑日记

文章目录 前言踩坑日记刨根问底解决方案小结 前言 最近一直在开发项目中的新需求&#xff0c;其中有一个需求是“解析文件&#xff08;.txt文件&#xff0c;一行就是一条数据&#xff09;中的数据并进行入库操作”。其实这个需求也很简单&#xff0c;无非就是将文件中每一行数…