所有的产品或者服务上线都需要测试

找bug,发现缺陷

以最小的人力、物力和时间找出软件中潜在的错误和缺陷

28原则:
20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)
80%的错误存在于20%的代码中

功能测试
性能测试
安全性测试
兼容性测试
易用性测试
外观界面测试
可靠性测试
衡量一个优秀软件的维度

功能数量
功能的正确实现
错误处理情况
服务器每秒能处理的请求数
服务器的硬件配置是否满足

简洁、友好、流畅、美观
无响应、卡顿、死机
传输加密
存储加密
网站数据迁移



把瀑布模型的顺序特征与快速原型法的迭代特征相结合,将软件看作一系列相互联系的增量,在开发过程中的各次迭代中,每次完成其中一个增量

快速原型是快速建立起来的可以在计算机上运行的程序

迭代模型是不可以并行的,但增量模型可以并行
螺旋开发模型

迭代开发模型
敏捷开发模型
V模型和瀑布模型有一些共同的特性,v模型中的过程从左到右,描述了基本的开发过程和测试行为。
优点:每一个阶段都清晰明了,便于控制开发的每一个过程,既包含单元测试又包含系统测试。
缺点:测试进入的较晚,对于前期的一些缺陷,无从发现和修改,测试和开发串行,总用时较长。
V模型的局限性在于没有明确的说明早期的测试,无法体现尽早地和不断地进行软件测试的原则。在V模型中增加软件各开发阶段应同步进行的测试,演化为W模型模型。在模型中不难看出,开发是V,测试是与此并行的V,W模型是V模型的发展,强调的是测试伴随着整个软件开发周期,而且测试的对象不仅仅是程序、需求、功能和设计,同样要测试,测试与开发是同步进行的,从有利于尽早地发现问题。

优点:测试伴随软件的整个生命周期,例如在需求分析结束之后就可以进行需求分析测试,测试与开发是并行独立进行。
缺点:对需求和测试技术要求高,适用于大中型企业。
目标相同:都是为了制造出高质量的软件
相辅相成:开发经验对测试有用,测试经验对开发有用
侧重点不同:开发偏重于从无到有,测试偏重于从有到优

测试用例又叫做test case,是为某个特殊目标而编制一组测试输入、执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求。
测试用例编号
编号由字符和数字组合成字符串,用例编号具有唯一性、容易识别。
测试项目/模块
测试的项目属于哪个项目或者被测试的需求、被测的模块、被测单元等等。
️预置条件
执行当前测试用例需要的前提条件,如果前提条件不满足,则后面的测试步骤不能进行,或者得不到预期结果。
️测试输入
测试用例执行过程中需要加工的外部信息,据测试用例的具体条件有手工输入、数据库等
️预期输出
测试用例的预期输出结果,包括返回值内容、界面响应结果等。
️操作步骤
执行当前测试用例需要经过的操作步骤,需要明确地给出一个步骤的描述,测试用例执行人员可以根据该步骤完成测试用例执行。
️测试用例标题
对测试用例的简单描述,用概括的语言描述该测试用例的测试点。每个测试用例的标题不能够重复,因为每个测试用例的测试点是不一样的。
️级别
其他要素
测试人员要尽量避免测试用例存在含糊的因素,在测试过程中,测试用例的测试结果是唯一的。
尽量将具有相似功能的测试用例抽象合并,功能相似的用例要合并。
测试用例简洁,可读性良好,测试过程目的明确,测试结果唯一。测试用例要用陈述性语句,一句话直指问题的核心,不要使用浮夸的修饰手法。
测试用例要素是为了便于我们快速的设计测试用例,因此要掌握最常用的八大要素,但是每家公司的具体要求不一样,要根据公司要求灵活添加测试的元素。
等价类测试方法是把所有可能的输入数据,即程序的输入域划分成若干部分,然后从每一部分中选取少数有代表性的数据作为测试用例。使用等价类划分方法收集测试用例要经历划分等价类(列出等价类表)和选取测试用例两步,它将不能穷举的测试过程进行合理分类,从而保证设计出来的测试用例具有完整性和代表性。
在测试中,最完美的测试是使用穷举测试,把所有的数据都测一遍,但是实际工作中不能采用,因为效率太低了。理想的测试是使用最少的测试数据达到最好的测试质量。
等价类
等价类是指某个输入域的子集合,在该子集合中各个输入数据对于揭露程序中的错误都是等效的,具有等价特性。
有效等价类
有效等价类是指对于程序的规格说明来说,是合理的有意义的输入数据构成的集合,利用有效等价类可检验程序是否实现了规格说明中所规定的功能和性能。
无效等价类
无效等价类指对程序的规格说明是不合理的、无意义的输入数据所构成的集合,对于具体的问题,无效等价类至少拥有一个也可能有多个。利用无效等价类可校检程序对于无效数据的处理能力,检验程序的健壮性、容错能力。
注意
设计测试用例时,要同时考虑这两种等价类,因为软件不仅要能接收合理的数据,也要能经受意外的考验,这样的测试,才能够确保软件具有更高的可靠性。
6~10位的整数,包括6位和10位
位数:6~10位,闭区间
类型:整数,不能以0开头
有效等价类:不以0开头的6位数字
无效等价类:以0开头的6位数字、不以0开头的11位数字、不以0开头的5位数字、不以0开头的6位字母、小数、特殊字符、汉字

