随着技术的进步,企业已经从手动测试转向Selenium测试自动化,测试解决方案已经变得比以前更具可扩展性。但是,目前仍然需要努力解决的一个问题是并行运行多个测试的可扩展性。许多公司仍然在使用顺序测试方法来保证软件的交付质量,但这会消耗大量的时间、资源和精力。
有些人不愿意在Selenium中实现并行测试,因为他们的web应用程序足够小,可以由当前的发布窗口管理。但是,每个版本都一定会扩充web应用程序,如果不采用并行测试,那么在未来的某个时间,可能就会遇到瓶颈。
毕竟,Selenium Grid存在的意义是允许测试人员并行运行测试用例。
小编将从并行测试在下一个发布周期中的重要性以及Selenium中并行测试的定义和最佳实践给大家详细介绍一下并行测试。
首先,Selenium自动化中的并行测试是什么?
Selenium中的并行测试是一个在不同环境中同时运行多个测试的过程。并行执行测试的主要目的是减少自动化浏览器测试的总时间和工作量,同时通过使用Selenium Grid确保产品的质量。
让我们看一个顺序执行的测试场景:
假设,想要测试一个注册表单的功能,那么已经为该表单编写了自动化测试脚本。如果想在60种不同的浏览器和操作系统组合上执行这个测试,并且假设单个测试在2分钟内运行,那么总共需要120分钟,即2小时。这仅仅是注册表单,如果在其他模块上运行自动化脚本,比如定价页面、演示调度表单、联系表单等等,会发现,即使你自动化了你的Selenium测试套件,如果要一个接一个地运行它们, 你的测试也要花很长时间才能完成。
如果在上面的场景中同时运行3个并行测试会发生什么?
是的!总执行时间将从120分钟减少到只有40分钟。类似地,如果运行4个并行测试,总时间将会减少到30分钟,以此类推。
为什么要并行运行Selenium测试?
对于测试人员来说,采用Selenium中的并行测试作为第一种自动化浏览器测试方法至关重要,原因有很多。
主要原因有:
1.测试覆盖率更广泛
并行执行测试比顺序测试更快,因为它在更短的时间内为测试人员提供了更广泛的兼容性测试。例如,如果想测试一个新的web应用程序的用户界面功能,那么就不必为不同的操作系统和浏览器组合一次又一次地运行测试,可以通过并行运行测试来同时测试所有的组合。
2.节约测试时间
顺序测试确实为web应用程序提供了全面而彻底的自动化浏览器测试,但它非常耗时。另一方面,通过在多台机器上并行运行测试,并行测试可以减少总体测试时间。例如,如果想运行100个并发测试,那么可以将自动浏览器测试时间减少100倍,这反过来又帮助更快地交付软件产品。
3.节约成本
顺序测试需要开发、维护和保持测试环境是最新的,这可能会影响到总体预算。但是Selenium中的并行测试是一个在云上运行的自动化过程,因此不需要维护。此外,不必担心更新,因为云基础设施总是会自动更新的。
4.优化持续集成和交付
对于持续集成和持续交付,需要频繁且快速地运行功能测试。如果同时运行测试,它不仅会为赢得更多的时间,而且还允许获得测试数据的详细报告。开发团队稍后可以使用这些报告来发现代码中的问题并快速修复它们,以优化CI/CD。
5.支持持续测试
在尽可能短的时间内发布高质量产品的一个好方法是使用持续集成和交付方法。持续测试需要更快的测试周期,这对于顺序自动化的浏览器测试是不可行的。但是,如果在Selenium中使用并行测试(允许利用云和虚拟化以更快的速度执行更多测试),那么就可以更快地向市场发布产品。
什么时候应该在Selenium中执行并行测试?
现在,已经了解了Selenium中的并行测试如何有助于应用程序的持续集成和交付,是了解何时以及如何在SDLC中实现它的时候了。
可以在以下场景中使用并行测试:
(1)如果新应用程序的功能有最小的不确定性,特别是当更新的和早期版本的应用程序是类似的;
(2)用于与银行部门相关的金融应用程序,其中大多数应用程序是相同的。可以使用Selenium中的并行测试来验证应用程序的早期和最新版本;
(3)将遗留数据从一个系统导入到另一个系统,或者将公司从旧系统迁移到新系统;
(4)在自动浏览器测试期间,当需要跨多个浏览器、操作系统和设备组合测试应用程序时。
如何处理Selenium中的并行测试用例?
一般认为,并行执行测试的最佳方法是创建不同的项目来测试web应用程序的各个部分的浏览器兼容性,并创建一个主项目来测试这些不同的项目。通常,Selenium中的并行测试有两个级别的标准:第一个是进入标准,另一个是退出标准。
1.在进入级标准中,定义了在并行执行测试成功之前应该满足的特定任务,例如:
(1)在启动Selenium中的并行测试之前,需要进行测试环境设置;
(2)在启动自动化浏览器测试过程之前,必须定义前提条件和场景;
(3)必须成功迁移新数据和遗留数据。
2.退出标准描述了成功执行并行测试的步骤,包括:
(1)在新开发的系统上运行旧系统;
(2)理解两个系统之间的差异;
(3)在使用相同的输入时抛出完整的自动化浏览器测试周期;
(4)与旧系统相比,测量新开发系统的输出;
(5)向开发团队报告错误(如果发现任何错误)。
在Selenium中执行并行测试的最佳实践是什么?
即使使用Selenium Grid,并行运行自动化浏览器测试也不是那么容易,这是由于在Selenium中使用的用于并行测试执行的非结构化自动化框架造成的。
下面是一些可以帮助成功地并行执行Selenium测试自动化的最佳实践:
1. 生成独立的测试用例
如果生成可以独立运行的测试用例,那么可以更容易地并行执行它们。简单地说,测试需要是无外部依赖的。因此,当运行任何测试时,不必担心运行测试套件的顺序。
有时,并行执行中的测试会表现出无效的行为,这就是所谓的脆弱。通过减少测试中可能的断点,独立测试可以减少自动化浏览器测试过程中的不稳定。使用独立测试的另一个重要优点是,如果一个测试失败,它不会阻止测试其他功能。
2. 使用基于云的Selenium Grid进行并行测试
在本地Selenium Grid上执行自动化浏览器测试可能会让人筋疲力尽,因为不仅要管理和维护所有的机器,还要设置它们。在本地Selenium Grid上进行并行测试会有一些可伸缩性问题,因为无法覆盖所有主流浏览器、它们的不同版本和操作系统。
3.避免硬编码值
由于硬代码是直接嵌入源代码中的,大多数测试人员必须以特定的顺序运行他们的测试。这种方法不允许测试人员高效地并行运行测试,因为它会在测试用例之间创建依赖关系。
因此,避免在的Selenium测试自动化脚本中使用硬代码值,以确保每个测试都是独立的,并且可以在任何需要的时候执行。甚至可以选择测试框架中的数据驱动方法来配置测试用例。
4. 避免Selenium测试自动化用例之间产生依赖性
由于不同测试用例之间的依赖性,许多测试人员经常发现并行执行测试很有挑战性。当测试彼此依赖时,它们需要以特定的顺序运行,这通常会影响并行测试策略。因此,可以专注于创建能够独立执行的测试。
5. 需要有效地管理测试数据
成功的并行Selenium测试自动化的关键是有效地处理测试数据。但是要实现这一点,需要一个有效的策略,它可以在需要时创建测试数据,以及在需要时清理数据。
下面是一些非常有效的基本数据管理策略:
(1)连续刷新数据——这种方法允许在测试执行期间重置源代码;
(2)使用RESTful API——这是在运行时创建和销毁数据的好方法;
(3)自动生成数据——这种方法有创造性的策略,但不提供任何数据清理。
这些只是一些可以用来有效管理测试数据的方法,甚至可以将两种方法结合起来以获得所需的输出。
创建能够有效并行运行的测试
如果你计划在Selenium中采用并行测试,那么肯定不希望在产品发布之前创建多个无法并行运行的测试,从而让自己失望。因此,从一开始就考虑并行化,开发Selenium测试自动化用例,可以帮助跨所有组合高效地测试应用程序。这听起来可能有点复杂,但是编写并行运行的测试用例更容易、更小、更快。
总结
Selenium中的并行测试是快速交付web应用程序的一种好用的方法,同时又不影响质量,尤其是在自动跨浏览器测试方面。通过并行执行Selenium测试自动化,可以节省QA开销,以高准确度运行测试用例,优化持续集成/交付过程,以及不断改进测试脚本。但是,实现并行需要从一开始就采用有效的策略。在本文中,我们讨论了不同的并行化场景,以及在业务中采用并行化的好处,希望对你有所帮助。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我正在编写一个包含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?并散列所有无济于事。