【软件工程】第七章

时间:2024-06-13 11:44:10

重难点

Ø结构化程序设计的原则和风格

Ø软件测试的目的和原则

Ø白盒测试、黑盒测试的定义

Ø熟练掌握白盒测试中各种逻辑覆盖的基本思想

Ø熟练掌握黑盒测试中等价划分、边界值分析方法

Ø软件测试策略中单元测试、集成测试、确认测试和平行运行的相关概念及方法

Ø程序调试步骤和几种程序调试方法、过程

1 编码  p146

2 软件测试基础 p149

2.1 软件测试的目标

1.目的: p150

(1)为了发现程序中的错误而执行程序的过程(定义)

(2)好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案

(3)成功的测试是发现了至今为止未发现的错误的测试 

 2.对象:整个软件定义+开发期的所有产品

3.测试用例:通常指测试数据和预期的输出结果

 2.2 软件测试准测

1 )所有测试都能追溯到用户需求

2 )应该远在测试开始之就制定出测试计划

3 )应该把 Pareto原理应用到软件测试中

Ø群集现象: 80 %的错误可能是由 20 %的模块造成的

 4 )从“规模”测试开始,逐步过渡到“大规模”测试

5 )穷举测试是可能的

Ø测试只能证明程序有错,不能证明程序没有错误

6 最好由独立的第三方从事测试工作

2.3 测试方法 

静态测试动态测试

Ø静态测试是指被测程序不在机器上运行,采用人工检测和计算机辅助静态分析的手段对程序进行检测。

Ø动态测试是指通过运行程序发现错误, 又分黑盒法白盒法两种。

Ø 已知产品应该具有的 功能 ,可以通过 黑盒测试 来检验每个功能是否符合设计要求。
Ø 已知产品的 内部工作过程 ,可以通过 白盒测试 来检验每种内部操作是否按要求的规定正常进行。 

2.4  测试步骤  p151

Ø单元(模块)测试

Ø集成测试(子系统和系统测试)

Ø确认(验收)测试

Ø平行运行

单元测试:检查各个程序模块是否有错误,能发现编码和详细设计的错误。 

集成测试:测试模块(子系统)接口,发现总体设计和需求说明的错误。 

确认测试:检查软件是否满足用户的需要以及文档资料是否完整、准确 

平行测试:同时运行新、旧系统 

2.5 测试阶段的信息流 

软件开发过程是一个自顶向下,逐步细化的过程

软件测试则是依相反顺序自底向上,逐步集成的过程。

3 单元测试 

3.1 测试重点

 

1. 模块接口

检查这些参数: 参数的数目、次序、属性或单位系统与变元是否一致,是否修改了只做输入用的变元,全局变量的定义和用法在各个模块中是否一致

2.局部数据结构 

Ø不正确或不一致的数据类型说明

Ø使用尚未赋值或尚未初始化的变量

Ø错误的初始值或错误的缺省值

Ø变量名拼写错或书写错

Ø不一致的数据类型

Ø全局数据对模块的影响

 3.重要的执行通路

测试用例要适当

4.错误处理测试

着重测试以下可能发生的错误:

Ø出错的描述是否难以理解

Ø出错的描述是否能够对错误定位

Ø显示的错误与实际的错误是否相符

Ø对错误条件的处理正确与否

Ø在对错误进行处理之前,错误条件是否已经引起系统的干预等

5.边界测试:重点检查刚好等于、大于或小于边界值的数据

3.2 代码审查  p154

 审查小组:组长、程序的设计者、程序的编写者、程序的测试者

3.3 计算机测试 p155

单元测试通常在编码阶段进行,常用机器测试,即通过运行模块来发现问题

两个重要概念:

(1)驱动程序:相当于被测试模块的主程序,接收测试数据,把这些数据传送给被测试的模块,并且输出相关结果

(2)存根程序:代替被测试模块所调用的模块,不需要具有子模块所有的功能,但不允许什么事情也不做(一般显示输入参数的值)

 

 

 4 集成测试

集成测试是测试和组装软件的系统化技术,子系统测试即是在把模块按照设计要求组装起来的同时进行测试,主要目标是发小与接口有关的问题

(1)数据穿过接口可能会丢失

(2)一个模块对另一个模块可能由于疏忽造成的不利影响