边界值分析法就是对输入和输出的边界值进行测试,也是一种黑盒测试。边界值分析法通常作为等价类划分法的补充,其测试用例来自等价类的边界;长期的经验得知大量的错误是发现在输入或输出范围的边界上,而不是发生在输入输出范围的内部,因此针对各种边界情况设计测试用例可以查出更多错误。
明确需求
确定有效等价类和无效等价类
明确输入条件中的边界值
编写测试用例
因果图法是一种利用图解法分析输入的各种组合情况,从而设计测试用例的方法,它适合于检查程序输入条件的各种组合情况。
等价类划分法和边界值分析法都是着重考虑输入条件,但没有考虑输入条件的各种组合,输入条件之间的相互制约关系。这样虽然各种输入条件可能出错的情况已经测试到了,但是多个输入条件组合起来可能出错的情况却忽视了。如果在测试时必须考虑输入条件的各种组合,则有可能的组合数目将是天文数字,因此必须考虑采用一种适合于描述多种条件的组合,相应产生多个动作的形式来进行测试用例的设计,这就需要利用因果图(逻辑模型)。
通常在因果图中用ci表示原图,用ei表示结果,各结点表示状态,可取值0或1,0表示某状态不出现,1表示某状态出现。



①找出所有的原因,原因即输入条件或输入条件的等价类
②找出所有的结果,结果即输出条件
③明确所有输入条件之间的制约关系以及组合关系。哪些条件不能组合到一起,哪些条件可以组合到一起
④明确所有输出条件之间的制约关系以及组合关系。哪些输出结果不能同时输出,哪些输出结果可以同时输出
⑤找出什么样的输入条件组合会产生哪种输出结果
⑥把因果图转换成判定表/决策表
⑦为判定表/决策表中的每一列表示的情况设计测试用例
系统只接收50或100元纸币,一次只能使用一张纸币,一次充值金额只能为50元或100元;
若输入50元纸币,并选择充值50元,完成充值后退卡,提示充值成功;
若输入50元纸币,并选择充值100元,提示输入金额不足,并退回50元;
若输入100元纸币,并选择充值50元,完成充值后退卡,提示充值成功,找零50元;
若输入100元纸币,并选择充值100元,完成充值后退卡,提示充值成功;
若输入纸币后在规定时间内不选择充值按钮,退回输入的纸币,并提示错误;
若选择充值按钮后不输入纸币,提示错误
输入50元纸币
输入100元纸币
选择充值50元
选择充值100元
完成充值后退卡
提示充值成功
提示错误
退回50元、退回100元(找零)
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ||
|---|---|---|---|---|---|---|---|---|---|
| 1、输入50元 | 1 | 1 | 1 | ||||||
| 输入 | 2、输入100元 | 1 | 1 | 1 | |||||
| 3、选择充值50元 | 1 | 1 | 1 | ||||||
| 4、选择充值100元 | 1 | 1 | 1 | ||||||
| 1、完成充值、退卡 | 1 | 1 | 1 | ||||||
| 输出 | 2、提示充值成功 | 1 | 1 | 1 | |||||
| 3、找零 | 1 | 1 | 1 | 1 | |||||
| 4、提示错误 | 1 | 1 | 1 | 1 | 1 |
判定表也称决策表,是分析和表达多逻辑条件下执行不同操作的工具,它能够将复杂的问题按照各种可能的情况全部列举出来,简明并避免遗漏。利用判定表能够设计出完整的测试用例集合,在一些数据处理问题当中,某些操作的实施依赖于多个逻辑条件的组合,即针对不同逻辑条件的组合值,分别执行不同的操作。判定表适合于处理这类问题。
适合于有多个输入和多个输出,输入和输出之间有相互的组合关系,输入输出之间有相互的制约和依赖关系
判定表示有条件桩、动作桩、条件项、动作项四个部分组成。
条件桩:列出了问题的所有条件,通常认为列出条件的次序无关紧要。
动作桩:列出了问题规定可能采取的操作,这些操作的排列顺序没有约束。
条件项:列出针对它左列条件的取值,在所有可能的情况下的真假值。
动作项:列出在条件项的各种取值情况下应该采取的动作。
任何一个条件组合的特定取值及其相应要执行的操作称为规则。在判定表中贯穿条件项和动作项的列就是一条规则。显然判定表中列出多少组条件取值,也就有多少条规则,即条件项和动作项有多少列。
规则合并有两条或多条规则具有相同动作,并且其条件项之间存在着极为相似的关系。
①明确规则个数
②列出所有条件桩和动作桩
③填入条件项
④填入动作项到初始判定表
⑤简化,合并相似规则
优点:能把复杂问题,按照各种可能情况一一列举出来,简明而易于理解,避免遗漏。
缺点:不能表达重复执行的动作,例如循环结构。
正交法也叫正交实验法或者正交排列法,就是使用最小的测试过程集合获得最大的测试覆盖率,正交实验是研究多因素、多水平的一种实验方法。它利用正交表来对实验进行设计,通过少数实验代替全面的实验。在一项实验中,把影响试验结果的量称为试验因素,简称因素,因素可以理解为试验过程中的自变量,试验结果可以看成因素的函数。在试验过程中,每一个因素可以处于不同的状态或状况,把因素所处的状态或状况称为因素的水平,简称水平。
①根据需求把控件及其取值列举出来
②根据控件和控件的取值个数,选择一个合适的正交表
③根据控件的个数,选择正交表的次幂,也就是正交表中包含的最大值,例如,4个控件,选择4次幂
④根据控件的取值个数,选择正交表的底,也就是正交表包含的最大值,例如,每个控件有3个取值,底是3
⑤把控件及其取值映射到正交表中
⑥把控件名字分别映射到正交表的列名位置
⑦把正交表中每一列的数字分别用对应的控件取值替代
⑧根据正交表,编写测试用例

