一 软件工程要点
1.软件概念:程序+数据+文档
(1) 当运行时,能够提供所要求功能和性能的指令或计算机程序集合
(2) 该程序能够具有满意地处理信息的数据结构
(3) 描述程序功能需求以及程序如何操作和使用所要求的文档
2.软件特性:
(1) 软件是一种逻辑实体,具有抽象性
(2) 软件没有明显的制造过程
(3) 软件在使用过程中没有老化、磨损的问题,但有退化问题
(4) 软件对硬件和环境有着不同程度的依赖性
(5) 软件的开发至今尚未完全摆脱手工作坊式的开发方式,生产效率低
(6) 软件是复杂的。而且以后更复杂
(7) 软件的成本相当昂贵
(8) 软件工作涉及很多社会因素
3.什么是软件危机?
软件危机是指在计算机软件的开发和维护的过程中所遇到的一系列严重问题
4.软件危机的产生原因?
(1)与软件本身的特点有关
(2)与软件的开发人员有关
软件生产的这种知识密集型和人力密集的特点是造成软件危机的根源所在。
具体原因如下:
(1) 对用户的需求不明确
(2) 缺乏正确的理论指导
(3) 软件开发规模越来越大
(4) 软件开发复杂度越来越高
5.如何消除软件危机
(1)组织管理:工程项目管理方法
(2)技术措施:软件开发技术、方法与软件工具
具体办法:
(1)对计算机软件有一个正确的认识(软件≠程序)
(2)充分认识到软件开发不是某种个体劳动的神秘技巧,而应该是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目
(3)推广使用在实践中总结出来的开发软件成功技术和方法
(4)开发和使用更好的软件工具
6.软件工程三要素:工具、方法、过程
7.软件生命周期模型?
瀑布模型、迭代模型、快速原型模型、螺旋模型、增量模型
8.敏捷开发:特点:变、早、快
- 敏捷开发是一种以用户的需求进化为核心、迭代、循序渐进的开发方法。
- 软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。
方法:
(1)XP(极限编程)
提倡测试先行,以将后面出现bug的概率降至最低
(2)Scrum
一种迭代的增量化过程,用于产品开发或工作管理
(3)Crystal Methos
以人为中心,不同类型的项目需要不同的实践方法
(4)FDD
针对中小型软件开发项目,采用模型驱动的快速迭代开发过程
(5)ASD
用于对需求多变、开发周期短项目的管理
(6)DSDM
倡导以业务为核心,快速而有效地进行系统开发
(7)轻量RUP
RUP其实是个过程的框架,它可以包容许多不同类型的过程,但核心还是OO过程
基本过程:
(1)策划 (2)设计 (3)编码 (4)测试
9.MVC:Model-View-Controller
实现模型有两种:JSP+JavaBeans
JSP+Servlet+JavaBeans
10.软件重用技术:
(1) 重用方式分类:
①依据重用的对象:产品重用、过程重用
②依据对可重用信息进行重用的方式:黑盒重用、白盒重用
(2)软件重用级别:代码的重用、设计的重用、分析的重用、测试信息的重用
11.软件配置管理(以下简称SCM,Software ConfigurationManagement)定义是指在开发过程中各阶段,管理计算机程序演变的学科。即配置管理是对产品进行标识、存储和控制,以维护其完整性、可追溯性以及正确性的学科。
(1)软件配置管理SCM 5个核心功能:
配置标识、版本控制、变更控制、配置状态统计、配置审核
(2)软件配置项(SCI):软件配置管理的对象
软件配置项SCI是SCM的基本单位 可以是:
①与合同、过程、计划和产品有关的文档和数据
②源代码、目标代码和可执行代码
③相关产品,包括软件工具、库内的可重用软件、外购软件及用户提供的软件
12.软件配置管理流程
(1)规划、调整网络开发环境
(2)设计配置管理库
(3)定义配置管理系统的角色
(4)制定配置管理流程(定制并行开发策略、发布版本管理)
(5)相关人员的培训(管理员、开发人员、管理流程)
(6)纠正企业在软件配置管理中存在的问题(文档和代码管理不善、项目的进度不明确、并行开发的手段缺乏、测试工作开展不规范)
13.软件配置管理工具功能:
(1)配置支持 (2)版本控制 (3)变更控制 (4)创建支持 (5)过程支持
(6)团队支持 (7)报告/查询 (8)审计控制 (9)其他功能(权限控制、人员管理、配置管理)
二 软件测试基础
1.测试工作量往往占软件开发总工作量的40%以上,在测试上的开销占30%到50%。
2.软件测试:软件测试就是在软件投入运行前。对软件需求分析、设计规格说明、编码的最终复查,是软件质量保证的关键步骤。
3.软件测试的原则:
(1)测试显示缺陷的存在
(2)穷尽测试是不可能的
(3)测试尽早介入
(4)缺陷集群性(80-20原则)
(5)杀虫剂悖论(一个好的测试用例具有较高的发现某个尚未发现的缺陷的可能性;一个成功的测试用例能够发现某个尚未发现的缺陷)
(6)测试活动依赖于测试背景
(7)足够好原则(good-enough)
4.测试与调试的区别:
调试是“建设性”的,测试是“破坏性”的
(1)调试(Debugging): 在源程序内定位错误、分析错误的原因、修改错误 、在程序运行时检验程序功能
(2)测试(Testing): 诱发错误、 重现错误 定位错误(功能·需求·模块)、记录错误
5.V模型和W模型的区别
V模型是软件开发瀑布模型的变种,软件开发完了之后才开始测试活动。
W模型是在V模型的基础上,增加了开发阶段的同步测试,测试活动伴随着软件开发活动,和软件开发同时开展,W模型更加敏捷,对于软件的交付期和品质的保证能力更强。
三 基于生命周期的软件测试
1.软件生命周期中各类软件测试的定义和概念
(1)质量控制:决软件产品正确性的过程和动作;一组功能基线,保证产品符合标准/需求所做的工作。
(2)缺陷:偏离规格说明,有三种表现形式——遗漏、错误和多余;用户不满意的任何事情,不管是否在规格说明书中规定。
(3)验证:在整个软件生命周期中的全部质量控制活动,确保交付的中间产品符合输入规格说明。
(4)确认:软件生命周期中的测试阶段,保证最终产品符合规格说明。
(5)静态测试:在系统编码之前进行的验证。
(6)动态测试:在系统编码之后进行的验证和确认。
(7)单元测试:对单一独立的模块或编码单元进行的测试。
(8)集成测试:对一组模块进行的测试,确保模块之间的数据和控制能正常传递。
(9)系统测试:预先确定的测试组合,当执行成功时,系统符合需求。
(10)验收测试:保证系统符合最终用户要求的测试。
(11)回归测试:在系统改变后进行的测试,以确保不希望的变化不引入系统。
(12)功能测试:认为系统应该做什么的业务需求测试。
(13)结构测试:确认系统是如何实现的系统结构测试。
(14)黑盒测试:数据驱动的、基于外部规格说明而无须了解系统是如何构造的测试。
(15)白盒测试:逻辑驱动的、基于编码内部的结构和逻辑测试。
2.详细说明软件工程生命周期V形图的含义:
(1)需求分析阶段对应生成需求规格说明书,对应测试生成系统测试方案,即为系统测试准备的,该阶段已经完成了单元测试和集成测试,主要是对软件产品的功能与非功能进行测试,几乎不测试代码,所以测试方法以黑盒为主;
(2)概要设计阶段对应生成概要设计说明书,对应测试生成集成测试方案,该阶段已完成单元测试,是将各个功能模块组装起来进行的测试,所以也叫组装测试。主要看模块调用是否正常,接口是否可用,数据传输是否正确等,所以用到的测试方法几乎是白盒的方法,如路径覆盖,条件组合覆盖等;
(3)详细设计阶段对应生成详细设计说明书,对应测试生成单元测试方案,该阶段是开发人员编码后的第一个测试阶段,是对开发出来的单独模块进行测试,以确保每一个功能模块的功能正常,可以构建桩模块和驱动模块来回调用,方法也是以白盒为主。
(4)白盒测试的准则是尽可能覆盖程序内部的逻辑结构,黑盒则是尽可能覆盖所有的输入输出接口,包括文档等一些静态的测试。除常用的测试方法外,仍需补充大范围的随机测试,尽可能达到覆盖率100%
四 软件测试分类与分级
1.计算机软件配置项缩写为CSCI。
2.软件测试分级:
(1)单元测试(组件测试)
(2)集成测试(组装测试或联合测试)
(3)配置项测试(软件合格性测试或确认测试)
(4)系统测试
(5)验收测试
(6)维护测试
3.错误级别划分:
GB/T:
第1级错误、第2级错误、第3级错误、第4级错误、第5级错误
GB/T实例化:
第1级:严重缺陷
第2级:较严重缺陷
第3级:一般性缺陷
第4级:较小缺陷
第5级:其他缺陷
五 软件缺陷管理
1.软件缺陷的定义:
一般符合下列5个规则之一,就是软件缺陷
- 软件未实现产品说明书要求的功能
- 软件出现了产品说明书指明不应该出现的错误
- 软件实现了产品说明书未提到的功能
- 软件未实现产品说明书虽未明确提及但应该实现的目标
- 软件难以理解、不易使用、运行缓慢或者——从测试员的角度看——最终用户会认为不好
2.软件缺陷与软件错误的关系:
(1)软件缺陷是存在于软件(文档、数据、程序)之中的那些不希望或不可接受的偏差,如少一个逗号、多一语句等。
(2)软件错误是指在软件生存期内的不希望或不可接受的人为错误,相对于软件本身,是一种外部行为,其结果是导致软件缺陷的产生。
3.软件缺陷包括:检测缺陷、残留缺陷
4.软件缺陷分类:
(1)Putnam分类法:
①需求缺陷 ②设计缺陷 ③文档缺陷
④算法缺陷 ⑤界面缺陷 ⑥性能缺陷
(2)军标分类法: ①程序错误 ②文档错误 ③设计错误
(3)Thayer分类法
(4)IEEE分类法
(5)正交缺陷分类法
5.缺陷的严重程度等级:Critical、Major 、 Minor 、Cosmetic 、Other
6.缺陷密度:
缺陷密度=已知的缺陷数/产品规模(文档页、代码行、功能点)
7.缺陷率(一定时间范围内的缺陷数与错误几率)
缺陷清除率=已发现的缺陷/潜在的缺陷(已发现的缺陷+以后发现的缺陷)
8.整体缺陷清除率:
F:功能点 D1:已发现的缺陷 D2:发布后发现的缺陷 D: 发现的总缺陷数 D=D1+D2
- 质量=D2/F
- 缺陷注入率=D/F
- 整体缺陷清除率=D1/D
9.阶段性缺陷清除率
缺陷清除有效性DRE:
(开发阶段清除的缺陷数/产品潜伏的缺陷总数)x100%
估计方法:
当前阶段的潜伏缺陷数=本阶段发现的缺陷数/(本阶段入口存在的缺陷数+本阶段注入的缺陷数)x100%
六 软件测试过程及测试过程管理
1.软件测试过程模型:V模型、W模型、H模型、X模型、前置测试模型
(1)V模型:低层测试是为了源代码的正确性,高层测试是为了使整个系统满足用户的需求。单元测试和集成测试是验证程序设计,系统测试验证系统设计。
(2)W模型:V模型的局限性在于没有明确地说明早期的测试,不能体现“尽早地和不断地进行软件测试”的原则。W模型增加了软件各开发阶段中应同步进行的验证和确认活动。
(3)H模型核心思想:软件测试是一个独立的流程;贯穿产品的整个生命周期,与其他流程并发进行;软件测试要尽早准备、尽早执行;软件测试分层次进行的,不同层次的测试按照某个次序先后进行,也可以重复进行。
- V模型与W模型的局限性:串行活动,无法更好的适应变更;
- 线性的前后关系,无法有效进行迭代;测试完整性不足
2.软件测试过程度量指标:
(1)测试覆盖率=已设计测试用例的需求数/需求总数
(2)测试执行率=已执行的测试用例数/设计的总测试用例数
(3)测试执行通过率=执行结果为“通过”的测试用例数/实际执行的测试用例数
(4)缺陷解决率=已关闭的缺陷/缺陷总数
3.软件能力成熟度模型CMM
4.测试能力成熟度模型TMM:
①初始级 ②定义级 ③集成级 ④管理和测量级 ⑤优化、预防缺陷和质量控制级
七 软件静态测试
1.静态测试定义:
通常是指不执行程序代码而寻找代码中可能存在的错误或评估程序代码的过程。
2.静态测试特点:
(1)不必动态地执行程序,也就是不必进行测试用例的设计和测试结果的分析
(2)可以手工执行,充分发挥人的思维优势;
(3)不需要特定的条件,容易展开
(4)对测试人员具有较高的要求,至少具有编程经验。
3.静态测试的各阶段主要包括:
各阶段的评审、代码检查、程序分析、软件质量度量
4.各阶段的评审:培训评审、预备评审、同行评审
(1)同行评审:审查、小组评审、走查、同级桌查、临时评审(正式程度由高到低)
(2)代码检查:技术评审、代码审查、代码走查、桌面检查(正式程度由高到低)
①技术评审:最正式的审查类型,具有高度的组织化,要求每一个参与者都接受训练
②代码审查:代码审查组由组长、资深程序员、程序编写者与专职测试人员等,组长不能是被测程序的编写者
③代码走查:代码走查的讨论过程是非正式的
④桌面检查:程序员自己检查自己所编写的程序
5.代码编程规范检查中的语句要求:
(1)禁用goto语句,goto语句使程序的流程无规律,可读性差
(2)New和delete要成对出现,new用来分配一块新的内存,delete用来释放一块内存,否则,造成资源的浪费
(3)对switch语句中的每一个分支都要以break语句结尾
(4)指针要初始化,释放内存后的指针变量要赋null值
6.代码结构分析(课本228页)
(1)函数调用关系图
(2)模块控制流图:很直观发现程序中的问题 四点要求:程序中不应该包含:
- 转向并不存在的标号;
- 没有用过的语句标号;
- 从程序入口进入后无法达到的语句;
- 不能到达停止语句的语句
(3)模块数据流图:控制流图及其定义和引用的变量
如:变量被定义,却从来没有使用;所使用的变量没有被定义;变量在使用之前被定义了两次
7.软件复杂性度量:
(1)模块复杂性(模块内部结构复杂性、模块接口复杂性):常用模块的扇入和扇出数量来度量。
模块的扇入是指有多少个上级模块调用它,扇出是指模块的直属下层模块的个数。
(2)总体复杂性度量
8.软件复杂性度量元:
(1)规模:总共的指令数或源程序行数(规模度量元Line Count复杂度)
(2)难度:由程序中出现的操作数的数目所决定的量来表示
例如:难度度量元Halstead复杂度(课本239页)
(根据程序中可执行代码行的操作数和操作符的数量来计算程序的复杂性)
(3)结构:用于程序结构有关的度量来表示
例如:结构度量元McCabe复杂度
McCabe圈复杂度计算方式:
①弧数m与节点数n的差再加上分离部分的数目p:V(G)=M-N+P(P一般为1)
②等于程序图中判定节点的数目+1
③等于强连通程序图在平面上围成的区域个数
(4)智能度:算法的难易程度
9.全面质量管理TQM 基本方法概括为:
一个过程(企业管理)
四个阶段:
(1)计划( Plan )阶段
(2)执行(Do)阶段
(3)检查(Check)阶段
(4)处理(Act)阶段
八个步骤和数理统计方法
八 动态测试
1.白盒测试:是一种按照程序内部逻辑结构和编码结构设计测试数据并完成测试的测试方法,又称为结构测试或逻辑驱动测试。
2.黑盒测试:又称为功能测试或数据驱动测试,是把测试对象当作看不见的黑盒子,在完全不考虑程序的内部逻辑结构和处理过程的情况下,测试者仅依据程序的功能需求规范考虑确定测试用例和推断测试结果的正确性。
3.逻辑覆盖(课本277页)
(1)语句覆盖:设计足够多的测试用例,使得程序的每条语句至少执行一次。
(2)判定覆盖 (分支覆盖):设计足够多的测试用例,使得程序中的每一个分支至少执行一次,即每一条分支语句的“真”值和“假”值都至少执行一次。
(3)条件覆盖:选择足够的测试用例,使得每个判断中的每个条件的可能取值至少满足一次。
(4)判定/条件覆盖:设计足够多的测试用例,使得判定中的每个条件的所有可能取值至少执行一次,同时每个判断的所有可能判定结果至少执行一次。换言之,就是要求各个判定的所有可能的条件取值组合至少执行一次。
(5)条件组合覆盖:设计足够多的测试用例,使得每个判定中条件的各种组合至少出现一次。
(6)路径覆盖:设计足够多的测试用例,使得程序中所有的路径都至少执行一次。
区别:判定覆盖只关心判定表达式的值(真/假),而条件覆盖涉及到判定表达式的每个条件的值(真/假)。
4.逻辑覆盖率计算方法:
覆盖率=(至少被执行一次的item数)/item总数
5.黑盒测试方法:
(1)等价类划分法:是把程序的输入域划分成若干部分,然后从每个部分中选取少数代表性数据当作测试用例。等价类是指某个输入域的子集合,在该子集合中,各个输入数据对于被测程序中的错误都是等效的,它们具有等价特性。测试某等价类的代表值就等效于对对这一类其他值的测试。分为:有效等价类和无效等价类。
(2)边界值分析法:是对等价类划分法的补充。是对输入的边界值进行测试。大量的错误发生在输入或输出范围的边界上,而不是发生在输入或输出范围的内部。最重要的工作是确定正确的边界值域,一般情况下,输入输出等价类的边界,就是应该着重测试边界情况,一般选取正好大于,刚刚大于,和刚刚小于边界值的数据作为测试数据。
(3)因果图(课本299页):等价类划分法和边界值分析法,都着重考虑输入条件,但未考虑输入条件之间的关系,因国图法充分考虑了输入情况的各种组合及输入同条件之间的相互制约关系。
(4)随机测试
(5)猜错法:基于经验和直觉推测程序中所有可能存在的各种错误,从而有针对性的设计测试用例的方法。
6.灰盒测试:一种软件全生命周期测试法,该方法通常是深入到用Ada/C/Fortran或汇编语言开发的嵌入式应用软件代码中进行功能的测试,或者与Web服务一起使用,是一种综合测试法,它将“黑盒”测试、“白盒”测试、回归测试结合在一起,构成一种无缝测试技术。
7.灰盒测试思想:
(1)基于程序运行时的外部表现同时又结合程序内部逻辑结构来设计用例,执行程序并采集程序路径执行信息和外部用户接口结果的测试技术
(2)其目的是验证软件满足外部指标以及软件的所有通道或路径都进行了检验
(3)通过该程序的所有路径都进行了检验和验证后,就得到了全面验证
8.对单元测试的误解:
(1)浪费的时间太多
(2)软件开发人员不应参与单元测试
(3)它仅仅证明代码做了什么
(4)我是很棒的程序员,我写的代码肯定没有问题
(5)不管怎样,集成测试或系统测试将会抓住所有的bug
(6)单元测试效率不高
9.单元测试的好处:
(1)单元测试将注意力集中在程序的基本组成部分
(2)单元测试可以平行开展
(3)单元规模小,复杂性低
(4)单元测试的测试效果是最显而易见的
(5)单元测试的好与坏直接关系到测试成本,也会直接影响到产品质量
10.单元测试的内容:
模块接口测试、局部数据结构测试、边界测试、错误处理测试、路径测试
(1)驱动模块:相当于被测模块的主程序,它接受数据,把这些测试数据传送给被测模块,最后再输出实测结果。
用于模拟被测单元的上层模块
(2)桩模块;由被测模块调用,用以替代由被测单元所调用的模块的功能。模拟被测单元执行过程中所调用的模块。
11.为什么要开展集成测试:
(1)在把各个单元模块连接起来时,穿越模块接口的数据是否会丢失
(2)一个单元模块的功能是否会对另一个单元模块的功能产生不利的影响
(3)各个子功能组合起来,能否达到预期要求的父功能
(4)全局数据结构是否有问题
(5)共享资源访问是否有问题
(6)单个模块的误差积累,是否会放大,从而达到不能接受的程度
(7)引入一个模块后,是否对其他与之相关的模块产生负面影响
12.集成测试方法:(集成测试:组装测试或联合测试,是在单元测试的基础上,按照技术要求将所有模块逐步配成高层次的功能模块进行测试,直到整个软件成为一个整体。)
(1)一次性组装方式(大爆炸集成方法)
(2)渐增式测试
①自顶向下集成测试方法:深度优先方法 、广度优先方法
②自底向上集成测试方法
(3)混合渐增式集成测试方法(三明治集成方法)
13.软件测试中的攻击:要寻找系统中最容易出现错误的地方进行测试,保证多快好省地找出错误,核心是基于故障模
型的测试用例设计。
14.软件故障模型:将测试员的经验和直觉尽量归纳和固化,使得可以重复使用。
15.典型的攻击方法:
(1)用户接口输入攻击(6种) (2)用户接口输出攻击(4种)
(3)用户接口数据攻击(3种) (4)用户接口计算攻击(4种)
(5)文件系统介质攻击(3种) (6)文件系统文件攻击(3种)
(7)操作系统和软件接口攻击(2种)
16.软件故障植入:
(1)基于模式的故障植入
(2)基于系统调用的故障植入