(3)各子功能组合起来,能否达预期要求的父功能

(4)全局数据结构是否有问题

(5)单个模块的误差积累起来,是否回放大至不能接受的程度

 集成测试和两种方式

非渐增式组装方式对每个模块分别进行单元测试,再把所有模块组装成一个完整的系统进行的测试,从而得到要求的软件系统。

② 渐增式组装方式先对模块进行单元测试,然后将测试后的模块逐步组装成较大的系统;在组装的过程中边连接边测试,以发现连接过程中产生的问题;最后组装成为要求的软件系统。

渐增式组装方式的三种类型:自顶向下的渐增方式、自底向上结合的渐增方式、混合渐增测试 

 4.1 自顶向下集成 p157

 不需要驱动模块,只需要存根模块。

(1)深度优先组装的例子

 

 (2)步骤:

1)对主控制模块进行测试,测试时用存根程序代替所有直接附属于主控制模块的模块

2)根据选定的结合策略(深度优先或宽度优先),每次使用一个实际模块带换一个存根程序 

3)在结合进一个模块的同时进行测试

4)为了保证加入的模块没有 引进新的错误,可能需要进行回归测试

(3)优缺点

优点:

Ø能在早期验证主要的控制和判断点。

Ø选用按深度方向组装的方式,可以首先实现和验证一个完整的软件功能。

缺点:

使用了存根程序,但存根程序无法向上返回真实的数据流,使上层模块的测试不够充分、真实

4.2 自底向上的测试方式 p159 

 不再需要存根程序,只需要驱动模块。

 

 

4.3 两种混合策略 

1)改进的自顶向下的集成测试

Ø基本以自顶向下为主;

Ø在早期,就对关键模块采用自底向上策略进行集成测试;

2)混合法

Ø上层模块采用自顶向下;

Ø下层模块采用自底向上。

5 确认测试 

又称验收测试。验证软件的功能、性能及其它特性是否与用户的要求一致。

确认测试的基础 :软件需求规格说明书

确认测试的主要工作:有效性测试与软件配置审查

主要参与人员:以用户为主

5.1 确认测试的范围

 通常采用黑盒测试,验证被测软件是否满足用户需求。

5.2 软件配置复查

目的:保证软件配置的所有成分都齐全;

           各方面的质量都符合要求;

           具有维护阶段所必需的细节;

           而且已经编排好分类的目录。

 5.3 α测试和β测试

α测试:由用户在开发者的场所在开发者指导下进行的(受控)测试。

β测试:由最终用户在实际使用环境下进行的测试,这些用户定期返回有关错误信息给开发者。

注意:只有当α测试达到一定的可靠程度时,才开始 β 测试。

6 白盒测试技术 

 测试方案包括:具体的测试目的、应该输入的测试数据和预期的结果

白盒测试技术主要包括:逻辑覆盖,控制结构测试

 6.1 逻辑覆盖

 p162

逻辑覆盖是以程序内部的逻辑结构为基础设计测试用例的技术。

语句覆盖、判定覆盖;条件覆盖;判定/条件覆盖;条件、组合覆盖;点覆盖;边覆盖;路径覆盖

重点,仔细看书 

 

6.2 控制结构测试

1 、基本路径测试

以环形复杂度为基础,导出基本可执行路径的集合,以此设计测试用例的方法。

测试用例要保证程序的每个可执行语句至少执行一次每个判定的真假都执行一遍

基本测试路径的步骤

1)导出流图,并计算环形复杂度

2)根据环形复杂度确定程序的独立路径

3)设计测试用例,测试每条独立路径

什么是独立路径?

流图中,一条独立路径是至少包含一条在其它独立路径中从未有过的边的路径。

独立路径条数是确保程序中,每个可执行语句至少能被执行一次所必需的测试用例数目的上界。

独立路径条数程序环路复杂度 V ( G )

 

 

上图独立路径:

Ø 1-3-7
Ø 1-3-5-7
Ø 1-2-5-7
Ø 1-2-4-2-5-7
Ø 1-2-4-6-7

基本路径测试举例:

 计算不超过100个在规定值域内有效数的平均值;同时计算有效数字的总和及个数。

(1)画出流图

 

 (2)计算环形复杂度