正交表如下:

1、利用Excel准备一个表格
2、将表格内容粘贴到txt文本中,并保存
3、通过allpairs命令生成
4、拷贝结果到测试用例中
挑选出少量用例
需要使用命令行打开

需求中条件的组合量比较大的时候 需要两个两个相互组合的时候
从起点起,通过一系列操作步骤(事件),达成某一结果,到终点的过程测试。场景法主要用于冒烟测试。在通过了场景测试后,再通过其他方法进行更为细腻的测试。
现在的软件几乎都是由事件触发来控制流程的,事件触发时的情景便形成了场景,而同一事件不同的触发顺序和处理结果形成事件流。
下图中经过用例的每条不同路径都反映了基本流和备选流,都用箭头来表示。基本流用直黑线来表示,是经过用例的最简单的路径。每个备选流自基本流开始,之后,备选流会在某个特定条件下执行。备选流可能会重新加入基本流中(备选流1和3),还可能起源于另一个备选流(备选流2),或者终止用例而不再重新加入某个流(备选流2和4)。

遵循上图中每个经过用例的可能路径,可以确定不同的用例场景。从基本流开始,再将基本流和备选流结合起来,可以确定以下用例场景:
场景1 基本流
场景2 基本流 备选流1
场景3 基本流 备选流1 备选流2
场景4 基本流 备选流3
场景5 基本流 备选流3 备选流1
场景6 基本流 备选流3 备选流1 备选流2
场景7 基本流 备选流4
场景8 基本流 备选流3 备选流4
注:为了方便起见,场景5、6和8只描述了备选流3指示的循环执行一次的情况。

