测试是保证软件质量最重要手段, 维护是软件生命周期的重要组成部分.
软件测试
测试是证实软件需求说明的功能是否实现,是否达到预期的指标的最有效手段。至今为止,测试仍然是软件质量保证的最重要手段。
测试是为了发现错误,不是为了证明程序无错误。测试也不能证明程序中没有错误。
软件测试追求用最小的开销获得最好的效果, 发现尚未暴露的错误的测试是有效的测试.
所有的测试都应追溯到用户需求,从用户角度看,最严重的错误是不能满足用户需求。
测试用例由输入数据和相应的预期输出组成。测试用例不仅选用合理的输入数据,还要选择不合理的。
测试不仅检查程序是否做了应该做的事,还应该检查是否不应该做的。
应长期保留测试用例和测试系统,以便进行回归测试和维护。
测试技术可以分为静态测试和动态测试:
-
静态测试是在不运行代码的情况下对代码和文档进行检查
-
动态测试是指通过运行代码分析实际输出和预期输出进行的测试
静态测试效果较差, 开销较大(依赖经验丰富的技术人员), 通常使用较少.
动态测试有可以分为:
-
黑盒测试: 将软件视作黑盒, 只在接口上进行测试
-
白盒测试: 在了解软件内部结构的情况下, 检查软件内部行为是否正常的测试. 通常用于较小的测试单元.
单元测试
单元测试中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试,测试重点是系统的模块,包括子程序的正确性验证等。
单元测试可能需要模拟底层模块(桩模块stub)和上级模块(驱动模块driver).
集成测试
在单元测试的基础上,将所有模块按照设计要求,组装成为子系统或系统,进行集成测试。集成测试常是针对整体产品的某个功能的测试,又称功能测试.
实践表明,一些模块虽然能够单独地工作,但并不能保证连接起来也能正常的工作。测试重点是模块间的衔接以及数据的传递等。
根据模块或子系统的组装顺序不同, 集成测试可以分为:
-
自底向上(bottom-up)
-
自顶向下(top-down)
-
一次性测试(big bang)
-
三明治(sandwitch)
三明治测试是同时从上下两个方向进行组装: 对上层模块采用自顶向下,较早显示程序的总体轮廓; 对于关键的支持模块采用自底向上组装.
系统测试
系统测试是将经过测试的子系统装配成一个完整系统来测试。它是检验系统是否确实能提供系统方案说明书中指定功能的有效方法。测试重点是整个系统的运行以及与其他软件的兼容性。
除了是否满足需求外, 软件系统的质量特别是可靠性可以用其它指标衡量:
-
MTTF (Mean Time to Failure)平均失效等待时间
-
MTTR (Mean Time to Repair) 平均修复时间
-
MTBF (Mean Time between Failures)平均失效间隔时间, MTBF=MTTF+MTTR
通过对三种数据综合考虑, 可以得到一些评价指标:
-
可靠性: Reliability =MTTF/(1+MTTF)
-
可用性: Availability=MTBF/(1+MTBF)
-
可维护性: Maintainability=1/(1+MTTR)
系统测试根据不同的测试目的分为:
-
功能测试: 测试功能性需求是否已经实现
-
性能测试: 测试性能需求是否已经满足
-
可靠性测试: 测试软件系统可靠性, 通常通过检查MTTF等指标进行
-
验收测试: 验收测试的目的是确保产品满足了客户需求, 并获得客户认可.
-
安装测试: 测试软件系统能否可以正常在生产环境下安装, 以及安装文档是否正确
验收测试有时认为不是系统测试的一部分, 而是独立的测试环节.
验收测试:验收测试往往是由用户进行的功能性测试。国内一般分为初验和终验两个部分。
-
Benchmark test基准测试:由实际的用户或测试系统功能的某个专门小组进行
-
Pilot test试验性测试: install on experimental basis在试验的基础上安装系统
-
Alpha test: in-house test内部测试
-
Beta test: customer pilot客户测试
-
Parallel testing并行测试: 新老系统并行运作, 通过老系统验证新系统正确性
其具体的内容包括:Αlpha测试和Beta测试。在运行的过程中,往往需要进行并行测试。
回归测试
回归测试是指修改了代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误.自动回归测试将大幅降低系统测试、维护升级等阶段的成本.
回归测试作为软件生命周期的一个组成部分,在整个软件测试过程中占有很大的工作量比重,软件开发的各个阶段都会进行多次回归测试.在快速迭代和敏捷开发中频繁的发布使得回归测试更加频繁.
软件维护
软件维护是软件生命周期的重要组成部分, 维护根据目的不同可以划分为:
-
改正性维护(Corrective):维持日常功能正常
-
适应性维护(Adaptive):使软件适应环境和相关系统变化
-
完善性维护(Perfective):完善现有的功能
-
预防性维护(Preventive):防止潜在问题发生