Cypress 与 Selenium WebDriver

功能测试自动化工具的王座出现了新的争夺:Cypress.io。赛普拉斯速度快吗?是的。赛普拉斯是交互式的吗?是的。赛普拉斯可靠吗?你打赌。最重要的是……这很酷!

但 Cypress 是Selenium WebDriver的替代品吗?Selenium,当前的 Web 自动化和测试框架之王,是否会因担心自己的地位而畏缩,或者它是否对所谓的篡夺者仁慈地微笑,因为它完全知道,好吧,它只是一个孩子!

Cypress 比 Selenium WebDriver 更好吗?我经常被问到这个问题。坦率地说,“这个与那个”文章的最简单途径是尝试找出哪个是“最好的”。但我不会走那条路。相反,我将尝试解释 Cypress 与 Selenium WebDriver 有何不同。

将 PostgreSQL 数据库与 ANF 无缝集成

想象一下无需支付任何许可费即可获得最高性能。加入我们即将举办的研讨会,了解Instaclustr 如何让您比以往更轻松地部署数据库等!

通过描述 Cypress 和 Selenium WebDriver 之间的区别,您将能够了解 Cypress 的工作原理。这篇文章还将尝试解释为什么Cypress 采取了 Web 浏览器自动化的道路,这条道路与 WebDriver 所采取的道路截然不同。

Cypress 与 Selenium WebDriver 有何相似之处?它们都控制和自动化 Web 浏览器,从而使您能够编写模拟用户操作的功能测试,并验证结果是否正确。但这就是相似之处结束的地方,也是差异开始的地方。希望了解这两种测试工具之间的差异以及造成这种差异的原因能够帮助您选择使用哪种工具以及何时使用。

让我们开始探索这些差异。

适用于前端开发人员!
Selenium WebDriver 专为 Web 应用程序的端到端回归测试而构建。Selenium 前端测试框架主要由 QA 开发人员使用,但开发人员并不多。这是因为前端开发人员测试自己的代码的想法并不常见。

但前端开发人员的世界正在开始发生一场小革命。前端开发人员开始编写自己的测试。是的,他们正在迎接敏捷软件方法的挑战。他们明白,如果不编写自己的测试,敏捷开发就不可能发生。他们正在编写单元测试,但也在编写集成,是的,还有使用真实浏览器检查其前端的端到端功能测试,就像 QA 开发人员编写的自动化测试一样。“左移”运动有很多这样的趋势。

前端开发人员对端到端测试的需求与 QA 开发人员的需求不同。前端开发人员不需要部署应用程序(前端、后端和数据库系统)的临时环境。他们只需在本地运行前端部分就可以了,并且可以轻松地模拟后端 。

这一事实——Cypress 的目标受众是前端开发人员——是 Cypress 和 WebDriver 之间所有差异的核心。它们是针对不同用户的不同工具。

仅限 JavaScript!
前端 Web 开发人员只使用一种语言编写——JavaScript。它是浏览器可以执行的唯一语言,因此它们别无选择。这种限制有其缺点和优点,但事实是存在的——前端开发人员只有一种语言(尽管有像TypeScript 这样的变体)。

而且,由于 Cypress 是为前端开发人员设计的,因此 Cypress 测试只能用 JavaScript 编写。不支持其他语言。与 Selenium WebDriver 相比,Selenium WebDriver 的 API 与多种语言绑定,包括 Java、C#、Python、Ruby、R、Dart、Objective-C,当然还有 JavaScript。