流程分析法主要是针对测试场景类型属于流程测试场景的测试项下的测试子项进行设计,是从白盒测试设计方法中的路径覆盖分析法借鉴过来的一种方法。在白盒测试中,路径就是指函数代码的某个分支组合,路径覆盖法需要构造足够多的测试用例覆盖函数的所有代码路径。
路径覆盖法:把所有测试条件写成测试用例,白盒是根据代码分支分析写测试用例。
在黑盒测试中,若将软件系统的某个流程看成路径的话,则可以针对该路径使用路径分析的方法设计测试用例。黑盒测试是看文档来写测试用例,不需要看代码。
①详细了解需求;
②根据需求说明或界面原型,找出业务流程的各个页面以及各页面之间的流转关系;
③画出业务流程图;
④写用例,覆盖所有的路径分支。
①ATM机功能
②绘制出可达矩阵
③使用深度或者广度法进行遍历
④写测试用例
一般用于测试非常重要的系统(ATM、医疗设备)
错误推断法是基于经验和直觉推测程序中所有可能存在的各种错误,从而有针对性的设计测试用例的方法。
根据经验,列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据它们选择测试用例。
适用于项目时间比较短,任务比较繁重的情况下,而且测试经验较多。
仅仅是测试的纲要,可能只包含测试的内容。简单的测试用例其实并没有进行设计,而仅仅是记录。只是提醒测试人员主要功能有哪些。
包含具体的输入项、每一个步骤、期待的结果。
过于简单,会导致测试有遗漏,而且根据测试执行人员的水平不同导致偏差较大。过于复杂,会导致效率太低,维护成本太高,限制测试人员的思维。一般在工作中都介于两者之间。
①根据程序的重要性和一旦发生故障带来的损失,来确定测试等级和测试重点
②认真选择测试策略。用尽可能少的测试用例发现尽可能多的错误。测试用例不足则会导致风险的增大;测试过度导致资源的浪费。需要找到平衡点
①先关注主要功能也就是业务流程、业务逻辑是否正确实现,考虑场景法
②需要输入数据的地方,考虑等价类划分法
③在任何情况下都使用边界值法
④如果程序中的功能中包含输入条件的组合情况,则选取因果图和判定表法
⑤对于配置类软件,需要考虑参数的组合情况,考虑使用正交排列法
⑥对照程序逻辑,如果发现没有达到要求的覆盖标准,适当补充更多的测试用例
⑦采用错误推断法,追加其他测试用例
缺陷不可避免,主要原因如下
在测试后,如果发现缺陷,则应该进行缺陷报告

记录测试结果
方便开发人员进行缺陷的定位
为后期统计缺陷提供依据
测试环境描述
步骤:
实际结果:清楚,不笼统
期望结果:根据需求文档,应该出现的结果
附件:截图、录屏、测试中需要的数据
解决方案/可能的原因(非必须):如果测试人员能够给出解决方案则更好了

① new-测试人员发现缺陷
② assigned - 由开发经理或者其他人员,将修复职责指定为某位开发人员
③ 开发人员阅读缺陷报告,可能得到的结果如下:
④ 测试人员检验缺陷状态

要点
缺陷从测试人员开始,也应该由测试人员结束
Fatal 致命的缺陷:
造成系统或应用程序崩溃、死机、系统挂起、或造成数据丢失,主要功能完全丧失,导致本模块以及相关模块异常等问题。
Critical 严重错误的软件缺陷
系统的主要功能部分丧失、数据不能保存,系统的次要功能完全丧失。问题局限在本模块,导致模块功能失效或异常退出。如系统资源占用过大、功能没有做完。
Major 一般的软件缺陷
次要功能没有完全实现但不影响使用。如:提示信息不太准确,或用户界面差,操作时间长,模块功能部分失效等。
Minor较小的软件缺陷
较小错误的软件缺陷,使操作者不方便或遇到麻烦,但它不影响功能性的操作和执行。例如:对话框弹出位置,步骤较多,输入项太麻烦。
Enhancemental 建议问题
由问题提出人对测试对象的改进意见或测试人员提出的建议,质疑。 例如:错别字、颜色、按钮大小。
严重程度的分级,并不统一,有的公司分为三个等级或者四个等级都是可以的

有的公司,也会把优先级分为3个或者5个,都是可以的。

风险评估:能否在计划内的时间发布
缺陷原因:避免反复出现同类型的缺陷
员工技能提升:根据开发和测试人员表现出来的问题,可有针对性提升
团队配置:根据缺陷修复时间,可知道团队配合强弱
准确:每个组成部分的描述准确不会引起误解。
简洁:只包含必不可少的信息,不包括任何多余的内容。
清晰:每个组成部分的描述清晰,易于理解。
完整:包含复现该缺陷的完整步骤和其他本质信息。
一致:按照一致的格式书写全部缺陷报告。
无法重现 或者 难以捕捉
缺陷报告中没有复现步骤
缺陷报告无法理解
极少使用的功能,或者不符合用户习惯,或者惯例
由不受信任的测试人员提出
上线时间有限制
不正确的操作
涉及模块太多,可能导致按下葫芦浮起瓢的情况
性价比太低
极难重现
CMM = Capability Maturity Model for Software = 软件能力成熟度模型
CMM/CMMI将软件过程的成熟度分为5个等级,以下是5个等级的基本特征:
很好奇,就使用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?并散列所有无济于事。
我有一些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
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
我有:When/^(?:|I)follow"([^"]*)"(?:within"([^"]*)")?$/do|link,selector|with_scope(selector)doclick_link(link)endend我打电话的地方:Background:GivenIamanexistingadminuserWhenIfollow"CLIENTS"我的HTML是这样的:CLIENTS我一直收到这个错误:.F-.F--U-----U(::)failedsteps(::)nolinkwithtitle,idortext'CLIENTS'found(Capybara::Element