欢迎订阅我的新专栏《现代命令行工具指南》,精讲目前最流行的开源命令行工具,大大提升你的工作效率。
作者:闫嘉欣 编辑:毕小烦
敏捷项目的特点是需求变化快、项目周期短。传统的极致详尽的测试计划已经不符合敏捷的项目了,因此需要简化,需求精准,需要自动,需要更加注重团队沟通,需要拥抱变化。
本文介绍了我们对测试计划的一点思考和实践。
测试计划是指导测试过程的纲领性文件。是为了达成一定时期内的目标,进行的任务规划和行动步骤设计。
说人话就是,你打算做什么?怎么做?谁来做?用多少时间 ?有什么风险?怎么规避?等等,这就是测试计划。
为什么要做测试计划?
当然是不打无准备之仗。
如果你了解 PDCA,这个 P 对于我们测试来讲就是测试计划。
当我们接手一个项目的测试时,要知道项目要做什么?目标是什么?要理清楚需求的优先级、开发是谁、何时提测、依赖什么、影响什么、有无风险,要盘一盘工作量、资源、分工、节奏、标准、策略等。
这些都是做测试计划。
可能你也遇到过这样的问题:
这些问题的主要原因就是没有做好计划。有了计划,才能有节奏,才能不乱,即使出现计划外的事情,也能按计划进行合理的调整,逐步找回节奏。
所以一定得做计划。
测试计划不可能面面俱到,项目也不可能一成不变,需求变更、提测延期、依赖延期、有人请假等等情况都会不可避免的发生,因此,计划要先有一个基线,然后根据这个基线,按突发情况导致的时间/风险进行合理调整。

计划的调整可以遵循以下的 4 个原则:

测试计划主要关注:需求、资源和质量。即在有限的时间内,用有限的资源,完成所提的产品需求,达到一定的质量目标。
要完成哪些产品需求,要达到什么样的质量目标,怎么去分配这有限的时间和资源,就成了计划的关键。

由此可以拆解出更多需要关注的信息:

提到风险评估,大家会觉得这个词并不陌生,但如果真正要对一个项目做风险评估,很多人会觉得无从下手,因为我们要考虑的是还未发生的事情。
如果不知道从何下手,不妨先试试把各式各样的风险分个类。然后按照时间线,来想一想在项目的不同阶段,我们可能会遇到哪些问题。
如下表所示:
| 风险类型 | 举例 |
|---|---|
| 需求类风险 | 需求描述不够清晰、导致功能越做越多需求变更对原有用户影响较大有没有识别到性能等非功能性需求… |
| 设计类风险 | 实现方式是否能使用正确的方法测试改动的影响范围大不大… |
| 流程类风险 | 提测时间与测试规划是否冲突外部团队的支持是否及时… |
| 资源类风险 | 项目组人员请假测试硬件资源不足… |
| 历史类风险 | 曾经踩过了哪些坑,目前是否有类似场景 |
| … |
风险评估模板
| 风险来源 | 风险等级 | 影响范围 | 应对策略 |
|---|---|---|---|
测试计划评审,是一个公开的,接受每个角色检验的,能够从不视角查漏补缺的机会,一定要抓住这样的机会。
可现在的项目,往往会议比较多,产品需求要评审、视觉/交互/技术设计要评审、测试计划要评审、测试用例要评审…
那测试计划应该怎么评审?
我们比较认同的评审方式可以分为两种:
我们谈敏捷时,一定少不了工具和平台的支持,特别是测试计划,更合适平台化。
下面是测试平台上关于测试计划编写的部分截图:






还是那句话,不打无准备之仗,测试计划就是我们打胜仗的关键,做好测试计划就是减少例外的事情发生,即使发生了也不至于手忙脚乱,再加上平台工具的支持,相信一份「好的」测试计划带来的收益会越来越明显。
(完)
如果文章对你有帮助,记得留言、点赞、加关注哦!
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我正在编写一个包含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
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
我已经构建了一些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
所以我开始关注ruby,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出