软件测试(Rick,Stefan,2002)是为了度量和提高被测软件的质量,是对被测软件进行工程设计、实施和维护的整个生命周期过程
2、测试目的
- 确保产品完成了它所承诺或公布的功能,并且所有用户可以访问到的功能都有明确的书面说明
- 确保产品满足性能和效率的要求
- 确保产品是健壮的和适应用户环境的
- 综上,系统地找出软件中潜在的各种错误和缺陷,并能够证明软件的功能和性能与需求说明符合
3、软件测试准则
- 所有的测试都应该能追溯到用户的需求
- 应该在测试开始之前就制定测试计划
- 把Pareto原理(即二八定律)应用于软件测试
- 测试应该从“小规模”开始,并逐步进行“大规模”测试
- 穷举测试是不可能的
- 为了达到最佳的测试效果,应该由独立的第三方来从事测试工作
4、软件测试人员的素质
- 正确认识软件测试
- 提高发现问题的敏锐度提升个人价值和权威
- 测试是技术和经验的结合 ,多快好省地发现错误会节约成本创造价值
- 站在使用者的角度发现尽可能多的问题
- 软件测试人员的工作内容
- 制定测试计划
- 编写脚本、执行测试并发现问题
- 提交问题报告
- 分析软件质量
- 测试人员要学会逆向思维
- 开发人员一般会从正面满足用户要求,较少考虑不满足需求的部分
- 测试人员不仅要考虑开发人员能想到的部分,也要考虑开发人员考虑不到的地方
- 测试是一项破坏性的行为
- 要有良好的沟通能力、表达能力和问题描述能力
- 如何让开发人员欣然接受自己的错误是一个很重要的技能
- 提交的缺陷报告能够简洁清晰地描述问题
5、软件测试分类
- 按照时间阶段划分
单元测试,集成测试,系统测试,验收测试 - 按照是否执行目标程序划分
静态测试,动态测试 - 按照是否查看源代码划分
黑盒测试,白盒测试 - 按照测试目标划分
功能性测试,可靠性测试,安全性测试,可用性测试,性能测试(负载测试,压力测试,容量测试)
- 等价类划分
把程序的输入域划分为若干子集,然后从每个子集中选取少数具有代表性的数据用作测试用例的输入 - 边界值分析
是一种补充等价类划分法的黑盒测试方法,它选择等价类边界的的数据作为测试用例中的输入数据 - 因果图
借助图形来设计测试用例的一种系统方法,适用于被测程序具有多种输入条件,程序的输出又依赖于输入条件的各种组合情况
2、白盒测试常用的方法
- 代码检查法
- 桌面检查、代码审查和走查等
- 代码检查法能快速找到缺陷,发现30%到70%的逻辑设计和编码缺陷
- 逻辑覆盖法
- 语句覆盖
- 判定覆盖
- 条件覆盖
- 判定/条件覆盖
- 条件组合覆盖
二、软件交付
1、交付流程
- 软件部署与上线
将集成测试后的软件部署至生产环境,这一阶段也称产品上线或试运行 - 验收测试
- 文档编制
开发人员编制和完善产品配套文档,特别是用户帮助与软件维护文档 - 成果移交
根据项目协议进行项目成果移交 - 用户培训
软件上线后,需要对目标用户进行软件使用培训,主要目标是让用户了解软件功能和迅速适应操作习惯 - 软件维护
2、参与者
用户
客户
管理人员
技术开发人员(含数据库管理员,基础设施专家)
产品经理
测试人员
运维人员等
3、产品交付清单(P305-P306)
测试报告
操作手册
用户手册
过程文档(需求规格说明书,设计规格说明书等)
软件源码
可执行软件包
技术开发手册等
4、用户培训
- 是一项让用户在集中的时间和地点对目标软件功能或特性、操作流程、使用习惯等进行了解和疑问解答的活动
- 在用户培训开展前需要制定培训计划,主要有
- 制定培训流程
- 确定参与者
- 确定时间和场地
- 选择培训形式
- 制作培训内容等
5、文档与用户帮助
- 软件文档作为软件产品的一部分移交给客户,能够向客户提供软件使用和维护的支撑,是比不可少的
- 由于软件用户在使用软件过程中会碰到各种各样的问题,产品开发团队需要提供多种多样的用户帮助,例如
三、软件维护
1、简介
- 软件维护是软件产品生命周期的最后一个阶段
- 软件维护是软件生命周期中延续时间最长、工作量最大的阶段
据统计,软件开发机构60%以上的精力都用在维护已有的软件产品上了
对于大型的软件系统,一般开发周期是1~3年,而维护周期会高达5~10年,维护费用甚至会高达开发费用的4~5倍
2、软件的可维护性
- 用来衡量对软件产品进行维护的难易程度的标准,它是软件质量的主要特征之一
- 影响软件可维护性的因素有很多
- 可理解性
通过阅读软件产品的源代码和文档,来了解软件的系统结构、功能、接口和内部过程的难易程度
一致的编程风格,准确、完整的文档,有意义的变量名称和模块名称,清晰的源程序语句等是影响可理解性的重要因素 - 可测试性
诊断和测试软件缺陷的难易程度 - 可修改性
对程序进行修改的难易程度
3、提高软件的可维护性
1、建立完整的文档
2、采用先进的维护工具和技术
- 自动化配置管理工具
配置变更检测,变更事件分发,流程管理等 - 自动化系统监控工具
硬件设备主动监控,如路由器、防火墙等
软件运行主动监控,如应用服务器、数据库等 - 自动化维护报告生成工具
日志分析、性能状况分析、资源使用分析等 - Puppet,CFEngine Tool等
3、注重可维护性的评审环节
- 在软件开发过程中,每一阶段的工作完成前,都必须通过严格的评审
- 对软件可维护性的评审应该贯穿于每个阶段完成前的评审活动中
- 在需求分析阶段的评审中,应该重点标识将来有可能更改或扩充的部分
- 在软件设计阶段的评审中,应该注重逻辑结构的清晰性,并且尽量使模块之间的功能独立
- 在编码阶段的评审中,要考查代码是否遵循了统一的编写标准,是否逻辑清晰、容易理解
4、软件维护的副作用
- 软件维护是存在风险的。对原有软件产品的一个微小的改动都有可能引入新的错误,造成难以预料的后果
- 软件维护的副作用主要有三类
- 修改代码的副作用
每次对代码的修改都可能导致新的错误产生 - 修改数据的副作用
造成程序与数据结构不匹配 - 修改文档的副作用
造成文档与源程序不一致
5、具有危险性的代码修改
- 删除或修改一个子程序
- 删除或修改一个语句
- 删除或修改一个标识符
- 为改进性能所做的修改
- 修改运算符,尤其是逻辑运算符
- 修改文件的打开或关闭模式
- 把对设计的修改转换成对代码的修改
- 修改边界条件的逻辑测试等
6、具有危险性的数据修改
- 重新定义局部或全局常量
- 重新定义记录或文件格式
- 增加或减少数组长度
- 重新排列子程序或函数的输入、输出参数
- 修改指针或对象引用的初始化类型等
7、具有危险性的文档修改
- 不及时的文档内容变更
- 丢失一些重要的技术细节
-不规范,晦涩难懂的表达方式等
8、维护过程
- 可以把软件维护过程看成是一个简化或修改了的软件开发过程
- 建立维护机构
维护机构中要有维护管理员、系统监督员、配置管理员和具体的维护人员 - 用户提出维护申请并提交维护申请报告
当用户发现问题并需要解决时,首先应该向维护机构提交一份维护申请报告
申请报告中需要详细记录软件产品在使用过程中出现的问题 - 维护人员确认维护类型并实施相应的维护工作
对维护工作进行类型划分,并确定每项维护工作的优先级 - 整理维护记录并对维护工作进行评审
- 对维护工作进行评价
9、维护分类
根据维护工作的特征以及维护目的的不同,软件维护可以分为
- 纠错性维护
为了识别并纠正软件产品中所潜藏的错误,改正软件性能上的缺陷所进行的维护 - 适应性维护
为了使软件产品适应软硬件环境的变更而进行的维护 - 完善性维护
针对用户对软件产品所提出的新需求所进行的维护,可以看成是对原有软件产品的“再开发” - 预防性维护
采用先进的软件工程方法对已经过时的、很可能需要维护的软件系统的某一部分进行重新设计、编码、测试,以达到结构上的更新
10、软件维护技术
常用的软件维护技术有
- 软件配置管理(Software Configuration Management,SCM)
一套管理软件开发和维护过程中所产生的各种中间软件产品的方法和规则
主要功能
版本控制:对软件开发过程中产生的各种文件的版本进行管理
变更管理:为防止开发人员对软件的随意变更而进行的管理上的审核过程
其他:配置审计、配置状态统计等
管理的对象
常见的软件配置项:需求规格说明书、设计规格说明书、源代码、测试计划、测试用例、用户手册
构造软件的工具和软件赖以运行的环境也常常列入配置管理的范畴
- 变更影响分析(Impact Analysis of Changes)
- 软件恢复(Software Rejuvenation)
- 重构(Refactoring)
在不改变软件的功能和外部可见性的情况下,为了改善软件的结构,提高软件的清晰性、可扩展性和可重用性而对其进行的改造
一般分为
代码重构
模块重构
架构重构
使用的方法
重新组织函数、重新组织对象、重新组织数据、简化条件表达式、简化函数调用等
- 逆向工程(Reverse Engineering)
一种产品设计技术再现过程,即对一项目标产品进行逆向分析及研究,从而演绎并得出该产品的处理流程、组织结构、功能特性及技术规格等设计要素
软件的逆向工程需要借助反编译、反汇编工具,例如
Android apk逆向工具apktool
Java class逆向工具IntelliJ IDEA
预防性维护所录用的主要技术,是为了以新形式重构已存在软件系统而实施的检测、分析、受替,以及随后构建新系统的工程活动
过程
采集、分析软件基本信息
文档重构
逆向工程
代码重构
数据重构
正向工程