V=区域数=6

V=17(e)-13(n)+2=6

V=5(判定节点)+1=6

(3) 确定线性独立路径基本集合

path1:  1-2-10-11-13

path2:  1-2-10-12-13

path3:  1-2-3-10-11-13

path4:  1-2-3-4-5-8-9-2-…

path5:  1-2-3-4-5-6-8-9-2-…

path6:  1-2-3-4-5-6-7-8-9-2-…

2、循环测试  p170

 

 (1)简单循环

① 零次循环:从循环入口直接跳到循环出口。

② 一次循环:查找循环初始值方面的错误。

③ 二次循环:检查在多次循环时才能暴露的错误。

m次循环:此时的mn

⑤ 最大次数循环、比最大次数多一次循环、比最大次数少一次的循环。

(2)嵌套循环

①从最内层循环开始,置所有其它层循环为最小值

 ② 对最内层循环做简单循环的全部测试。

 ③ 逐步外推,测试时保持所有外层循环变量取最小值,其它嵌套内层循环变量取“典型”值。

④ 反复进行,直到所有各层循环测试完毕。

 (3)连锁循环

Ø各个循环互相独立,可用与简单循环相同方法进行测试。

Ø几个循环不是互相独立,需要使用测试嵌套循环。

4)非结构化循环

使用结构化程序设计方法重新设计

7 黑盒测试 

 7.1 等价划分

 把所有可能的输入数据(包括有效或无效的),划分成若干数据类(等价类),然后从每个数据类中选取少数有代表性的数据做为测试用例。

等价划分类力图设计出能发现若干类程序错误的测试用例,从而减少必须设计的测试用例的数目

例:某城市电话号码由三部分组成:

地区码:空白或 3 位数字
前    缀:非‘ 0 ’非‘ 1 ’开头的四位数字
后    缀: 4 位数字

 

 

 

7.2 边界值分析

边界是指,对于输入和输出等价类而言,稍高和稍低于其边界值的一些特定情况。

经验得知大量的错误是发生在输入或输出范围的边界上,而不是在输入范围的内部。

边界值分析方法思想:确定边界之后,选取正好等于刚刚大于刚刚小于边界的值做为测试数据,而不是选取等价类中典型值或任意值做为测试数据。

通常总是与等价划分技术联合使用,是等价划分方法的补充。

 

 7.3 错误推测

容易出错的情况,如:

Ø 输入数据或输出数据为零
Ø 输入或输出数目为零(如表空或只 1 项) 
Ø 缺省值
Ø 空白
Ø 空值       
Ø 多个数据的组合效应
Ø 错误的群集现象( 二八定律

8 调试  p176

软件调试(也称为纠错)作为成功测试的后果出现,是在测试发现错误之后排除错误的过程。

调试活动的组成部分:

l 确定程序中可疑错误的确切性质和位置。
l 对程序(设计,编码)进行修改,排除这个错误。

9 软件可靠性 

7 .9. 1 基本概念

1、什么是软件可靠性?

程序在给定的时间间隔内,按照规格说明书的规定成功地运行的概率。

随着运行时间的增加,运行时出现程序故障的概率也将增加,即可靠性随着给定的时间间隔的加大而减少

IEEE规定:

“错误” 由开发人员造成的软件差错bug

 “故障” 由错误引起的软件的不正确行为。

2 、什么是软件可用性?

是程序在给定的时间点,按照规格说明书的规定,成功地运行的概率。

 3 、可靠性和可用性的主要差别:

可靠性意味着0 t 这段时间间隔内系统没有失效;

可用性只意味着在时刻 t ,系统是正常运行的

 

9.2 估算平均无故障时间的方法

 平均无故障时间

估算错误的方法

1)植入错误法

在测试之前由专人在程序中随机地植入一些错误,测试之后,根据测试小组发现的错误中原有的植入的两种错误的比例,来估计程序中原有错误的总数 ET

 

2)分别测试法

两个测试员彼此独立测试同一个程序的两个副本,把其中一个测试员发现的错误作为有标记的错误。

B0: 程序中原有的残留错误数

B1: 1号测试员在某一时间内发现的错误数

B2: 2号测试员在同一时间内发现的错误数

bc: 两位测试员共同发现的错误数