假如你已经决定要在项目中引入自动化测试,在正式开展之前需要分析清楚,你的项目、你的团队真的适合做自动化测试吗?虽然恰当引入自动化测试能给产品质量带来非常大的助力,但并不是所有类型的产品或团队都一定适合开展自动化测试。

对于公司项目而言,如果产品三天一小改、半月一大改,可能自动化测试脚本刚起步,产品就已经改动了。对于这类项目来说,引入自动化测试显然是不合适的。既然并不是所有项目或者团队都一定适合做自动化测试,那么决定要不要做自动化测试的因素有哪些呢?其中时间是一个比重较大的因素。
假如一个项目从立项到结束只有一个月的时间,而这一个月的时间中相当长的时间都要用来看需求文档、改需求文档、编写测试用例等,真正留给测试的时间并不多。这个时候如果强行做自动化测试,可能用例设计还没有完成,项目就结束了。这种情况,手工测试绝对是第一选择。
但是,一旦项目稳定下来,就要考虑接入自动化测试。因为这个时候项目比较稳定,做自动化测试就可以参照手工用例去做了。除了时间,还需要考虑成本和效率。自动化测试之所以能在很多大公司实施运作起来,根本在于项目的适宜性和有较高的投资回报率。
虽然行业中没有严格的标准,但在具体实施自动化测试之前,首先要做的是结合当前团队的现状和研发质量存在的痛点,对软件开发过程进行分析,观察其是否适合引入自动化测试,可以从以下几个方面进行权衡。
1) 项目变动少
测试脚本的稳定性决定了自动化测试的维护成本。如果项目需求变动过于频繁,测试人员需要根据变动的需求来更新测试用例及相关的测试脚本,而脚本的维护本身就是一个代码开发的过程,需要修改、调试,必要的时候还要修改自动化测试的框架,如果所花费的成本不低于利用其节省的测试成本,那么自动化测试便是失败的。
如果项目中的某些模块相对稳定,而某些模块需求变动性很大,我们便可对相对稳定的模块进行自动化测试,而变动较大的模块仍用手工测试。
2) 项目周期足够长
自动化测试从需求范围的确定,到自动化测试框架的设计,以及测试脚本的编写与调试,均需要相当长的时间来完成。这样的过程本身就是一个测试软件的开发过程,如果项目的周期比较短,没有足够的时间支持这样一个过程,那么自动化测试便是笑谈。
3) 项目资源足够
当自动化要求越来越多的时候,自动化不是一个人完成的,需要一帮人长期维护才能更好地发挥自动化测试的价值。所以还需要考虑当前团队的人力、物力(基础设施)是否能足够支撑。
4) 产品型项目
对于产品型的项目,每个项目只改进少量的功能,但每个项目必须反反复复测试那些没有改动过的功能,这部分测试完全可以让自动化测试来承担,同时可以把新加入功能的测试也慢慢地加入自动化测试中。
5) 能够自动编译、自动发布的系统
要完全实现自动化测试,必须具有能够自动化编译、自动化发布系统进行测试的功能。 当然不能达到这个要求也可以在手工干预的情况下进行自动化测试。
6) 回归测试
当存在大量的回归用例需要验证,并且占用了大量的人力时间时,可以考虑将此部分回归测试转换成相应自动化测试。回归测试是自动化测试的强项,它能够很好地验证你是否引入了新的缺陷,老的缺陷是否修改过来了。
7) 多次重复、机械性动作
将烦琐的任务转化为自动化测试。自动化测试最适用于多次重复、机械性动作,这样的测试对它来说从不会失败。
8) 需要频繁运行测试
如果在一个项目中需要频繁地进行测试,测试周期按天算,就能最大限度地利用测试脚本。
这里给大家准备了我从大学到大厂工作的软件测试资料,无偿分享给大家,需要的可以点击自取

类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我正在编写一个包含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?并散列所有无济于事。
我有一些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