为了确保软件产品质量,使产品能够顺利交付和通过验收,特编写本文,以作参考
本文适用于项目开发过程中的单元测试、集成测试、系统测试、业务测试、验收测试以及一些专项测试。
Ø 项目测试人员编写《测试计划》、《测试方案》,指导测试人员完成各阶段的测试工作。
Ø 项目测试人员搭建测试环境。
Ø 项目组测试人员按照《测试计划》、《测试方案》完成所承担的测试任务,并按要求输出《问题报告》、《测试报告》。
Ø 测试经理审核负责控制整个项目的时间和质量。依照确认测试规则和准则对产品进行确认和提出修改意见。
Ø 研发人员确认修改测试人员提交的bug。
4.1 测试依据
详细设计是模块测试的依据。因此设计人员应向测试人员提供《系统需求规格书名书》、《详细设计》、《概要设计》等有关资料。测试人员必须认真阅读,真正弄懂系统需求和详细设计。
4.2 制订《测试方案》
在测试之前,项目测试人员根据《测试计划》的要求,编写相应的《测试方案》,《测试方案》应包括以下内容:
Ø 测试目的;
Ø 所需人员及相应培训要求;
Ø 测试环境、工具和测试软件;
Ø 测试用例、测试数据和预期的结果。
4.3 单元测试
项目开发实现过程中,每个程序单元编码调试通过后,要及时进行单元测试。
单元测试由单元开发者自己进行,使用白盒测试方法,根据程序单元的控制流程,争取达到分支覆盖。
单元测试针对程序模块,从程序的内部结构出发设计测试用例。多个模块可以独立进行单元测试。
Ø 单元测试内容包括模块接口测试、局部数据结构测试、逻辑覆盖测试、路径测试、域测试、错误处理测试,代码覆盖率测试等;
Ø 单元测试组织原则一般根据开发进度安排对已开发完成的单一模块进行测试;
Ø 单元测试停止标准:完成了所有规定单元的测试,单元测试中发现的bug已经得到修改。
4.4 集成测试
编码开发完成,项目组内部应进行集成测试。
集成测试由测试人员编写(测试计划、测试用例)并实施测试。集成测试着重对各功能模块之间的接口进行测试,验证各功能模块是否能协调工作、参数传递及功能调用是否正常。测试采用交叉方法,即测试人员编写的测试用例由其他项目组测试人员进行测试。
集成测试过程中测试人员应填写《问题报告》,测试完成后测试人员编写《测试报告》。
4.5 系统测试
在集成测试完成之后,应对整个系统软件和硬件进行系统测试。对性能、可靠性、健壮性、压力承受力等方面分别进行评价,以验证系统是否满足规定的需要。
系统测试由项目测试人员按照《测试计划》、《测试方案》完成所承担的测试任务,并按要求输出《问题报告》、《测试报告》。
系统测试一般进行如下几种情况的测试:
Ø 正常情况
Ø 非正常情况
Ø 破坏性测试
Ø 边界情况
Ø 非法情况
Ø 强度测试
Ø 性能测试
Ø 兼容性测试
Ø 用户友好性测试
界面设计规范测试:
Ø 光标的初始位置
Ø 字体是否统一
Ø 字号是否符合规定
Ø 标题颜色
Ø 按钮的名称是否规范
Ø 界面布局是否合理,整体效果如何
输入值测试:
Ø 数据类型
Ø 数据长度
Ø 约束条件是否满足,是否完整
Ø TAB和Enter键是否起作用
Ø 键盘操作能否全部代替鼠标操作
Ø 输入(光标)是否按照顺序前进
按钮测试:
Ø 将按钮放开和封闭是否严格、准确,不能使用的按钮必须封闭
Ø 检查“退出”、“取消”等具有共性按钮的功能
异常情况测试:
在完成正常功能测试后,按正常处理的相同操作顺序,执行与正常处理不同的动作例如:
Ø 正常处理中要求输入日期的字段,这时输入字符或数字
Ø 正常处理中输入字段有范围要求,这时输入超过范围的值
Ø 正常处理中用两个值限定范围,这时用一个值或不限定
Ø 正常处理中要求用“Tab”键,这时安“Enter”键或其他键
Ø 正常处理中单选框、多选框、下拉框等,试一下那个非指定键操作
Ø 使用不同于指定的按钮操作
4.6 业务测试
在集成测试与系统测试结束后,均可由最终用户或测试人员对系统进行测试。业务测试着重测试业务流程,功能、用户界面等方面。
项目测试人员和相关人员制定测试方案和测试用例,并进行测试。
测试的结果应输出《问题报告》。
4.7 验收测试
4.7.1 验收测试的条件
Ø 按照项目计划规定的验收测试进度安排进行测试准备
Ø 在验收测试前,各项内部的测试活动都受到监控并争取执行
4.7.2 交付版本的要求
Ø 按照集成测试用例完成了整个系统的集成测试
Ø 集成版本满足设计定义的各项功能、性能要求
Ø 提交的数据库脚本样本需要完整,没有冗余数据
Ø 在集成测试中发现的bug已经得到解决,各级缺陷修改率达到标准
Ø 软件需求分析说明书中定义的所有功能都已经实现,性能指标全部达到性能需求指标
Ø 提交阶段性测试报告,包括功能和性能测试报告
Ø 所有文档齐备完整
4.7.3 版本发布的准则
Ø 软件产品通过了单元测试、集成测试、业务测试、系统测试、性能测试
Ø 测试部提交文档:测试计划、测试方案、测试用例、测试分析报告
Ø 所有测试项必须符合以下标准
n 致命错误:无
n 功能错误:无
n 功能缺陷:项目经理、技术经理、测试负责人审核通过
n 界面缺陷:项目经理、技术经理、测试负责人审核通过
n 建议:项目经理、技术经理、测试负责人审核通过
Ø 以上几项其中之一不满足要求,视为不合格
在产品交付和用户验收之前,通过验收测试来确认在规定的使用环境下整个产品的运行情况是否满足规定的要求。
在产品交付之前,由指定的验收负责人组织制定测试方案和测试用例,主持验收。
验收测试过程应输出《问题报告》。
4.8 用户现场测试
将软件部署到用户实际生产环境后,由于环境差异,需要在用户现场进行确认测试,保证系统功能、性能完备,可正常运行。测试内容:
Ø 根据软件系统规模,准备现场测试用例,涵盖所有重要功能点,若规模小,需要将全部功能点全部测试一遍
Ø 重点检查上传、下载的数据是否可以正常的打开或保存
Ø 确认界面美观,基本信息和链接无错误
Ø 考虑用户实际的软件环境和网络环境,以客户端最为复杂的软硬件环境作为测试机器,检查有无异常情况出现
Ø 针对前期发现的bug进行回归测试,以保证发布版本为最新版本
4.9 编写测试文档
4.9.1 测试点
将测试模块分解成多个功能点,测试点应涵盖功能点,也涵盖了正常测试和异常测试。
4.9.2 输入数据
输入数据包括界面输入数据、数据库的初始数据及其他外部输入数据。特别是数据库的初始所需属性一一列出,全面是指:数据能达到模块所涉及的全部功能。
4.9.3 测试描述
描述测试步骤,包括:测试人员所执行的动作(包括鼠标、键盘、加载外部数据等操作);系统的反应,包括:光标定位、光标聚焦、显示字段值、按钮的封闭和放开、功能键的封闭和放开、系统提示和系统消息等。
4.9.4 预期输出数据
按准备的输入数据和设计要求的处理过程,模块应输出的数据。
输出数据包括:屏幕输出数据、输出到数据库的数据、输出到其他外部介质上的数据。
4.9.5 实际输出
填写本测试点程序运行后的实际输出。
4.9.6 正确与否
程序运行后,实际输出结果和预期输出结果一致时,为正常,否则为不正常。
4.9.7 测试结论
填写本次测试的结论,是合格或不合格。若不合格时,应总结存在的问题,可以让修改者一目了然
5 缺陷管理
5.1 缺陷的定义及其基本属性
缺陷是指在软件开发过程中的针对软件产品和开发过程中的问题,这些问题已经影响或可能会影响软件产品的质量。缺陷应该具备以下属性,也就是往缺陷管理库或者缺陷列表中提交的缺陷应该具备以下属性:
| 属性名称 | 描述 |
| 缺陷标识 | 标记某个缺陷的一组符号,每个缺陷必须有一个唯一的标识 |
| 缺陷类型 | 根据缺陷的自然属性划分的缺陷种类 |
| 缺陷验证程度 | 因缺陷引起的故障对软件产品的影响程度 |
| 缺陷所处的模块或子系统 | 缺陷分步的模块或子系统 |
| 缺陷出现几率 | 指发现错误的几率 |
| 缺陷的重现步骤 | 详细的缺陷重现步骤 |
| 附件 | 与缺陷相关的附件(截图、附件、用例等) |
| 备注 | 对缺陷的其他描述 |
5.2 缺陷分类
根据缺陷的定义,将缺陷分为如下列:
Ø 文档缺陷:是指对文档的静态检查过程中发现的缺陷。检查活动包括同行评审、产品审计等。评审的缺陷要根据被评审对象的类型来确定,被评审的对象包括最终出产物和中间过程产出物,比如需求文档、设计文档、计划、报告、用例等
Ø 代码缺陷:是指对代码进行同行评审、审计或代码走查过程中发现的缺陷
Ø 测试缺陷:是指由测试活动发现的测试对象的缺陷,测试活动包括单元测试、集成测试、系统测试、性能测试等
Ø 过程缺陷:有称为不符合项问题,是指通过过程评审、过程分析、管理评审、质量评估、质量审核等活动发现的关于过程的缺陷和问题。过程缺陷的发现者一般是测试人员、项目经理等
5.3 文档缺陷分类
| 缺陷分类 | 描述 |
| 描述不完整 | 文档内容缺失,或文档应该包括的范围没有涵盖 |
| 不一致 | 一致性问题有两类:一是与源头说明书不一致,比如需求和客户业务需求不一致、设计与需求不一致等二是上下文或者与前提不一致 |
| 描述错误 | 文档描述是错误的,不可实现或导致错误的输出或结果 |
| 功能问题 | 该缺陷将会导致用户功能的错误、不满足、不可用 |
| 不清楚或有歧义 | 内容的描述不清楚、不能准确表达、或表达的意思有歧义 |
| 逻辑错误 | 内容组织逻辑不清楚、逻辑错误 |
| 接口问题 | 与最终用户接口问题、与外部系统的接口问题、内部子系统或模块的接口问题 |
| 输入输出问题 | 输入输出不完整、不正确、不可测试或验证 |
| 不细化 | 内容还需要进一步细化 |
| 性能问题 | 文档的设计或实现方式存在性能问题 |
| 安全性问题 | 文档的设计或实现方式存在安全性问题 |
5.4 代码缺陷分类
| 缺陷分类 | 描述 |
| 常量变量定义问题 | |
| 不满足设计或需求 | |
| 编写代码不符合规范 | |
| 条件判断处理 | |
| 循环处理错误 | |
| 异常处理 | |
| 算法逻辑问题 | |
| 注释问题 | |
| 代码冗余 | |
| 性能问题 |
5.5 系统测试缺陷分类
| 缺陷类型 | 描述 |
| 功能错误 | 影响了重要的特性、用户界面、产品接口或全局数据结构,并且设计文档需要争取的变更。如逻辑、循环、递归、功能等缺陷 |
| 结构错误 | Web应用程序结构化页面无法显示,或者显示错误 |
| 脚本错误 | Web应用程序当中出现脚本错误,包括客户端对数据进行校验和运算的各种情况下产生的错误 |
| 页面链接错误 | Web应用程序页面出现空链接、错误链接、死链接 |
| 页面文字错误 | Web应用程序页面出现的中外文拼写、使用、以及不同语种页面的编码错误 |
| 页面图形错误 | Web应用程序页面出现图片内容使用不当,或者无法显示 |
| ALT错误 | Web应用程序页面当中超文本标识语言、文本标签解释错误 |
| 排版错误 | Web应用程序页面排版不符合要求或者不符合使用习惯 |
| 业务逻辑不合理 | 应用程序的实现流程和规定业务流程不一致,或者实现流程无法正确完成。包括流程数据的部分并行、争用、同步等操作,引起的流程断裂、死锁、以及其他异常情况 |
| 业务逻辑不方便 | 应用程序实现流程在实际情况下虽然可以完成,但是存在不必要的反复、等待、冗余等影响使用效率的情况 |
| 其他错误 | 其他未分类错误 |
| 建议 | 系统改进建议 |
5.6 缺陷等级定义
缺陷的严重程度对以上所述的缺陷类型都是适合的,缺陷的严重程度反映的是对缺陷的发现对象可能造成的影响或后果来定义的。
| 缺陷等级 | 缺陷性质 | 系统中对应的错误分类 | 描述 |
| 一级 | 致命错误 | 系统崩溃系统死锁 | 导致对被描述的主要对象的理解错误、不可行、不可运转、对业务和整个系统造成重大损失或损害;对使用、维护或保管人员有危险或不安全,以及对产品的基本功能有致命影响的缺陷 |
| 二级 | 严重缺陷 | 严重错误 | 对被描述的部分对象的理解或实现错误,部分的模块或系统不可行或不能运转或部分模块和系统缺失,对整个系统有重大影响或可能造成部分的损失或损害;严重影响使用安全 |
| 三级 | 一般缺陷 | 次要错误布局不合理文字错误 | 系统中部分单元模块或单个功能描述和实现有错误、有偏差、不一致或有缺失,不影响模块的正常运行,或有影响,但可以有替代的办法或避免办法 |
| 四级 | 微小缺陷 | 微不足道 | 基本不影响系统的运行和功能的实现。但是与标准、规范和定义不一致 |
| 五级 | 建议缺陷 | 新特性 | 不在定义、标准、范围的定义和约束之内,但是从提出者来看是需要完善的建议 |
5.7 缺陷优先级定义
| 缺陷优先级 | 描述 |
| 特急 | 需要立刻进行修改 |
| 加急 | 一天到两天之内必须修改 |
| 高 | 介于中和加急之间 |
| 中 | 缺陷需要正常排队等待修复或列入软件发布清单 |
| 低 | 留到组后解决,如果项目的进度跟紧张可以在产品发布以前不解决 |
5.8 缺陷状态定义
| 缺陷状态 | 描述 |
| 初始状态(New) | 测试或开发人员提交一个新的缺陷,等待开发人员或项目经理分配修改负责人 |
| 打回(FeedBack) | 要求缺陷的报告者再次对缺陷进行说明 |
| 已分配(Assigned) | 是指已经分配给开发者,等待修改。 |
| 已解决(Resolved) | 缺陷被开发者修改,等待测试人员验证 |
| 关闭(Closed) | 测试人员验证缺陷已经修复 |
| 重新打开(Reopen) | 测试人员验证,缺陷没有修改正确 |
| 遗留(Later) | 经项目经理和技术经理验证此缺陷在本版本中不用修改 |
5.9 缺陷完成度
| 缺陷完成度 | 描述 |
| 打开(Open) | 缺陷没有被解决 |
| 已解决(Fixed) | 缺陷已经修改 |
| 遗留(Suspended) | 此缺陷步骤本阶段解决 |
| 重新打开(Reopen) | 重新打开某个缺陷 |
| 不做修改(Won’t fix) | 不对这个缺陷进行修改 |
| 重复(Duplicate) | 与某个缺陷重复 |
| 需求如此 | 经理和开发人员经过需求和设计的核实后决定不需要修改 |
| 不可重现 | 被指派的开发人员想要再现缺陷进行修改个时候,发现缺陷始终不能再现 |
5.10 缺陷管理流程
6.1 退回机制
若在测试过程中发生如下情况,将系统退回到申请部门:
Ø 经过测试后,发现与需求说明规格说明书中定义的功能项存在较大的差异
Ø 单一模块,测试过程中发现缺陷输了较多或者无法继续进行系统其它功能模块的测试,继续测试无意义
Ø 测试过程中,频繁死机或系统崩溃
Ø 主业务流程出现断点
6.2 异常情况处理机制
非正常情况下,需要进行特别处理的情形,此情况需要主管领导签字确认:
Ø 上线时间紧急的情况下,未经测试部充分测试就需要部署到用户现场
Ø 进度明显延迟,尚未进行验收测试就需要上线
6.3 报告机制
若出现以下情况,需要及时向部门领导和项目经理汇报的情况:
Ø 测试后期出现重大逻辑错误,修改测试影响上线时间
Ø 测试过程中用户需求出现重大变更
Ø 测试负责人定期汇报测试情况
7.1 被测试出的、在软件错误级别分类中定义的:
Ø 一级缺陷,致命错误,100%得到修改并且复测通过
Ø 二级缺陷,严重错误,100%得到修改并且复测通过
Ø 三级缺陷,一般错误,95%得到修改并且复测通过
Ø 四级缺陷,轻微错误,95%得到修改并且复测通过
7.2 用户可以接受未修改的软件错误
7.3 测试超过了预定时间表,由项目经理决定是否停止测试
7.4 测试结论及评价标准
| 测试结论 | 评价标准 |
| 拒绝发布 | 遗留了一级、二级缺陷 |
| 测试通过版本 | 不能遗留以一、二类缺陷三类 一般缺陷95%得到修改并且通过复测四类轻微缺陷85%得到修改并且通过复测 |
| 推荐使用版本 | 不能遗留以一、二类缺陷三类 一般缺陷95%得到修改并且通过复测四类轻微缺陷90%得到修改并且通过复测 |
| 可以证实发布版本 | 不能遗留以一、二类缺陷三类 一般缺陷97%得到修改并且通过复测四类轻微缺陷90%得到修改并且通过复测 |
7.5 输出
《阶段性测试报告》
《性能测试报告》
《测试总结报告》
《测试问题列表》
| 序 号 | 名 称 | 编 号 |
| 1 | 测试计划 | |
| 2 | 测试方案 | |
| 3 | 问题报告及维护记录 | |
| 4 | 测试总结报告 |
类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
我正在使用的第三方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
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
为什么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?并散列所有无济于事。
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这