·与需求相关的各种问题,如烂需求、伪需求和不清晰的需求。
·开发的功能无法有效验证,可测试性不强。
·过于死板的测试设计策略。
这就需要测试者能够有效澄清和确认需求,有针对性地提出可测试性需求,并针对不同的项目选择合适的测试设计方法。
如果说各种测试设计方法(如车轮图、测试设计四步法、对测试点进行分类、最小线性无关路径覆盖、输入-输出表、等价类分析表、因子表)是基本动作,那接下来要讨论的内容就是做好测试设计的有效保证,是测试者把控测试设计水平的重要体现。
有效澄清和确认需求
需求问题才是研发领域长久以来的短板,对此已经有太多的教训,尽管试图用场景、用户故事(user story)、用户案例(user case)等来描述需求,但还是有太多的“一句话需求”“不清晰的需求”。很多时候,开发人员都开始设计编码了,测试人员也开始做测试设计了,双方一沟通才发现还有很多需求细节根本没有明确,然后又讨论出很多需求阶段没有考虑的地方,从而打乱原本的开发节奏,使得项目交付或产品研发变得不可控。
还有更坏的情况,是开发人员按照自己的理解实现了产品,测试人员按照自己的理解设计了测试用例,直到后期测试验证的时候,存在的差异才被发现,然后开发人员和测试人员又去澄清和争论这些问题,去鉴定测试人员发现的问题究竟是需求还是缺陷。这会造成产研效能的浪费。
由上可见,脱离需求的测试设计,即便用了完美的测试设计方法,也是没有意义的。有效澄清和确认需求,是测试设计的基础,更是整个测试过程,甚至是产品或项目成功的关键。
早在几十年前,软件测试行业就通过分析缺陷修复成本,发现“缺陷越早被发现,修复成本越低”,进而提出了“测试左移”的观点,让测试人员在需求阶段就开始参与项目,去和一线产品人员和业务分析师一起澄清需求中的问题。
但是遗憾的是,很多测试者在项目早期参与时并不知道该做什么,大多数在充当“听众”,听一线产品人员、业务分析师或者系统工程师来讲这个场景或者需求,他们只做一下记录,并没有发挥出测试的主观能动性。事实上,测试人员在需求阶段可以利用车轮图来对需求进行梳理和确认,具体操作方式如图所示。

通过车轮图梳理和确认需求的检测清单。

有针对性的可测试性需求
可测试性又称易测试性,什么是可测试性?可以很方便地确认系统中某个功能是否满足预期的能力。有针对性的可测试性设计,可以有效帮助开发、测试人员快速确认结果,提高测试设计的效率,因此如何识别出高质量的可测试性需求就变得尤为重要。
1.可测试性需求的层次
可测试性需求是有一定层次的,按照系统或者产品的使用对象,将可测试性需求分为如下3层:
·用户层面的可测试性。
·测试层面的可测试性。
·维护支持层面的可测试性。


重点讨论测试层面的可测试性需求。
2.从业务流程交互的角度来分析可测试性需求
从业务流程交互的角度来分析可测试性需求,方法是首先绘制出业务流程或者状态变化图,然后分析如何才能在测试时(包括开发人员自测和测试验证)方便地跟踪到业务的整个交互过程,确认交互的正确性。
对FTP服务器的文件传输功能进行可测试性分析,FTP服务器的文件传输过程如图所示(以PASV方式为例)。

首先需要对FTP协议的交互流程进行测试,这就需要在服务器上跟踪业务交互的整个流程,确认每个状态是否正确,如下表。

3.从异常状态的角度来分析可测试性需求
从业务流程交互的角度来获得可测试性需求,通常关注的是正常流程。接下来还需要分析有哪些异常场景,看看这些异常场景是否可以被很方便地追踪到,从这个角度再来提取可测试性需求。
举例 针对FTP服务器的文件传输功能,从异常状态的角度来分析可测试性需求
先来分析FTP服务器的文件传输功能中可能有哪些异常场景。假设通过分析得到如下异常场景(实际项目中,可以通过需求或者设计文档来确定异常场景,也可以根据测试人员的经验来识别重要的异常测试场景)。
·异常场景1:服务器异常退出。
·异常场景2:服务器等待客户端的响应超时。
·异常场景3:同时有大量的半连接。
接着再来分析,当这些异常场景出现后,在测试时是否可以很容易被确认。这样又可以得到几点可测试性需求。

4.从测试用例的预期结果来分析可测试性需求
在进行测试用例设计的时候,可能会发现一些测试用例的结果不易于观察,这些不易于观察的地方,也可以作为可测试性需求提出,如跟踪机制、内存管理、队列管理等。总结了一些较为通用的可测试性需求。

5.可测试性分析展开的时机和要点
从软件工程的角度来说,有两个阶段比较适合进行可测试性需求分析。

可测试性需求虽然可以给开发人员和测试人员带来方便,但可测试性需求也会增加产品的经济和时间成本,所以识别出来的所有可测试性需求都需要由需求工程师进行汇总,并统一按照优先级排序。
除此之外,可测试性需求最后大多会以日志、调试或者告警等方式来实现,故对可靠性进行整体设计尤为重要,这可避免可测试性信息出现重复、描述不清等问题,还需要注意它在存储、备份、容量、对系统性能和稳定性的影响等方面的问题。所以对测试人员来说,还需要测试在开启可测试性功能后系统的稳定性及对性能的影响等,以免用户在使用可测试性功能时引发异常。
摘取自刘琛梅老师的《测试架构师修炼之道:从测试工程师到测试架构师 第2版》
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/