通过自动化测试程序,你的公司不仅可以节省金钱和时间,还可以提供优质的产品。Selenium已经成为几乎任何一种包括基于浏览器的应用程序的测试要求的首选测试框架。然而,随着自动化测试世界的不断发展,最新的工具已经出现了。其中最主要的是Cypress.io,一个自动化测试框架,正在成为Selenium的一个越来越流行的替代品。Cypress或Selenium是你自动化测试要求的完美选择吗?继续阅读这篇博客,了解一些提示,为什么你可能愿意选择一个或另一个--甚至在类似的时间内使用两者。
以下是在进行Selenium与Cypress比较时可能出现的几个常见问题:
- Cypress是比Selenium更好的选择吗?
- Cypress和Selenium在架构上的关键区别是什么?
- Cypress是否也支持跨浏览器测试?
- 与Cypress相比,Selenium的表现如何?
- 与Selenium类似,Cypress是否也支持一系列的编程语言?
回答这些问题的最简单方法是评估每个工具的优点和缺点:
- Cypress- (当前版本为4.11.0)是一个为网络构建的下一代前端测试工具。Cypress是一个基于JavaScript的综合测试框架,建立在Chai和Mocha之上。
- Selenium (当前版本为4.0.0 Alpha 5)是一个免费或开源的工具,用于自动化网络浏览器的测试。WebDriver组件在远程机器或本地驱动浏览器,它被用于用户界面自动化测试。同样地,所有不同的组件在使产品更加健壮和可靠方面都有确切的作用。
什么是Selenium?
这个令人难以置信的工具是一个开源的、免费的自动化测试工具,旨在测试基于网络的应用程序。从2004年开始,这个工具已经成为测试自动化的事实标准,因为它易于使用,支持跨浏览器,并有丰富的内容。
Selenium包括四个关键部分。
1. Selenium Web驱动程序--为发送到Web浏览器的命令和动作编码。
2. Selenium集成开发环境[IDE]--在网络浏览器上记录和播放客户命令和活动。
3. Selenium RC(远程控制)- Selenium RC是一个服务器,协助Selenium网络浏览器和命令之间的互动。
4. Selenium Grid--这个组件有助于分布式和并行测试,例如,通过使用Selenium grid,我们可以在不同的虚拟机或物理机上一次进行自动化脚本。
什么是Cypress?
这个惊人的测试自动化工具是一个完全基于JavaScript的前端测试工具,为现代web而建。它有助于解决质量保证工程师或软件开发人员在测试一个应用程序时面临的痛点。Cypress是一个高度以开发者为中心的工具,它使用一种特殊的DOM操作方法,并在浏览器中直接操作。它还提供了一个独特的交互式测试运行器,它在其中实现了所有的命令。
使用Cypress,质量保证工程师或开发人员可以创建。
1. 集成测试
2. 单元测试
3. 端到端测试
Selenium与Cypress核心区别是什么?
Cypress和Selenium一样,都是web应用程序测试的测试自动化框架。Selenium是一个有声望的解决方案,而Cypress正在接近采用。该工具还支持JavaScript,而Selenium支持各种语言。Cypress支持综合测试。Selenium也是如此,同时还提供各种测试,如移动应用测试、单元测试和性能测试:
- 支持的语言--它支持一系列编程语言,如Ruby, Python, C#, PHP, Java, JavaScript等。
- 支持的测试自动化框架- Selenium支持各种自动化测试框架,包括流行的BDD框架-JUnit、Behave、MSTest、SpecFlow、PyTest、Mocha JS、TestNG、Jest、PyUnit、Protractor、WebDriverIO,等等。
- 支持的浏览器--要开始使用Selenium自动化测试,软件开发人员需要在他们的机器上下载相应的浏览器驱动程序(例如,Firefox的geckodriver,Chrome的ChromeDriver等)和合适的Selenium语言驱动程序。
- 设置的复杂性- 设置是有点挑战性的,因为它需要下载特定的浏览器驱动和设置测试环境。
- 文档和社区支持--完善的文档和来自全球用户的坚定的社区支持。
- 集成- 有限的集成,但有许多插件。
- 目标受众- Selenium只被测试团队使用。
- 安装难度- 中等,因为Selenium网络驱动和浏览器驱动需要单独安装。
- 测试实施速度--它对XPath的使用使测试结果有时不可靠。原因是XPath的搜索模式在两次不同的执行之间经常发生变化,它通过HTML DOM结构导航来定位特定的元素。根据所使用的元素标识符,它在每次新的执行中都会产生不同的搜索路径。这导致Selenium测试案例的执行速度很慢,因为经常有人为错误和测试脚本不一致的机会。
- 测试自动化套件的并行执行--Selenium有各种选择来执行并行执行,这对测试自动化相当重要。Selenium element Grid在质量保证社区与TestNG一起被广泛用于并行执行。它可以很容易地与Docker容器化结合。
Selenium的主要优势
1. 与多种操作系统兼容,如Linux、Windows、 Mac、Unix等。
2. 为质量保证工程师提供灵活性,可以选择他们喜欢的编程语言,如Java, Python, Ruby等。
3. 与现代浏览器兼容,如Chrome, Safari, Mozilla Firefox等。
4. 提供简明的应用编程接口
Selenium的缺点
1. 处理元素加载或页面加载是困难的
2. 没有自动生成测试结果的内置命令
3. 对测试图像的支持受到限制
4. 生成测试案例很耗时
5. 与Cypress相比,建立一个测试环境很困难。
Cypress是测试自动化领域和网络应用程序测试领域的一个相对较新的参与者。与Selenium框架类似,Cypress是免费或开源的工具,该项目托管在GitHub上。最近,这个惊人的工具已经获得了令人印象深刻的吸引力,这一点从项目的星级和fork的数量就可以看出。
- 支持的语言--与支持多语言的Selenium WebDriver相反,这个测试自动化工具也支持JavaScript。它被前端软件开发人员和对JavaScript有经验的测试自动化专家所青睐。
- 支持的测试自动化框架--在对自动化测试框架的支持方面,它只支持Mocha JS框架。因此,为网络自动化测试编写的测试是在Mocha JavaScript框架的基础上用JavaScript编写的。
- 支持的浏览器- 要开始使用Selenium自动化测试,软件开发者必须下载相应的网络浏览器驱动程序--Microsoft Edge、Electron、Google Chrome和Mozilla Firefox。
- 设置复杂性--设置很简单。不需要额外的依赖性或下载。
- 文档以及社区支持--坚实的文档和来自世界各地客户的完善的社区支持。
- 集成- 大量的集成(持续集成、持续交付、可视化测试、报告、云供应商)。
- 目标受众- 它可以被QA测试人员和软件开发人员使用。
- 设置简单- 低,因为对驱动程序没有额外的依赖性,只需将所需文件捆绑在一起。
- 测试实施速度- Cypress的并行测试特性将实施速度降低了5倍。这个工具是为了确保测试和开发可以同时进行。它将应用程序或浏览器stubs,使其按照你的测试用例行事,为你的用户界面测试提供实时用户界面变化。你可以通过你的测试代码修改你的应用程序状态,以加快你的SDLC(软件开发生命周期)。
- 测试自动化套装的并行执行--在并行测试中,这个工具与Selenium相比,显得落后。
Cypress的主要优势
1. Cypress测试框架在测试执行期间捕获快照。它使质量保证人员或软件开发人员能够在命令日志中悬停一个精确的命令,以注意到在该特定阶段发生的确切情况。
2. 与Selenium不同,它不需要在测试脚本中添加隐式或显式等待命令。它自动等待断言和命令。
3. QA或开发者可以使用stubs、时钟和spy来验证和控制服务器响应、计时器或函数的行为。
4. 自动滚动操作可以确保在执行任何活动(例如点击按钮)之前,组件处于视图中。
5. 以前Cypress只支持谷歌浏览器的测试,但随着当前的更新,Cypress现在提供对Mozilla Firefox以及微软Edge浏览器的支持。
6. 当开发人员或程序员编写命令时,该工具会实时执行这些命令,并在它们运行时给出视觉反馈。它还带有着色的文档。
7. 本地Se Grid的测试支持 执行可以用最少的努力移植到基于云的Selenium Grid的功能。
Cypress的缺点
1. 人们不能利用Cypress在同一时间驱动两个web浏览器。
2. Cypress不支持不同的标签。
3. 它只支持JavaScript来生成测试案例。
4. 它目前不提供对Safari和Internet Explorer等web浏览器的支持。
5. 对iFrames的支持受到限制。
Cypress vs Selenium: 何时使用哪种方法进行自动化测试
尽管Cypress和Selenium都是为测试目的而设计的完美的自动化网络浏览器,但它们在性能和架构方面有很大的不同。其中一个核心区别是,Cypress作为一个工具,非常适合向软件开发人员介绍自动化测试,而不仅仅是Selenium的替代品。这就是为什么Cypress是全球范围内快速增长的自动化测试工具之一的原因。另一方面,Selenium是一个高度通用的工具,针对更广泛的受众。
许可证
- Selenium,一个被广泛接受的测试自动化工具,在Apache 2.0许可证下被授权,作为软件自由保护协会的版权持有人。
- Cypress,这个最受欢迎的工具也是在MIT许可下免费发布的。然而,如果我们把它与Selenium进行对比,那么Cypress提供的所有特性都不是免费的,例如,Cypress仪表板对Seed是免费的,但对Tree、Forest和Sprout是付费的。
当Selenium比Cypress更受青睐时:
- 当人们在选择测试脚本语言方面需要灵活性时。Cypress也支持JavaScript,而Selenium支持多种语言,如Python、Java、C#、JavaScript等。
- 当你想在不同的浏览器上同时执行一个测试案例时,那么Selenium Grid的效果最好,因为Cypress不能用来同时驱动两个浏览器。
- 使用Selenium,大规模的跨浏览器测试变得简单。它不支持Safari等浏览器,与Selenium相比,这限制了跨浏览器测试的支持。
- 它支持JUnit和NUnit,而后者不支持。
当Cypress比Selenium更受青睐时:
- 元素、端到端、应用编程接口、可访问性、视觉、性能测试的单一框架。
- 测试实施的视频记录能力。
- 开箱即用的组件重试能力,这限制了Cypress的不稳定测试。
- 单一编程语言在前端开发和自动化方面的应用。
- 在开发的早期阶段,具有存根/模拟请求和响应的能力。
- 控制使用Selenium从零开始建立测试框架的时间,因为这个工具提供了一个稳定的、可随时应用的框架,所有的东西都可以使用和包装功能。
- 测试运行器,它提供了时间旅行的能力,通过单独的步骤,与调试失败的前后屏幕截图联系起来。
- 当任何测试失败时,有明显的异常。
谁是Selenium和Cypress的目标受众?
目标受众是基于自动化测试的目标,如果目标是自动化单元、端到端和集成测试,那么Cypress是更好的选择,软件开发者和QA都是Cypress的主要目标受众。
反过来说,如果目标只是在浏览器上测试应用程序的功能和用户界面,那么Selenium是一个很好的选择。使用Cypress的唯一限制是它完全基于JavaScript,这对QA人员来说可能很复杂,因为除了脚本语言,一般测试人员都知道编程语言。
Cypress会取代Selenium吗?
- 很难说Cypress是否会取代Selenium,因为Selenium是最古老的工具,在测试人员中很有名,并不断改进其特性。
- Cypress在那些希望将集成测试或单元测试任务自动化的软件开发人员中很有名。
- Cypress是一个用于API测试的优秀工具,这在Selenium中是不可能的。
- 当涉及到跨浏览器测试时,Selenium是一个完美的选择,因为它几乎支持所有的浏览器,而Cypress只支持Chrome。
如果我们谈论自动化测试的速度和准确性,那么Cypress是第一位的,因为它存在于Web浏览器内部,同步问题在Cypress中是罕见的,不像Selenium那样,脚本在Web浏览器之外运行。
结论:Cypress测试与Selenium测试
Selenium和Cypress都是功能丰富且可靠的自动化测试框架。它们也都碰巧是免费或开源的。
但是,你为什么要选择其中一个呢?
使用Selenium的主要原因
在优先考虑以下因素时,Selenium是一个完美的选择。
- 测试用JavaScript以外的其他语言编写的应用程序。
- 在广泛的网络浏览器中测试应用程序(包括Safari等网络浏览器,而Selenium支持但Cypress目前不支持)。
- 测试Cypress不支持的移动应用程序。
使用Cypress的主要原因
Cypress是以下使用情况的完美选择。
- 迅速编写测试的能力。
- 避免单独配置每种类型的网络浏览器的要求。
- 将屏幕截图作为测试程序的一个要素,以观察用户在应用程序处理一个精确命令时将注意到的情况。赛普拉斯可以通过网络浏览器的API毫无困难地做到这一点。在Selenium中也可以进行屏幕截图,然而,需要额外的努力来设置。
总而言之,当涉及到Selenium与Cypress的争论时,我们建议QA团队开始探索Cypress,观察它是否可以补充他们目前的Selenium脚本,以及增加他们完整的测试稳定性和覆盖率。如果你有一个稳定的Selenium套件,并且涵盖了足够的功能,就没有必要更换工具。如果你正在开始一个新的项目,也许用Cypress进行简单的POC可以证明对QA和开发者来说是一个更好的未来。
在选择自动化工具之前,应该权衡每个选项的缺点和优点。这将有助于评估哪种工具的功能在长期内更好地服务于团队和公司。无论你为你的网络应用程序选择哪种自动化测试框架,在实际的浏览器和设备上测试网络应用程序以获得更准确的结果是至关重要的。
如有想了解更多软件设计与架构, 系统IT,企业信息化, 团队管理 资讯,请关注我的微信订阅号:
作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel