美国著名的质量管理专家朱兰(J.M.Juran)博士从顾客的角度出发,提出了产品
质量就是产品的适用性
质量:反映实体满足明确或隐含需要能力的特性总和。
软件质量就是:“软件与明确的和隐含的定义的需求相一致的程度”
衡量软件质量的标准:

上图总结:满足客户明确的需求,符合软件开发的准则,满足隐含的需求

红色的为测试按内容分类有哪些?
1.4.1功能性
功能性
当软件在指定条件下使用时,软件产品提供满足明确和隐含要求的功能的能力。
适合性
软件产品符合需求,能解决用户业务问题
准确性
软件产品数据和处理处理能力要准确
互操作性
软件产品与其他系统的交互和对接能力。
安全保密性
软件产品权限安全,不同角色进入拥有不同的操作权限
1.4.2性能
时间特性
软件产品执行其功能时,提供满足需求的响应时间和处理时间以及吞吐率等指标的能力。
资源利用性
软件产品执行其功能时,提供满足需求的CPU、内存等占用率的能力
1.4.3安全性
软件在受到恶意攻击的情形下依然能够继续正确运行的能力
软件被在授权范围内合法使用的能力,如:序列号决定使用数。
软件完整,避免被盗版、破解或植入病毒
1.4.4兼容性
软件适应不同的规定环境下的能力
软件遵循与可移植性有关的标准或约定的能力
软件与其他替代软件兼容的能力
常见的兼容性(浏览器、操作系统)
1.4.5可靠性
可靠性
在指定条件下使用时,软件产品维持规定的性能级别的能力。
成熟性
软件产品为避免由软件内部的故障而导致失效的能力。
容错性
软件出现故障或者违反其指定接口的情况下,依然维持规定的性能级别的能力。
易恢复性
失效发生后,重建规定的性能级别并恢复受直接影响的数据的能力。
1.4.6易用性
易用性
在指定条件下使用时,软件产品被理解、学习、使用和吸引用户的能力。
易理解性
软件产品让用户无须过多学习就能理解的能力。
易学性
软件产品让用户即使参加了学习,学习成本高低的能力。
易操作性
软件产品让用户操作方便,符合使用习惯的能力。
吸引性
软件产品让用户觉得舒服、操作吸引眼球的能力。
用户体验性
是以上几个特性的统称,部分企业把易用性也称之为用户体验性,是一个比较时髦的词。
1.4.7安装卸载
执行安装/卸载时,能按照一定的规格和流程将软件安装上的能力。
简化的软件安装/卸载过程
提供亲切友善的操作逻辑或接口
1.4.8可维护性
易分析性
软件出问题后,快速判断问题点并能快速修复的能力。
易改变性
软件修改后可快速发布,快速投入生产的能力。
稳定性
软件避免由于软件修改而造成意外结果的能力。
易测试性
软件版本升级修改后被快速确认的能力。
1.4.9可移植性
适应性
软件不需采用其他手段就可适应不同的指定环境的能力。
易安装性
软件在指定环境中被快速安装的能力。
共存性
软件在同一环境下同与其他软件共存的能力。
易替换性
软件在同一环境下,替代另一个相同用途的软件的能力。

QC和QA的主要区别:前者是保证产品质量符合规定 , 后者是建立体系并确保体系按要求运作,以提供内外部的信任。
QC就是测试人员,职责是尽可能早地发现软件的缺陷,并确保缺陷得到修复(有些企业里,测试人员被称为SQA)。
QA是流程的监督者,职责是创建和执行 改进软件开发过程,并防止软件缺陷发生的标准和方法。
提高软件质量
保证软件安全
降低软件开发成本
减低企业风险
提升用户体验感
回答1:在规定的条件下对程序,进行操作,以发现错误,对软件质量进行评估
发现Bug
提高质量
降低成本
或者回答:发现bug,检验用户需求,提高体验
所有的软件测试都应追溯到用户需求(用户需求为核心)
应当把“尽早地和不断地进行软件测试”作为软件测试者的座右铭(尽早测试)
完全测试是不可能的,测试需要终止(完全测试是不可能的)
测试无法显示软件潜在的缺陷(潜在缺陷不容易被发现)
充分注意测试中的群集现象(减少群集现象)
开发工程师应避免测试自己的程序(开发避免自测)
尽量避免测试的随意性(避免随意性)
测试的抗药性(重复的检测容易产生抗药性)
软件包括程序、数据、文档,所以软件测试应该贯穿于整个软件生命周期中。
在整个软件生命周期中,各阶段又有不同的测试对象,形成了不同开发阶段的不同类型的测试。
单元测试,集成测试,确认测试,系统测试,验收测试
单元测试:
又称为,模块测试,是针对程序的一种测试,测试单个模块
集成测试:
也叫接口测试,就是多个单个的模块进行整合的测试
系统测试:
系统将已经确认的软件、计算机硬件、外设、网络等其他元素结合在一起,进行信息系统的各种组装测试和确认测试.(软件,硬件,外设,网络结合在一起的测试)
系统测试是针对整个产品系统进行的测试,目的是验证系统是否满足了需求规格的定义,找出与需求规格不符或与之矛盾的地方,从而提出更加完善的方案(对整个产品进行测试,检验是否满足需求规定)
对象不仅仅包括需测试的软件,还要包含软件所依赖的硬件、外设甚至包括某些数据、某些支持软件及其接口等测试
系统测试范围:功能、性能、界面、强度、容量、安全性、配置、安装、卸载、数据库等
确认测试:
验收测试:
Alpha: Alpha测试是在用户组织模拟软件系统的运行环境下的一种验收测试,由用户或第三方测试公司进行的测试,模拟各类用户行为对即将面市的软件产品进行测试,试图发现并修改错误。
Beta:Beta测试是用户公司组织各方面的典型终端用户在日常工作中实际使用beta版本,并要求用户报告异常情况,提出批评意见。

静态测试:不运行被测试的软件,而只是静态的检查代码、界面或者文档
动态测试:实际运行被测试的软件,输入相应的测试数据,检查实际的输出结果是否和预期结果相一致的过程。
1、黑盒测试
把软件看成一个黑盒子,不管内部逻辑和内部特性,只依据规格说明书检查程序的功能是否符合功能说明
2、白盒测试
又称为结构测试。着重于程序内部结构和算法,不关心功能和性能指标。
3、灰盒测试
介于白盒和黑盒测试之间,基于程序运行时刻的外部表现同时又结合程序内部逻辑结构来设计用例,执行程序并采集程序路径执行信息和外部用户接口结果的测试技术。
回归测试:
1.测试新建bug,开发修改后将状态修改为“已修改”后通知测试进行验证,此时测试人员所进行的测试称为回归测试。
2.当测试回归后没有问题,但所测试的功能和其他模块或功能有一定的关系(如数据有交叉和公式计算等),这时测试人员要针对这个部分再次测试,保证不会因为修改了这个bug而导致新bug的产生(开发在修改代码或注释时容易注释错),此时测试人员所进行的测试也称为回归测试
3.当项目(或模块和功能)快上线,测试经理会通知测试人员再把所有功能测试一次,保证上线后不会出问题,此时测试人员所进行的测试称为回归测试
冒烟测试:
发布一个版本时,先对该版本进行最基本功能的测试,用以确认该版本基本功能正常后再开展进一步的测试工作;如基本功能不通过,打回给开发,直到冒烟通过
只有公司需要时才冒烟,并不是任何时候都冒烟,因为实际工作中项目往往比较紧
部分公司是让开发做冒烟,会给开发提供一个checklist
随机测试(又名猴子测试)
随机选择测试数据做测试,主要根据经验进行功能和性能等抽查
敏捷测试(敏捷开发引发)
敏捷最大特点是高度迭代,有周期性,并且能够及时、持续地响应客户的频繁反馈。简单点理解:天下武功,为快不破。
TDD(测试驱动开发)
软件测试中的软件风险分析是根据预测软件将出现的风险,制定软件测试计划并排列优先等级,风险分析是对软件中潜在的问题进行识别、估计和评价的过程。
风险也包括进度风险、质量风险、人员风险、变更风险、成本风险等
遇到进度风险该怎么办:给领导两条路,是保进度还是保质量,保进度的话就得加大人手,对不影响用户体验的BUG比较难修复的先等下个版本再进行修复,保质量的话就应该给我们更多的时间,加大人力投入,以提高软件的质量
很好奇,就使用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