所以记住——如果你想做 Cypress 测试,你就必须学习 JavaScript。这很酷,因为今天的 JavaScript 不是你祖父母的 JavaScript。它是一种现代的、强大的、简洁的语言,如今被广泛使用,并拥有世界上最大的开源包存储库(http://stackoverflow.com/questions/1744777/),这个代码存储库在几年前超过了曾经最大的存储库,即存储库。

仅限摩卡!
Cypress 不仅限制您可以编写的语言,还限制您使用的测试框架。Mocha 是您用来编写测试的测试框架(测试框架在 JavaScript 中的作用类似于JUnit 在 Java 中的作用,或NUnit 在 C# 中的作用)。您无法在其他 JavaScript 框架(例如Jest 或Tape)中编写测试。

另一方面,Selenium WebDriver 不会将测试框架强加给您。此外,您甚至不必使用测试框架。您可以编写一个不是测试的常规程序,一个仅驱动浏览器的程序。许多项目都以这种方式使用 WebDriver,例如抓取网页和收集信息。

但Cypress很早就决定,它专门负责编写前端测试的任务,并且只能在测试框架内使用,而测试框架必须是Mocha。

cy.visit 将使浏览器导航到给定的 url。

cy.get 将返回对相关元素的引用,您可以在该元素上键入、单击或检查有关使用 contains 和其他断言的断言。

正如您所看到的,从表面上看,它与 Selenium Webdriver 惊人地相似,尽管更简单,而且功能更强大。

仅限 Chrome!
Cypress 测试运行程序仅适用于 Chrome。它不支持 Firefox、Safari、Edge 或 IE。这可能会让习惯了 WebDriver对所有这些浏览器的惊人支持的 QA 开发人员感到震惊。但是,是的,Cypress 只是 Chrome。有一个针对跨浏览器支持的问题,但该问题已经存在了近一年了。赛普拉斯的优先事项似乎在其他地方。

为什么前端开发人员只想在 Chrome 中运行测试?我相信这个问题有多种答案。首先,现在 Chrome、Firefox、Safari 和 Edge 之间的差异很小,而且对于大多数应用程序来说,差异越来越小。因此,在开发中进行测试时,仅在 Chrome 中进行检查可能就足够了。

其次,在所有浏览器上运行所有测试需要时间,正如我们上面所说,前端开发人员不想等待他们的测试。

第三,许多公司都有 QA 开发人员在所有浏览器上运行端到端测试,因此他们可以接受偶尔出现的非常罕见的错误并被 QA 团队发现。那些没有进行广泛的跨浏览器测试的公司呢?然后,他们就可以接受这些罕见的错误时不时地溜到用户手中。

第四,前端开发人员确实关心,并希望 Cypress 支持更多浏览器,但考虑到上述原因,这并不是他们的优先事项。

它在浏览器中运行!
除了前端开发人员习惯使用 JavaScript 之外,还有另一个更技术性的原因:仅支持 JavaScript。

您在 Cypress 测试脚本中编写的代码不会像在 WebDriver 中那样在浏览器外部运行。它运行浏览器。它正在执行您的测试代码。事实上,它正在执行您正在测试的应用程序代码的测试代码!

当您运行测试时,首先,Cypress 将准备您的代码以在浏览器中运行(从技术上讲,它将使用 webpack 将代码中的所有模块捆绑到一个 JS 文件中)。准备好后,它将运行 Chrome,并将您的测试代码注入到空白页面中。然后它将在浏览器中运行该测试代码。

该测试代码首先导航到应用程序页面(使用 `cy.navigate(' http://localhost:8080  ')`),该页面在 . Cypress 将使 iframe 导航到该页面,但您的代码正在浏览器中运行,并且(有点神奇地)可以访问与该 iframe 相同的内容,因此所有命令(例如“单击”或“类型”)都发生在内部浏览器,使用常规 .

为了进行比较,让我们回顾一下 Selenium WebDriver 架构以及这对于 Selenium 测试的运行方式意味着什么。看一下下图。

使用 Selenium WebDriver,您有三个流程:

硒网络驱动程序
浏览器驱动程序,例如ChromeDriver、GeckoDriver(适用于 Firefox)、EdgeDriver、SafariDriver等。
浏览器本身
这些进程之间的所有通信意味着 Selenium 测试需要很长时间才能运行。这将我们引向下一点:

它很快!
这种浏览器内执行是基于赛普拉斯测试的速度。使用 Cypress,您只有一个进程:浏览器本身。使用 Cypress,您的测试代码与应用程序代码一起运行。

因此,自动化命令(例如,单击按钮)不会像 WebDriver 那样通过进程外通信将命令发送到浏览器。相反,Cypress 使用DOM 事件向按钮发送单击命令。快得多。

虽然 WebDriver 的进程外自动化涉及异步通信,但 Cypress 的自动化命令大多是同步的且位于内存中。这会产生极快的测试。

我相信正是这种速度才是前端开发者迷恋Cypress的主要原因。WebDriver,至少在感知方面,没有给他们提供他们需要的速度。前端开发人员希望一直运行他们的测试,并且无法承受需要运行数十分钟的套件的奢侈。他们想要运行他们的套件,并且需要它在一两分钟内运行,而不是更长时间。

这种速度差异真的像赛普拉斯文档声称的那样很大吗?从我公认的小实验来看,是的,但我不相信这种差异值得 WebDriver 所具有的其他好处。亲自尝试一下小样本测试,然后亲自看看!

它有内置的服务器模拟!
但赛普拉斯被认为更快还有另一个原因。让我们提醒自己,Cypress 是为前端开发人员设计的。我们还要提醒自己,前端开发人员有时不使用真正的后端,而是模拟发送到服务器的XML HttpRequest 。无论您使用的是 Cypress 还是 Selenium WebDriver,这都可以实现极快的测试,只需几秒。

Cypress 明白这一点,并且拥有用于模拟服务器响应的内置设施,这些设施对于其目标受众(前端开发人员)至关重要。Selenium WebDriver 没有这方面的设施,为了模拟服务器响应,WebDriver 测试需要运行一个返回正确响应的模拟服务器。虽然可能,但它是一种较慢且不太方便的选择:用于模拟的快速且内存中的设施总是优于缓慢的进程外设施。

这不仅仅是执行速度。就编写测试的速度而言,模拟服务器的内置工具的便利性怎么强调都不为过。事实上,每个测试都明确地描述了模拟响应,这比模拟相同响应的单独服务器程序更容易编码(和理解!)。

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

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

相关文章

React 中的 useState() 是什么?

在 React 中,useState() 是一个用于在函数组件中声明状态的 Hook。它是 React 16.8 引入的一种新的状态管理方式。 useState() 函数返回一个数组,其中包含两个元素:当前的状态值和一个更新状态值的函数。用数组的解构赋值来获取这两个元素。…

CentOS 7 中安装Kafka

文章目录 安装JDK解压环境变量验证 安装ZooKeeper下载解压环境变量配置启动开放端口 安装Kafka下载解压配置启动 CentOS 7.6 JDK 1.8 ZooKeeper 3.5.7 Kafka 2.11-2.4.0 安装JDK 解压 # 解压 tar -xzvf jdk-8u181-linux-x64.tar.gz mv jdk1.8.0_181 /usr/local/jdk1.8环境变量…

OpenGL —— 2.7、绘制多个自旋转的贴图正方体(附源码,glfw+glad)

源码效果 C源码 纹理图片 需下载stb_image.h这个解码图片的库,该库只有一个头文件。 具体代码: vertexShader.glsl #version 330 corelayout(location 0) in vec3 aPos; layout(location 1) in vec2 aUV;out vec2 outUV;uniform mat4 _modelMatrix; …

微信小程序进阶——Flex弹性布局轮播图会议OA项目(首页)

目录 一、Flex弹性布局 1.1 什么是Flex弹性布局 1.1.1 详解 1.1.2 图解 1.1.3 代码演示效果 1.2 Flex弹性布局的核心概念 1.3 Flex 弹性布局的常见属性 1.4 Flex弹性布局部分属性详解 1.4.1 flex-direction属性 1.4.2 flex-wrap属性 1.4.3 flex-flow属性 1.4.4 ju…

DFS(分布式文件系统)与 DFSR(分布式文件系统复制)的区别

DFS(分布式文件系统)和 DFSR(分布式文件系统复制)是两种不同的技术,尽管它们在名称上有一些相似之处,但它们的用途和功能有所不同。 DFS(分布式文件系统) DFS 是一种用于创建和管理…

Win10系统开机启动文件夹在哪里找?

Win10系统开机启动文件夹在哪里找?Win10系统开机启动文件夹是一个非常重要的目录,它决定了电脑在开机的时候,会有哪些应用程序是自动启动。但是,很多新手用户不知道Win10电脑内开机启动文件夹的具体位置,下面小编介绍开…

eNSP笔记②

动态路由 RIP [适用于小型网络] 静态路由是加上非直连的网段,动态路由是加上直连的网段 动态路由就是要宣告它要去的网段,在图中可以看到,一台路由需要宣告两个网段,路由A分别宣告10.0.0.0与192.168.1.0,路由B宣告10.…

ArcGIS在VUE框架中的构建思想

项目快要上线了,出乎意料的有些空闲时间。想着就把其他公司开发的一期代码里面,把关于地图方面的代码给优化一下。试运行的时候,客户说控制台有很多飘红的报错,他们很在意,虽然很不情愿,但能改的就给改了吧…

JSX的本质

一、本质 React.createElement即h函数,返回vnode第一个参数,可能是组件,也可能是html tag组件名,首字母必须大写(React规定) 二、babel试一试 (babel集成了jsx的编译环境) // JSX…

Java:SpringBoot实现JDK动态代理和CGLIB动态代理

目录 1. JDK 动态代理2. CGLIB 动态代理总结参考文章 需要代理的对象 // 接口 public interface PayService {void pay(); }// 实现 public class AliPayService implements PayService {Overridepublic void pay() {System.out.println("AliPayService");} }1. JDK…

【反射】Constructor类

Constructor类中包含了构造方法定义的详细信息,可以使用Constructor类中提供的方法来获取构造方法的信息,下面我们先获取Constructor对象,再介绍如何使用Constructor类中的newInstance方法创建对象。 一、准备工作 在src/test/java目录的cn…

自定义反序列化类将LocalDate时间格式转为 LocalDateTime

从前端接收数据反序列化成类,如果时间格式不一致可能会反序列化失败 public class StorageDTO implements Serializable {private static final long serialVersionUID 1L;......//实体类中格式为JsonFormat(pattern "yyyy-MM-dd")JsonDeserialize(using CustomL…

matlab奇技淫巧——绘制三维地图

在数据处理工作中,常常会用到地图的绘制,最常用的自然是绘制平面的区域/全球地图,通过 worldmap(world) % 创建世界地图坐标区域 load coastlines % 导入海岸线数据 plotm(coastlat,coastlon)即可绘制,效果…

Vue常见的指令及使用方法

在 Vue 中&#xff0c;指令是一种特殊的属性&#xff0c;用于在 HTML 元素上绑定数据和实现交互。Vue 提供了多个常见的指令&#xff0c;让我们来逐一介绍并给出使用示例。 v-bind v-bind 指令用于绑定数据到 HTML 元素的属性&#xff0c;可以动态地更新元素的属性值。 <im…

Talk | UCSD博士生刘明华:在开放的世界中理解和生成3D物体

本期为TechBeat人工智能社区第539期线上Talk。 北京时间10月19日&#xff08;周四&#xff09;20:00&#xff0c;加州大学圣地亚哥分校博士生—刘明华的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “在开放的世界中理解和生成3D物体”&#xff0…

用护眼灯到底好不好?好用热门的护眼台灯推荐

现在市面上做护眼灯的品牌非常多&#xff0c;有的是脚踏实地&#xff0c;真正做保护消费者眼睛的产品&#xff0c;有的则是夸大宣传&#xff0c;以次充好来收割很多不明真相的群众。其实护眼灯的防蓝光是做不到完全无蓝光的&#xff0c;那些宣传完全无蓝光的商家&#xff0c;完…

会议剪影 | 思腾合力携AI服务器亮相PRCV 2023,并作主题演讲

第六届中国模式识别与计算机视觉大会&#xff08;PRCV 2023&#xff09;于2023年10月13日至15日在厦门国际会议中心酒店举办。本届会议主题为“相约鹭岛&#xff0c;启智未来”。 会议旨在汇聚国内国外模式识别和计算机视觉理论与应用研究的广大科研工作者及工业界同行&#xf…

2023年中国工业气体行业研究报告

第一章 行业概况 1.1 定义 工业气体行业是一个不可或缺的产业领域&#xff0c;它为多种行业提供关键的产品和服务。工业气体&#xff0c;包括氧气、氮气、氩气、二氧化碳、氦气、氢气及特种气体等&#xff0c;是现代工业生产和科学研究的基础。这些气体在不同的领域具有广泛的…

mysql体系结构及引擎

目录 一、mysql体系结构 二、存储引擎简介 2.1查看当前数据库支持的存储引擎 三、存储引擎的特点 3.1innodb 3.2myisam 3.3memory 四、存储引擎的选择 一、mysql体系结构 连接层 最上层是一些客户端和连接服务&#xff0c;主要完成一些类似于连接处理&#xff0c;授权认…

C- 使用原子变量实现自旋锁

自旋锁 自旋锁&#xff08;Spinlock&#xff09;是一种常用于多线程编程中的低开销锁&#xff0c;其特点是当线程尝试获取锁而锁已被其他线程占用时&#xff0c;该线程会处于一个持续的忙等待&#xff08;busy-wait&#xff09;状态&#xff0c;直到它可以获取到锁为止。这种方…