本文已参与「新人创作礼」活动,一起开启掘金创作之路。
软件的生命周期
软件的生命周期指的是软件产品从开始设想到软件不再使用而结束的时间。一般来说,软件的生命周期可以分成六个阶段,即需求分析、计划、设计、编码、测试、运行维护。
开发模型与测试模型
瀑布模型
瀑布模型在软件工程中占有着重要的地位,是其他所有的模型的基础框架。瀑布模型是一种线性顺序进行软件开发的模式。
瀑布模型的优点:
- 强调开发的阶段性
- 强调早期的计划以及需求调查
- 强调产品测试
瀑布模型的缺点:
- 依赖于早期唯一的一次调查,无法及时适应需求的变化
- 流程单一,无法于本产品的开发过程中形成反馈
- 风险被延后到了最后的测试阶段才显现出来,失去及时的纠正机会
螺旋模型
螺旋模型是瀑布模型的一种应用与优化,是一种演化软件开发过程的模型。螺旋模型最大的特点在于引入了其他模型不具备的风险分析,使得软件可以在存在重大风险时可以及时规避或停止,从而有效的减少损失。
螺旋模型的每一个周期都包括需求定义、风险分析、工程实现与评审四个阶段。软件开发过程中每迭代一次,软件开发就又前进一个层次。
- 需求定义:(制定计划)确定软件目标,选定实施方案,弄清项目开发的限制条件。
- 风险分析:分析评估所选方案,考虑如何识别与消除风险。
- 工程实现:实施软件开发与验证。
- 评审:(客户评估)评价开发工作,提出修正意见,准备制定下一步计划。
螺旋模型的特点:螺旋模型将整个开发过程分解为数个“瀑布模型”的开发阶段,并在每一个开发阶段之前引入了严格的风险识别、风险分析与风险控制。通过将软件整体划分的手段同时将风险也进行了划分。将软件项目划分为一个个小项目,每个小项目都标识一个或者多个风险,直到主要风险因素都被发现。
螺旋模型强调风险分析,在软件开发的每一个阶段都对风险有所了解并尝试解决,故而适用于庞大、复杂且具有高风险的系统。
螺旋模型的优点:
- 强调各开发阶段的质量
- 有严格的风险管理
- 提供了足够的及时止损的机会
螺旋模型的缺点:
- 过多迭代次数会增加开发成本,延迟提交时间
- 引入非常严格的风险识别、风险分析与风险控制,对风险管理技术水平要求过高。
软件测试V模型
V模型与瀑布模型一般,是一种线性顺序的开发测试模式,不过V模型明确标注了测试过程中存在的不同类型的测试,并且形象的表现了测试阶段与开发过程期间的对应关系。
V模型指出:
- 单元和集成测试应检测程序的执行是否满足软件设计的要求;
- 系统测试应检测系统功能、性能的质量特性是否达到系统要求的指标;
- 验收测试确定软件的实现是否满足用户需要或合同的要求。
V模型的局限性:
- 仅仅将测试作为编码之后的一个阶段,没有在需求阶段就进入测试流程。
软件测试W模型
与V模型不同的是,W模型给软件各开发阶段中增加了同步进行的验证与确认活动。W模型由两个V字模型组成,分别代表了测试与开发的流程。在W模型中,测试与开发是并行的。
W模型的特点:测试的不仅仅是对象,需求与设计同样要进行测试,测试与开发是同步进行的。
W模型的优点:由于测试与开发是并行进行的,可以尽早的发现问题。
W模型的局限性:
- 需求、设计、编码等活动被视为串行的;
- 测试和开发活动也保持着一种线性的前后关系,上一阶段完全结束,才可正式开始下一个阶段工作。
- 无法支持敏捷开发模式。
按开发阶段分类测试
单元测试
单元测试是完成软件设计单元,也就是我们所说的模块的验证工作,目标是确保模块被正确的编码,使用过程设计描述作为指南,对重要的控制路径进行测试从而发现模块内的错误。单元测试通常是白盒测试。
集成测试
集成测试也被称为联合测试、组装测试,将程序模块按照适当的继承策略组装起来,对集成接口以及组装后的功能进行正确性检测。集成测试主要是针对程序内部结构进行测试,特别是对程序之间的接口进行测试,一般会使用黑盒测试与白盒测试相结合的测试方法。
集成测试通常有两种测试方法:
- 自顶向下集成:首先集成主模块,然后按照控制层次结构向下进行集成,将隶属于主模块的模块按照深度优先或者广度优先的方式集成到整个结构中去。
- 自底向上集成:从调用的底层开始逐级向上集成,每测试完一个族群就将它挂到上一层的模块上,由此省去了写桩函数的步骤,但需要写每个模块的驱动函数。
桩函数与驱动函数:
- 桩函数:用来代替被测模块调用的模块。
- 驱动函数:被测模块的主程序,接收测试数据,并将测试数据传递给被测模块。
系统测试
系统测试是一种黑盒测试。是一种基于系统整体需求说明书的黑盒测试,覆盖系统所有的联合部件。
系统测试是针对整个产品系统进行测试,目的是为了验证系统是否满足需求的定义,找出与需求不相符或矛盾的地方。系统测试的对象不仅仅包含软件本身,还要包含软件所依赖的硬件、外设甚至于包含某些数据,一些其他软件的接口等。
回归测试
回归测试指的是我们在修改了系统的代码之后,重新测试之前已经测试过的用例,从而保证系统的正确性,确保没有引入新的错误。
回归测试在整个软件系统开发的过程中都占有着极大的工作量。软件开发的各个阶段都会进行多次回归测试。并且随着系统体量的增大,回归测试的成本也随之增大,通过选择正确的回归测试策略来改进回归测试的效率以及有效性是非常有意义的。
冒烟测试
冒烟测试是每当软件完成一个新版本后,对软件的最基本功能进行的测试。在保证软件的基本功能正常的情况下,测试人员才会开始进行正式的系统测试。否则,测试人员应当将软件打回给开发人员令其对代码进行修正,修正后继续进行冒烟测试。
验收测试
验收测试是部署软件之前的最后一个测试操作。它是技术测试的最后一个阶段,也称为交付测试。验收测试的目的是确保软件准备就绪,按照合同或项目书、任务书、双方约定的验收文档,像软件使用者或购买者展示该软件满足原始需求。
与其他几种测试不同的是,验收测试的测试人员不再是软件开发方的专业测试人员,而是软件的最终用户或需求方。
验收测试一般会分为Alpha测试和Beta测试:
- Alpha测试:由用户在开发者提供的场所中进行测试,即测试的环境是一种受控的环境。
- Beta测试:在一个或多个用户的场所进行测试,开发者通常不在场,用户记录测试过程中的问题,测试完成后统一报告给开发者,由开发者进行最后的修改。
Alpha测试的环境是受开发方控制的,用户的数量相对比较少,时间比较集中。beta测试的环境是不受开发方控制的,用户数量相对比较多,时间不集中。
黑盒测试与白盒测试
根据测试过程中是否查看代码,测试可以分为黑盒测试与白盒测试。
黑盒测试
黑盒测试又称为功能测试或数据驱动测试,它是在已知产品所具有的功能的前提下,通过测试来检测产品的每个功能是否可以正常使用。
黑盒测试完全不考虑程序逻辑以及内部结构,测试者在接口处进行测试,只检查程序功能是否按照需求可以正常使用,程序能否适当的接收输入数据而产生正确的输出数据,同时保持外部信息的完整性。
黑盒测试的优点:
- 不需要测试者了解程序内部的代码以及实现,不关注软件内部的实现。
- 从用户角度思考设计测试用例,锻炼测试人员的思维。
- 测试用例是基于软件需求开发文档,不容易遗漏需求文档中需要的功能。
黑盒测试的主要缺点在于,黑盒测试是使用穷举法输入测试,只有把所有可能的输入都作为测试情况使用,才可以找出程序中的所有错误。但实际测试中,测试者不仅要测试合法输入,还要测试不合法输入,输入情况可能会有无穷多种,所以很难找出所有的问题。
并且,黑盒测试不可能覆盖所有的代码。
黑盒测试常用的方法有:等价类,因果图,边界值,场景法,正交实验设计法,错误猜测法等等。
白盒测试
白盒测试也称为结构测试或逻辑驱动测试。白盒测试一般用来分析模块的内部结构,针对程序的内部逻辑结构来设计测试用例进行测试。
白盒测试法检查程序内部的逻辑结构,对所有的逻辑路径进行检测,是一种穷举路径的测试方法,但即使每一条路径都测试过了,依然可能存在错误——穷举路径无法检测出程序本身是否违反了设计规范,即程序是否是一个错误的程序;穷举路径无法检测出程序是否存在遗漏路径的问题;穷举路径测试无法发现一些与数据相关的错误。
白盒测试需要遵循的原则:
- 每一个模块中所有独立路径都至少被测一次。
- 所有逻辑值都要测试真或假。
- 检查程序内部数据结构,保证其结构有效性。
- 在上下边界及可操作范围内运行所有循环。
常用的白盒测试方法:
- 静态测试:不运行程序,只是静态的检查程序、代码或文档中可能存在错误的过程。通过测试对象分析过程,只通过分析或检查源程序的设计、内部结构、逻辑、代码风格与规格等来判断程序的正确性。
- 动态测试:实际运行被测程序,输入相应的测试数据,检查实际输出结果与预期是否相符。
白盒测试中的逻辑覆盖包括:
- 语句覆盖:每条语句至少执行一次。
- 判定覆盖:每个判定的每个分支至少执行一次。
- 条件覆盖:每个判定的每个条件应取到的各种可能的值。
- 判定/条件覆盖:同时满足判定覆盖与条件覆盖。
- 条件组合覆盖:每个判定中的各个条件的组合至少出现一次。
- 路径覆盖:程序中每一条可能的路径至少执行一次。
手工与自动化
手工测试与自动化测试的优缺点对比。
手工测试
优点:
- 自动化无法替代探索性测试、发散思维结果的测试。
缺点:
- 执行效率慢,代价昂贵,容易出错。
- 依赖于测试人员的能力与经验。
自动化测试
优点:
- 对程序的回归测试更方便。
- 可以运行更多繁琐的测试。
- 可以执行一些手工执行困难或难以完成的测试。
- 提高资源的利用效率。
- 测试具有一致性与可重复性。
缺点:
- 不可取代手工测试。
- 发现的缺陷少于手工测试。
- 无法提供测试的有效性。
- 由于自动化测试比手工测试更脆弱,会限制软件开发。