** 软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题**。概括地说,软件危机包含下述两方面的问题:如何开发软件,以满足对软件日益增长的需求;如何维护数量不断膨胀的已有软件
具体的说,软件危机主要有以下一些典型表现:
- 对软件开发成本和进度的估计常常很不准确
- 用户对“已完成的”软件系统不满意的现象经常发生
- 软件产品的质量往往靠不住
- 软件常常是不可维护的
- 软件通常没有适当的文档资料
- 软件成本在计算机系统总成本中所占的比例逐年上升
- 软件开发生产率提高的速度,远远跟不上计算机应用迅速普及深入的趋势
在软件开发和维护的过程中存在这么多严重问题,一方面与软件本身的特点有关,另一方面也和软件开发与维护的方法不正确有关
软件不同于硬件,它是计算机系统中的逻辑部件而不是物理部件。由于软件缺乏“可见性”,在写出程序代码并在计算机上试运行之前,软件开发过程的进展情况较难衡量,软件的质量也较难评价,因此,管理和控制软件开发过程相当困难。此外,软件在运行过程中不会因为使用时间过长而被“用坏”,如果运行中发现了错误,很可能是遇到了一个在开发时期引入的在测试阶段没能检测出来的错误。因此,软件维护通常意味着改正或修改原来的设计,这就在客观上使得软件较难维护
目前相当多的软件专业人员对软件开发和维护还有不少糊涂观念,在实践过程中或多或少地采用了错误的方法和技术,这可能是使软件问题发展成软件危机的主要原因。而与软件开发和维护有关的许多错误认识和作法的形成,可以归因于在计算机系统发展的早期阶段软件开发的个体化特点。错误的认识和作法主要表现为忽视软件需求分析的重要性,认为软件开发就是写程序并设法使之运行,轻视软件维护等
为了解决软件危机,既要有技术措施(方法和工具),又要有必要的组织管理措施。软件工程正是从管理和技术两方面研究如何更好地开发和维护计算机软件的一门新兴学科
一个软件从定义、开发、使用和维护,直到最终被废弃,要经历一个漫长的时期。这就如同一个人要经过胎儿、儿童、青年、中年和老年,直到最终死亡的漫长时期一样。我们通常把软件经历的这个漫长的时期称为软件生命周期,如图:
软件有生命周期,那么就会有针对生命周期设计的执行模型,模型中规定了把生命周期划分成哪些阶段及各个阶段的执行顺序,因此也称为过程模型/开发模型
瀑布模型的设计其实就是按照软件生命周期一步一步进行的,一步一文档。它是所有其他模型的基础框架
- 风险往往在后期的测试阶段才显露,失去了及早纠正的机会
- 要有足够的时间预留给测试活动,否则将导致测试不充分,从而把缺陷遗留给用户
最大的缺陷在于可以运行的产品很迟才能看到
螺旋模型是在瀑布模型的基础上在每一步都引入了风险分析,每次分析完成之后会生成一个新的原型
这两个模型对比非常明显,因此放在一起介绍
** 增量模型是将一整个项目分成多个部分,同时进行开发,一个部分开发完成,就能让客户使用,以后每完成一部分,就在原有的基础上进行集成。这种方式听起来很好,既能及早的看到项目,也能针对一个模块及早发现问题。但是构建如何集成在一起,对于开发人员是个极大的挑战,一旦出问题,很可能整个项目都毁于一旦
** 迭代模型:与增量模型不同的是,迭代模型就是把项目看作一个整体,由开发人员先开发一个基础版本,但是功能比较简陋,之后多次进行版本迭代优化
敏捷宣言
- 个体与交互重于过程和工具
- 可用的软件重于完备的文档
- 客户协作重于合同谈判
- 响应变化重于遵循计划
在每对比对中,后者并非全无价值,但我们更看重前者
四句宣言表达了敏捷模型的一个特点:轻流程、轻文档、重目标、重产出,而这种方式,感觉更适合互联网公司
敏捷开发有很多种,其中scrum是比较流行的一种
三个角色
- 产品经理:收集用户的需求,编写需求文档,对产品负责的人
- 项目经理:负责召开各种会议,协调项目,为研发团队服务,也就是在研发团队后面催着赶工期的人
- 研发团队:开发人员、测试人员等
五个会议
首先,项目组里会有一个需求待办列表,即需求池,里面专门放没有实现的用户需求,由产品负责人进行整理
- 发布计划会议:产品经理从需求池里选取几个需求,开展发布计划会议,介绍需求内容,具体要实现哪些功能
- 迭代计划会议:将发布计划会议中的所有需求进行分配,并明确负责人,初步估计完成工时
- 每日例会(每天,持续2~4周):时间很短,就是让团队成员说明一下自己昨天做了什么,今天计划做什么,有什么问题。做到及时了解项目进度、预知风险并规避
- 演示会议:需求完成,这个时候只有项目组的成员会使用,因此需要负责人进行演示,期间把大家的反馈记录下来,进行总结,形成新的需求,进入需求池
- 回顾会议:项目团队对本期迭代进行总结,发现不足,制定改进计划,以达到持续改进的效果
测试在我们日常生活中是很常见的一个现象,而对软件而言,最常见的理解就是:软件测试就是找bug,发现缺陷。就是验证软件产品特性是否满足用户的需求
特点:软件测试只是一个样本试验,具有不可穷尽性
在多数软件公司里,会有两部分需求,一部分是用户需求,一部分是软件需求
** 当且仅当规格说明是存在的并且正确,程序与规格说明之间的不匹配才是错误**,当需求规格说明书没有提到的功能,判断标准以最终用户为准:当程序没有实现其最终用户合理预期的功能要求时,就是软件错误
一个合格的 bug 描述应该包括以下几个部分:
不同公司对bug等级的描述是不同的,我们这里只是列举一种描述bug等级的方式,这也就要求我们如果作为测试人员进入公司,就要先阅读公司关于bug等级的说明。具体bug等级包括以下四类:
与bug的级别一样,不同公司对bug生命周期的定义都是不一致的,这里只是说一种常见的例子。测试人员应该跟踪一个bug的整个生命周期,从Open到Close的所有状态。我们先介绍一下各个状态的定义
** 测试用例(Test Case)是为了实施测试而向被测试的系统提供的一组集合。这组集合包含:测试环境、操作步骤、测试数据、预期结果等要素**。主要是为了解决两大问题:测什么和怎么测
设计测试用例的要素:测试环境,测试步骤、测试数据、预期结果等
* 功能测试
* 界面测试
* 性能测试
* 兼容性测试
* 易用性测试
* 安全测试
例如设计水杯的测试用例
基于有需求的案例来设计测试用例
大概的设计就是根据需求进行分析有哪些功能,确定测试哪些点,设计测试用例,比如可以通过穷举法
等价类法
概念:针对需求输入范围划分成若干个等价类,从每个等价类中随机选取一个用例,若该用例通过,则认为它所代表的那个等价类也是通过的
等价类的理解参考图书馆的图书摆放,一类的书一定是放在一块儿的,因此我们如果要找某一类的书,我们只需要随便拿起一本看这片地方的书是什么类型的来判断这块儿地方是不是我们要找的那一类的书籍,而不需要一本一本一个一个进行查找
边界值法
边界值法是对等价类法的补充,我们如果只通过等价类法进行测试,势必会易漏很多需要重点关注的点
比如:2月14日活动截止,那么我们设定正确标准的写法应该是"time <= 2.14 23:59:59"或"time < 2.15 00:00:00",因此2.14 23:59:59就是我们的边界值,而2.14 23:59:58 和 2.15 00:00:00就是我们的次边界值
判定表法
判定表是一种表达逻辑判断的工具,适用场景:需要考虑输入之间的组合关系,不同的组合关系对应的输出结果不同
判定表设计测试用例的步骤:
- 确认输入条件和输出条件
- 找出输入条件和输出条件之间的关系
- 画判定表
- 根据判定表编写测试用例
正交法
特点:
- 每一列中,不同的数字出现的次数相同
- 任意两列之间数字的排列方式齐全且均衡
正交表我们要寻找到两个参数,因素数和水平数;因素数是指输入的条件,水平数是指每个输入条件能选择的值或行为(例如注册时选择电话是否填写
设计正交表很麻烦,我们可以利用allparis工具进行自动生成
通过正交法设计测试用例的步骤(L4(23)),其中L是指正交表,4是试验次数,3是因果数,2是水平数
- 找到因果数和水平数
- 用allparis工具来生成正交表
- 根据正交表来编写测试用例
- 补充测试用例(allparis工具生成的测试用例可能不完整,一些特殊测试用例需要我们手动添加)
场景设计法
分为基本事件流和多个备用事件流,正常情况下我们应该按照哪个流程进行活动称为基本事件流,其他可能遇到的意外情况就是备用事件流。编写测试用例时要求我们根据基本事件流和备用事件流的数量进行逐个设计
错误猜测法
这个方法纯靠测试人员的个人工作经验和积累
因此我们说,软件测试贯穿于软件的整个生命周期!
V模型的过程和软件生命周期几乎一样
概要设计阶段是指设计整体架构和框架,详细设计模块与模块之间的详细设计
单元测试阶段和集成测试阶段通常由开发人员来执行
** 最重要的也是最大的优点就是测试从获取用户需求阶段就开始介入了**
缺点:
也因为这种模型重文档,重过程,因此不支持敏捷开发
界面测试
界面测试(简称UI测试),指按照界面的需求(一般是UI设计稿)和界面的设计规则,对我们软件界面所展示的全部内容进行测试和检查,一般包括如下内容:
** 常见的界面错误包括:重叠,截断,文字不合理自动换行等**
可靠性测试
可靠性即可用性,是指系统正常运行的能力或者程度
可靠性 = 正常运行时间/(正常运行时间 + 非正常运行时间)* 100%
系统非正常运行的时间可能是由于硬件,软件,网络故障或任何其他因素(如断电)造成的,这些因素能让系统停止工作,或者连接中断不能被访问,或者性能急剧降低导致不能使用软件现有的服务
** 可用性指标一般要求达到4个或者5个9,即99.99%或者99.999%**
容错性测试
容错性测试是指系统能够处理异常,用户的错误操作而不至于系统崩溃,从而能够提高系统的可用性
容错性测试包括下面几个方面:
文档测试
文档包括开发文件,用户文件,管理文件等。
兼容性测试
明确要测试的兼容环境,考虑软硬件的兼容
易用性测试
安装卸载测试
安全测试
系统常见的安全漏洞和威胁如下:
性能测试
常见的性能问题:
内存泄漏测试
常见内存泄漏问题:
** 缺点就是不可能覆盖所有代码**
** 黑盒测试的测试方法包括:等价类,边界值,判定表,正交法,场景法,错误猜测法等等**
α测试
α测试是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的测试。α测试的目的是评价软件产品的FLURPS(即功能、局域化、可使用性、可靠性、性能和支持)
注意:α测试不能由程序猿或测试员完成
β测试
β测试是一种验收测试,由软件的最终用户们在一个或多个场所进行