IEEE定义对软件的定义如下:
· 软件是计算机程序、规程以及可能的相关文档和运行计算机系统需要的数据。
· 软件必须包含计算机程序、规程、文档和软件系统运行所必须的数据四个部分。
软件是逻辑产品,而不是物理产品,所以软件具有和硬件完全不同的特征。
80年代中期,软件业界正式引入“软件工厂”概念。
软件是开发产生的,而不是用传统方法制造。
软件没有有磨损
很多软件不能通过已有构件组装,只能自己定义。
软件维护要比硬件维护复杂的多。
当前计算机将软件分为七大类,使得软件工程正面临持续的挑战:
系统软件
应用软件
web应用软件
工程和科学软件
嵌入式软件
产品线软件
人工智能软件
新的挑战:普适计算、网络资源、开源软件、新经济
NATO(北大西洋公约组织)会议上给出的定义:
软件工程:为了经济地获得可靠的和能在世纪机器上高效运行的软件而建立和使用的好的工程原则。
美国电气和电子工程师协会给出的定义:
软件工程:(1)将系统化的、规范的、可度量的方法应用于软件的开发、运行和维护的过程,即将工程化的方法应用于软件中。(2)(1)中方法的研究。
软件过程、软件方法和软件工具
全面的质量管理,促进了不断的过程改进带来了成熟的软件工程方法。
软件工程的根基,在于对质量的关注。
工程----方法----过程----质量关注点
微软MSF的阶段和主要里程碑
起始于微软开发软件应用程序的过程,经过演化,与其他流行的过程模型中最为有效的原理相结合。
MSF过程模型可以跨越所有的工程类型,基于阶段类型的,里程碑驱动的,基于迭代模型等类型的工程。
部署完成–>愿景、范围核准–>项目计划核准–>范围完成–>发布就绪核准
三个阶段
可以把软件工程相关的工作分为三个阶段,其中每个阶段能够回答上述的一个或多个问题:
定义阶段针对“做什么”
开发阶段针对“如何做”
维护阶段针对“改变”
补充说明
典型的贯穿于整个软件过程的活动:
软件项目追踪和控制–>
正式的技术复审------->
软件质量保证--------->
软件配置管理--------->
文档的准备和产生—>
可复用管理------------>
测试------------------->
风险管理
Yahoo制定的规则:“开放”、“免费”、“盈利”
传统的软件开发和现代软件开发
软件团队与软件开发人员的培养
项目经理–>(软件开发组长(开发人员)、测试组长(测试人员)、(产品经理、用户教育人员、可用性工程师、设计师))
软件质量保证是一种应用于整个软件过程的保护性活动,包括:
一种质量管理方法
有效的软件工程技术(方法和工具)
在整个软件过程中采用的正式技术复审
以众多层次的测试策略
对软件文档及其修改的控制
保证软件遵从软件开发标准的规程
度量和报告机制
从以下几个方面考虑软件质量:
· 软件结构方面
· 功能与性能方面
· 开发标准与文档方面
软件系统规模和复杂性的增加,使得软件开发成本和软件故障而造成的经济损失也在增加,软件质量问题,正成为制约计算机发展的关键因素。
1.一个连续的过程改进系统,其目标在于开发一个看的见的、可重复的和可度量的软件过程。
2.第一步完成后才可启动。这一步将检查影响过程的其他因素,并优化这些因素对过程的影响。
3.关注软件产品的用户,是通过检查用户使用产品的方式,而导致产品本身的改进和潜在地改进产品的生产过程。
4.第4步将管理者的注意从当前的产品上移开并拓宽,通过观察产品的市场用途,来寻找产品在相关领域中的发展机会。
系统、部件或者过程满足规定需求的程度
系统、部件或者过程满足顾客或者用户需要或期望的程度。
该定义相对客观,强调了产品(或服务)和客户/社会需求的一致性。
ANSI关于软件质量的定义:
按照ANSI(美国国家标准学会)在1983年的标准陈述,软件质量定义为“与软件产品满足规定的和隐含的需求的能力有关的特征和特性的全体”
· 软件产品中能满足用户给定需求的全部特性的集合,
· 软件具有所期望的各种属性组合的程度。
· 用户主观得出的软件是否满足其综合期望的程度。
· 决定所用软件在使用中满足其综合期望程度的软件合成特性。
6个主要特征
功能性:软件实现的功能达到要求的和隐含的用户需求以及设计规范的程度。
可靠性:软件在指定条件和特定时间段内维持性能的能力程度。
易使用性:用户使用该软件所付出的学习精力。
效率:在指定条件下,软件功能与所占用资源之间的比值。
可维护性:当发现错误、运行环境改变或客户需求改变时,程序能修改的容易程度。
可移植性:将软件从一种环境移入另一种环境的容易程度。
软件质量保证和测试的关系
质量保证+测试=好的软件
软件质量的特征,是每个人在某种条件之下需要它,每个人都觉得自己理解它,却又不愿意解释它。
质量保证(开发过程改进、防止缺陷出现)
测试(寻找缺陷、在用户之前找到缺陷)
质量保证和质量控制
软件质量保证(SQA):
一种有计划的,系统化的行动模式,它是为想木或者产品符合已有技术需求提供充分信任所必须的。
设计用来评价开发或者制造产品的过程的一组活动,与质量控制有区别。
1983IEEE在提出的软件测试文档标准中对软件测试进行了准确的定义:
· 软件测试是使用人工或自动手段来运行或者测定某个系统的过程,检验它是否满足规定的需求或者弄清预期结果与实际结果之间的差别。
IEEE在1990年颁布的软件工程标准术语集中沿用了这一概念,该概念非常明确的提出了软件测试以检验是否满足需求为目标。
其次,在对经典论著《软件测试的艺术》中,对软件测试提出以下观点:
测试是程序的执行过程,目的在于发现错误,
一个好的测试用例可以发现至今尚未发现的错误,
一个成功的测试能发现至今未发现的错误。
程序员:理解系统,但是,只进行温柔测试,并由“交付”驱动。
独立的测试员:必须向系统学习,但是会尽力破坏系统,并由质量驱动。
静态方法和动态方法
黑盒测试、白盒测试和灰盒测试
基于软件开发阶段的测试方法
需求测试
单元测试
集成测试
性能测试
压力测试
容量测试
配置测试
回归测试
安装测试
安全性测试
白盒测试工具
功能测试工具
负载压力测试工具
测试管理工具
修复软件缺陷的费用,有随时间增加的趋势。
计算机科学需要经过科学手段、大量的数据、可重复的深入研究,而不能靠投机取巧,获得一些肤浅的、无用的、无法重复实现的简单结果。
软件测试工程师必备的素质:口头和写作技能、激情、技能、分析能力、态度、生产率。
传统软件人才的特点 | 创新软件人才的特点 |
---|---|
敢冒风险 | 敢冒风险 |
有雄心壮志 | 有雄心壮志 |
能学习,适应新环境 | 能学习、适应新环境 |
实事求是的作风 | 创新精神 |
有克服困难的毅力 | 如果对问题有兴趣,则有热情、有主动性 |
扎实的理论基础,尤其是数学 | 独立从事研究的能力 |
很强的编程能力 | 题目想得远、做的深 |
讲纪律、讲服从 | 对什么事情都有主见 |
对许多事情都没有主见,即使有想法也不敢说 | 直截了当地沟通甚至批评和争论 |
研发方法的差别
创新研发方法 | 非创新研发方法 |
---|---|
想着做事情 | 坐着想事情 |
经过科学手段、大量的数据、可重复的深入研究 | 肤浅的、无用的、无法扩张的简单结果 |
研究、理解、借用别人的结果 | 不看别人的研究,只抄袭别人的研究成果 |
经过亲自的设计工程原型,证实对用户有用 | 理论的、没用的纸上谈兵 |
承认失败,从头开始 | 不承认失败,永无止境地延续研究 |
现代软件研发对软件人才提出的要求
专业基础和创新能力
具备主人翁精神
良好的团队精神
从错误中学习的能力
软件测试员是探索者
软件测试员是故障排除员
软件测试员不放过蛛丝马迹
软件测试员具有创造性
软件测试员是追求完美者
软件测试员判断准确
软件测试员注重策略和外交
软件测试员善于说服
可以用逢山开道,遇水搭桥来形容软件测试员的特点
软件测试:
测试员 | 测试分析师 | 高级测试分析师 | 团队领导 | 测试顾问 | 高级测试顾问 | 首席顾问 |
---|---|---|---|---|---|---|
入门级工作,负责测试执行 | 负责声明周期测试,计划、设计、执行测试 | 展示主题、技术专长,在测试团队中充当主角 | 领导测试团队,确保策略在客户端被实现和承担 | 管理测试团队、作者,实现测试策略,监管和汇报进度 | 管理多个团队和项目,准备现实的、可实现的项目计划和策略 | 领导复杂项目,定义、实现测试策略,在客户、员工支持、开发中充当要职。 |
软件质量保证是建立一套有计划,有系统的方法,来向管理层保证拟定出的标准、步骤、实践和方法能够正确地被所有项目采用。
· 目的是使软件过程对于管理人员来说是可见的。
· 通过对软件产品和活动进行评审和审计来验证软件是否合乎标准的。软件质量保证组在项目开始时就一起参与建立计划、标准和过程。这些将使软件项目满足机构方针的要求。
软件测试是利用测试工具按照测试方案和流程对产品进行功能和性能测试,甚至根据需要编写不同的测试工具,设计和维护测试系统,对测试方案可能出现的问题进行分析和评估。测试执行用例后,需要跟踪故障,以确确保开发的产品适合需求。