1、第第5 5章章 编码及测试编码及测试n 本章要点本章要点 程序设计语言的发展、分类及选择的标准程序设计语言的发展、分类及选择的标准 程序设计风格、效率及安全程序设计风格、效率及安全 程序复杂度及其度量方法程序复杂度及其度量方法 软件测试的基本概念软件测试的基本概念 软件测试方法、步骤及工具软件测试方法、步骤及工具 测试设计和管理测试设计和管理2023-1-2515.1 5.1 程序设计语言程序设计语言5.1.1 5.1.1 程序设计语言的发展及分类程序设计语言的发展及分类 第一代语言是机器语言第一代语言是机器语言 第二代语言是汇编语言第二代语言是汇编语言 第三代语言是高级程序设计语言第三代语言
2、是高级程序设计语言 (1)(1)按应用特点分类:可以分为基础语言、通用的结构按应用特点分类:可以分为基础语言、通用的结构化程序设计语言、面向对象设计语言和专用语言四类。化程序设计语言、面向对象设计语言和专用语言四类。(2)(2)按语言内在特点分类:可分为系统实现语言、静态按语言内在特点分类:可分为系统实现语言、静态高级语言、块结构高级语言和动态高级语言高级语言、块结构高级语言和动态高级语言4 4类。类。第四代语言(第四代语言(4GL4GL)第五代语言第五代语言 2023-1-2525.1.15.1.1程序设计语言的发展及分类程序设计语言的发展及分类机 器 语 言 汇 编 语 言 按 应 用 特
3、高 级 程 序 设 计 语 言语 言 的 发 展 及 分 类基 础 语 言:FORTRAN、COBOL、BASIC、ALGOL 通 用 结 构 化 程 序 设 计 语 言:PASCAL、C、Ada 点 分 类:面 向 对 象 程 序 语 言:Smalltalk、C+、Java、Objective C、Eiffel专 用 语 言:APL、BLISS、FORTH、LISP、PROLOG 系 统 实 现 语 言:C 静 态 高 级 语 言:COBOL、FORTRAN 按 语 言 内 在 特 点 分 类:块 结 构 高 级 语 言:ALGOL、PASCAL动 态 高 级 语 言 查 询 语 言:Fox
4、Pro、Oracle 第 四 代 语 言:程 序 生 成 器 其 他 4GL:如 决 策 支 持 语 言、原 型 语 言、形 式 化 规 格 说 明 语 言 等第 五 代 语 言 2023-1-2535.1.2 5.1.2 选择程序设计语言的选择标准选择程序设计语言的选择标准 1 1理想标准理想标准 应该有理想的模块化机制,以及可读性好的控制结构应该有理想的模块化机制,以及可读性好的控制结构和数据结构,以使程序容易测试和维护,同时减少软件生和数据结构,以使程序容易测试和维护,同时减少软件生存周期的总成本。存周期的总成本。应该使编译程序能够尽可能多地发现程序中的错误,应该使编译程序能够尽可能多地
5、发现程序中的错误,以便于调试和提高软件的可靠性。以便于调试和提高软件的可靠性。应该有良好的独立编译机制,以降低软件开发和维护应该有良好的独立编译机制,以降低软件开发和维护的成本。的成本。2023-1-254 2 2实用标准实用标准 软件的应用领域软件的应用领域 系统用户的要求系统用户的要求 软件运行环境软件运行环境 可得到的软件工具可得到的软件工具 工程规模工程规模 软件可移植性要求软件可移植性要求 程序员的知识程序员的知识5.1.2 5.1.2 选择程序设计语言的选择标准选择程序设计语言的选择标准2023-1-2555.2 5.2 程序设计风格程序设计风格 源程序文档化源程序文档化 数据说明
6、的方法数据说明的方法 表达式和语句结构表达式和语句结构 输入和输出方法输入和输出方法 2023-1-2565.2.1 5.2.1 源程序文档化源程序文档化 1.1.标识符:包括模块名、变量名、常量名、标号名、函数名、标识符:包括模块名、变量名、常量名、标号名、函数名、程序名、过程名、数据区名、缓冲区名等。程序名、过程名、数据区名、缓冲区名等。2.2.注释注释 :分为序言性注释和功能性注释:分为序言性注释和功能性注释 。序言性注释通常在每个模块的开始,它给出程序的整体序言性注释通常在每个模块的开始,它给出程序的整体说明,对于理解程序具有引导作用,其主要内容有:说明,对于理解程序具有引导作用,其主
7、要内容有:(1 1)说明每个模块的用途、功能。)说明每个模块的用途、功能。(2 2)说明模块的接口:调用形式、参数描述及从属模块的清单。)说明模块的接口:调用形式、参数描述及从属模块的清单。(3 3)数据描述:重要数据的名称、用途、限制、约束及其他信息)数据描述:重要数据的名称、用途、限制、约束及其他信息 (4 4)开发历史:设计者、审阅者姓名及日期,修改说明及日期。)开发历史:设计者、审阅者姓名及日期,修改说明及日期。2023-1-257 功能性注释在源程序当中,它着重说明其后的语句功能性注释在源程序当中,它着重说明其后的语句或程序段的处理功能以及数据的状态。或程序段的处理功能以及数据的状态
8、。书写功能性注释,要注意以下几点:书写功能性注释,要注意以下几点:(1 1)用于描述一段程序,而不是每一个语句;)用于描述一段程序,而不是每一个语句;(2 2)用缩进和空行,使程序与注释容易区别;)用缩进和空行,使程序与注释容易区别;(3 3)注释要正确;)注释要正确;(4 4)有合适的,有助于记忆的标识符和恰当的注释)有合适的,有助于记忆的标识符和恰当的注释,就能得到比较就能得到比较好的源程序内部的文档;好的源程序内部的文档;(5 5)有关设计的说明,也可以作为注释,嵌入源程序体内。)有关设计的说明,也可以作为注释,嵌入源程序体内。5.2.1 5.2.1 源程序文档化源程序文档化2023-1
9、-258 3 3源程序的布局源程序的布局 常用方法有:常用方法有:(1 1)注释部分和程序部分之间,完成不同功能的程序段之)注释部分和程序部分之间,完成不同功能的程序段之间都可以用空行显式地隔开;间都可以用空行显式地隔开;(2 2)在注释部分周围加上边框;)在注释部分周围加上边框;(3 3)用分层缩进的写法显示嵌套结构层次;)用分层缩进的写法显示嵌套结构层次;(4 4)每行只写一条语句;)每行只写一条语句;(5 5)书写表达式时适当使用空格或圆括号作隔离符。)书写表达式时适当使用空格或圆括号作隔离符。5.2.1 源程序文档化源程序文档化2023-1-2595.2.2 5.2.2 数据说明数据说
10、明 1.1.数据说明的次序应规范。数据说明的次序应规范。2.2.当用一个语句说明多个变量名时,应当对这些变量按当用一个语句说明多个变量名时,应当对这些变量按 字母的顺序排列。字母的顺序排列。3.3.如果设计了一个复杂数据结构,应使用注释说明在实如果设计了一个复杂数据结构,应使用注释说明在实 现这个数据结构的特点。现这个数据结构的特点。2023-1-25105.2.3 5.2.3 表达式和语句结构表达式和语句结构 1.1.首先应考虑程序的清晰性和可读性。首先应考虑程序的清晰性和可读性。1)1)在编程时尽量一行只写一条语句;在编程时尽量一行只写一条语句;2)2)尽量采用简单明了的语句,避免过多的循
11、环嵌套;尽量采用简单明了的语句,避免过多的循环嵌套;3)3)同时注意,在条件结构或循环结构的嵌套中,分层次缩进,即逻辑同时注意,在条件结构或循环结构的嵌套中,分层次缩进,即逻辑 上属于同一个层次的互相对齐,逻辑上属于内部层次的推到下一个对上属于同一个层次的互相对齐,逻辑上属于内部层次的推到下一个对 齐位置,这样可以使程序的逻辑结构更清晰;齐位置,这样可以使程序的逻辑结构更清晰;4)4)在混合使用互相无关的运算符时,用加括号的方式排除二义性;在混合使用互相无关的运算符时,用加括号的方式排除二义性;5)5)将复杂的表达式分解成简单的容易理解的形式;避免浮点数的相等将复杂的表达式分解成简单的容易理解
12、的形式;避免浮点数的相等 的比较等;的比较等;6)6)程序中有一些诸如各种常数、数组的大小、字符位置、变换因子和程程序中有一些诸如各种常数、数组的大小、字符位置、变换因子和程 序中出现的其他以文字形式写出的数值,对于这些数值应命合适的名序中出现的其他以文字形式写出的数值,对于这些数值应命合适的名 字,有必要的话加以适当的注释,加强程序的可阅读性、理解性。字,有必要的话加以适当的注释,加强程序的可阅读性、理解性。2023-1-2511 2.2.尽可能使用库函数尽可能使用库函数 3.3.注意注意GOTOGOTO语句的使用语句的使用 4.4.使用层次结构,按照初始化或数据输入、数据处理、使用层次结构
13、,按照初始化或数据输入、数据处理、结果输出结果输出3 3部分安排层次结构。部分安排层次结构。5.2.3 5.2.3 表达式和语句结构表达式和语句结构2023-1-25125.2.4 5.2.4 输入和输出输入和输出n 在设计和程序编码时都应考虑下列原则:在设计和程序编码时都应考虑下列原则:对所有输入数据进行检验,从而识别错误输入,以保证每个对所有输入数据进行检验,从而识别错误输入,以保证每个数据的有效性。数据的有效性。检查输入项的各种重要组合的合理性,必要时报告输入状态检查输入项的各种重要组合的合理性,必要时报告输入状态信息。信息。使输入的步骤和操作尽可能简单,并保持简单的输入格式。使输入的步
14、骤和操作尽可能简单,并保持简单的输入格式。输入数据时,应允许使用自由格式输入。输入数据时,应允许使用自由格式输入。应允许默认值。应允许默认值。2023-1-2513 输入一批数据时,最好使用输入结束标志,而不要由用户指定输入输入一批数据时,最好使用输入结束标志,而不要由用户指定输入数据数目。数据数目。在以交互式方式进行输入时,要在屏幕上使用提示符明确提示交互在以交互式方式进行输入时,要在屏幕上使用提示符明确提示交互输入请求,指明可使用选择项的种类和取值范围。同时,在数据输入的过输入请求,指明可使用选择项的种类和取值范围。同时,在数据输入的过程中和输入结束时,也应屏幕上给出状态信息。程中和输入结
15、束时,也应屏幕上给出状态信息。当程序语言对输入格式有严格要求时,应保持输入格式与输入语句当程序语言对输入格式有严格要求时,应保持输入格式与输入语句要求的一致性。要求的一致性。给所有的输出加注解,并设计输出报表格式。给所有的输出加注解,并设计输出报表格式。5.2.4 5.2.4 输入和输出输入和输出2023-1-25145.3 5.3 程序效率程序效率5.3.1 5.3.1 代码效率代码效率n 当把详细设计翻译为代码时,遵循以下准则:当把详细设计翻译为代码时,遵循以下准则:(1 1)编码之前应先简化算术和逻辑的表达式。)编码之前应先简化算术和逻辑的表达式。(2 2)仔细研究嵌套的循环,以确定是否
16、有语句可以从)仔细研究嵌套的循环,以确定是否有语句可以从 内层往外移。内层往外移。(3 3)尽量避免使用多维数组。)尽量避免使用多维数组。(4 4)尽量避免使用指针和复杂的列表。)尽量避免使用指针和复杂的列表。(5 5)使用执行时间短的算术运算。)使用执行时间短的算术运算。(6 6)在表达式中尽量避免出现不同的数据类型。)在表达式中尽量避免出现不同的数据类型。(7 7)尽量位用整数表达式和布尔表达式。)尽量位用整数表达式和布尔表达式。对于一些对效率要求高的系统,可使用具有优化对于一些对效率要求高的系统,可使用具有优化 特性的编译程序自动生成目标代码。特性的编译程序自动生成目标代码。2023-1
17、-25155.3.2 5.3.2 存储器效率存储器效率 在微型计算机系统中,常采用生成目标代码较短且有紧缩在微型计算机系统中,常采用生成目标代码较短且有紧缩存储器性能的编译程序,必要时可采用汇编语言。存储器性能的编译程序,必要时可采用汇编语言。在大中型计算机系统中,对内存采取基于操作系统的分页在大中型计算机系统中,对内存采取基于操作系统的分页功能的虚拟存储管理。采用结构化程序设计,使每个模块功能的虚拟存储管理。采用结构化程序设计,使每个模块或一组密切相关模块的程序占用空间与每页容量相匹配。或一组密切相关模块的程序占用空间与每页容量相匹配。同时,提高程序执行效率也能提高存储器效率。同时,提高程序
18、执行效率也能提高存储器效率。2023-1-25165.3.3 5.3.3 输入输入/输出效率输出效率n 从编码角度看,提高输入从编码角度看,提高输入/输出效率的原则:输出效率的原则:所有输入所有输入/输出都应有缓冲,以避免过多的通信次数;输出都应有缓冲,以避免过多的通信次数;对于辅存对于辅存(如磁盘如磁盘)应选用简单有效的访问方法;应选用简单有效的访问方法;与辅存有关的输入与辅存有关的输入/输出应该以块为单位进行;输出应该以块为单位进行;与终端和打印机有关的输入与终端和打印机有关的输入/输出,应当考虑设备的特输出,应当考虑设备的特性,以提高输入性,以提高输入/输出的质量和速度;输出的质量和速度
19、;有的输入有的输入/输出方式尽管很高效,但难以被人们理解,输出方式尽管很高效,但难以被人们理解,也不应当采用;也不应当采用;简单、清晰的输入简单、清晰的输入/输出设计风格也是提高效率的关键输出设计风格也是提高效率的关键;2023-1-25175.4 5.4 编程安全编程安全提高软件质量和可靠性的技术大致可分为两类:提高软件质量和可靠性的技术大致可分为两类:一类是避开错误技术,即在开发的过程中不让差错潜入软件的技术。一类是避开错误技术,即在开发的过程中不让差错潜入软件的技术。另一类是容错技术,即对某些无法避开的差错,使其影响减至最小的另一类是容错技术,即对某些无法避开的差错,使其影响减至最小的技
20、术。技术。避错技术是进行质量管理,实现产品应有质量所不可少的技术,避错技术是进行质量管理,实现产品应有质量所不可少的技术,也就是软件工程中所讨论的先进的软件分析和开发技术和管理技术。也就是软件工程中所讨论的先进的软件分析和开发技术和管理技术。即使采用了避错技术,系统还是会发生故障,因此需要采用容错技术即使采用了避错技术,系统还是会发生故障,因此需要采用容错技术使得系统发生故障时,能自动恢复正常运行。使得系统发生故障时,能自动恢复正常运行。实现容错的主要手段是冗余和防错程序设计。实现容错的主要手段是冗余和防错程序设计。2023-1-25185.4.1 5.4.1 冗余程序设计冗余程序设计 在硬件
21、系统中,采用冗余技术是指提供额外的元件或系统,在硬件系统中,采用冗余技术是指提供额外的元件或系统,使其与主系统并行工作。使其与主系统并行工作。在软件系统中,采用冗余技术主要指提供足够的冗余信息在软件系统中,采用冗余技术主要指提供足够的冗余信息和算法程序。和算法程序。冗余设计在提高软件可靠性的同时,也增大了程序规冗余设计在提高软件可靠性的同时,也增大了程序规模和系统资源的耗费,因此需要在可靠性和资源耗费之间模和系统资源的耗费,因此需要在可靠性和资源耗费之间进行权衡。进行权衡。2023-1-25195.4.2 5.4.2 防错程序设计防错程序设计防错程序设计可分为主动式和被动式两种。防错程序设计可
22、分为主动式和被动式两种。主动式防错程序设计主动式防错程序设计 (1 1)内存检查)内存检查(2 2)标志检查)标志检查(3 3)反向检查)反向检查(4 4)状态检查)状态检查(5 5)连接检查)连接检查(6 6)时间检查)时间检查(7 7)其他检查)其他检查2023-1-2520 被动式防错程序设计被动式防错程序设计(1 1)来自外部设备的输入数据,包括范围、属性是否正)来自外部设备的输入数据,包括范围、属性是否正 确;确;(2 2)由其他程序所提供的数据是合正确;)由其他程序所提供的数据是合正确;(3 3)数据库中的数据,包括数组、文件、结构、记录是)数据库中的数据,包括数组、文件、结构、记
23、录是 合正确;合正确;(4 4)操作员的输入,包括输入的性质,顺序是否正确;)操作员的输入,包括输入的性质,顺序是否正确;(5 5)栈的深度是否正确;)栈的深度是否正确;(6 6)数组界限是否正确;)数组界限是否正确;(7 7)表达式中是否出现零分母情况;)表达式中是否出现零分母情况;(8 8)正在运行的程序版本是否是所期望的;)正在运行的程序版本是否是所期望的;(9 9)通过其他程序或外部设备的输出数据是否正确。)通过其他程序或外部设备的输出数据是否正确。5.4.2 5.4.2 防错程序设计防错程序设计2023-1-25215.5 5.5 结构化程序设计方法结构化程序设计方法 1 1、结构化
24、程序设计:、结构化程序设计:结构化程序设计的概念最早由结构化程序设计的概念最早由Edsger Wybe DijkstraEdsger Wybe Dijkstra提出,他在提出,他在19651965年召开的国际信息处理联合会年召开的国际信息处理联合会(International Federation for Information Processing(International Federation for Information Processing,IEIP)IEIP)上指出:上指出:“可以从高级语言中取消可以从高级语言中取消GOTOGOTO语句语句”,“程程序的质量与程序中包含的序的质量
25、与程序中包含的GOTOGOTO语句的数量成反比语句的数量成反比”。2023-1-25225.5 5.5 结构化程序设计方法结构化程序设计方法 2 2、结构化程序设计的原则、结构化程序设计的原则 :(1)(1)使用语言中的顺序、选择、重复等有限的基本控制结构使用语言中的顺序、选择、重复等有限的基本控制结构 表示程序逻辑。表示程序逻辑。(2)(2)选用的控制结构只允许有一个入口和一个出口。选用的控制结构只允许有一个入口和一个出口。(3)(3)程序语句组成容易识别的块,每块只有一个入口和出口。程序语句组成容易识别的块,每块只有一个入口和出口。(4)(4)复杂结构应该用基本控制结构进行组合嵌套来实现。
26、复杂结构应该用基本控制结构进行组合嵌套来实现。(5)(5)语言中没有的控制结构,可用一段等价的程序段模拟。语言中没有的控制结构,可用一段等价的程序段模拟。(6)(6)严格控制严格控制GOTOGOTO语句,仅在下列情形才可使用。语句,仅在下列情形才可使用。2023-1-2523 3 3、自项向下、逐步细化的设计方法、自项向下、逐步细化的设计方法 逐步细化的步骤可以归纳为如下的三步:逐步细化的步骤可以归纳为如下的三步:由粗到细地对程序进行逐步的细化,每一步可选择其中一由粗到细地对程序进行逐步的细化,每一步可选择其中一条或数条将它们分解为更多或更详细的程序步骤。条或数条将它们分解为更多或更详细的程序
27、步骤。在细化程序过程时,对数据的描述进行细化。在细化程序过程时,对数据的描述进行细化。每步细化均使用相同的结构语言,最后一步一般直接用伪每步细化均使用相同的结构语言,最后一步一般直接用伪码来描述。码来描述。5.5 5.5 结构化程序设计方法结构化程序设计方法2023-1-25245.5 5.5 结构化程序设计方法结构化程序设计方法2023-1-2525自顶向下、逐步求精方法的优点:自顶向下、逐步求精方法的优点:符合人们解决复杂问题的普遍规律,可提高软件开发的成功率和生产率。符合人们解决复杂问题的普遍规律,可提高软件开发的成功率和生产率。使程序具有清晰的层次结构,程序容易阅读和理解。使程序具有清
28、晰的层次结构,程序容易阅读和理解。程序自顶向下,逐步细化,分解成一个树形结构,在同一层的结点上做的细化程序自顶向下,逐步细化,分解成一个树形结构,在同一层的结点上做的细化工作相互独立。在任何一步发生错误,一般只影响它下层的结点,同一层其他结点工作相互独立。在任何一步发生错误,一般只影响它下层的结点,同一层其他结点不受影响。不受影响。程序清晰和模块化,使得在修改和重新设计一个软件时可复用的代码量最大。程序清晰和模块化,使得在修改和重新设计一个软件时可复用的代码量最大。每一步工作仅在上层结点的基础上做不多的设计扩展,便于检查。每一步工作仅在上层结点的基础上做不多的设计扩展,便于检查。有利于设计的分
29、工和组织工作。有利于设计的分工和组织工作。在编写结构化程序时,应注意以下几点:在编写结构化程序时,应注意以下几点:(1 1)使用语言中的顺序、选择、重复等有限的基本控制结)使用语言中的顺序、选择、重复等有限的基本控制结 构表示程序逻辑。构表示程序逻辑。(2 2)选用的控制结构只准许有一个入口和一个出口。)选用的控制结构只准许有一个入口和一个出口。(3 3)程序语句组成容易识别的块,每块只有一个入口和出)程序语句组成容易识别的块,每块只有一个入口和出 口。口。(4 4)复杂结构应该用基本控制结构进行组合嵌套来实现。)复杂结构应该用基本控制结构进行组合嵌套来实现。(5 5)语言中没有的控制结构,可
30、用)语言中没有的控制结构,可用段等价的程序段模拟。段等价的程序段模拟。(6 6)严格控制)严格控制GOT0GOT0语句,仅在下列情形才可使用:语句,仅在下列情形才可使用:用一个非结构化的程序设计语言来实现一个结构化用一个非结构化的程序设计语言来实现一个结构化 的构造。的构造。在某种可以改善而不是损害程序可读性的情况下。在某种可以改善而不是损害程序可读性的情况下。结构化程序设计的缺点,就是目标程序所需要的存结构化程序设计的缺点,就是目标程序所需要的存 储容量和运行时间都有一些增加。储容量和运行时间都有一些增加。5.5 5.5 结构化程序设计方法结构化程序设计方法2023-1-25264 4、主程
31、序员的组织形式、主程序员的组织形式 即开发程序的人员应采用以一个主程序员即开发程序的人员应采用以一个主程序员(负责全部技术负责全部技术活动活动)、一个后备程序员、一个后备程序员(协调、支持主程序员协调、支持主程序员)和一个程序管理和一个程序管理员员(负责事务性工作,如收集、记录数据,文档资料管理等负责事务性工作,如收集、记录数据,文档资料管理等)三三人为核心,再加上一些专家人为核心,再加上一些专家(如通信专家、数据库专家如通信专家、数据库专家)、其他、其他技术人员组成小组。技术人员组成小组。5.5 5.5 结构化程序设计方法结构化程序设计方法2023-1-25275.6 5.6 程序的复杂性及
32、度量程序的复杂性及度量 程序复杂性主要指模块内程序的复杂性。它直接关系到软程序复杂性主要指模块内程序的复杂性。它直接关系到软件开发费用的多少,开发周期的长短和软件内部潜伏错误的多件开发费用的多少,开发周期的长短和软件内部潜伏错误的多少。同时它也是软件可理解性的另一种度量。减少程序复杂性,少。同时它也是软件可理解性的另一种度量。减少程序复杂性,可提高软件的简单清晰性和可理解性,并使软件开发费用减少,可提高软件的简单清晰性和可理解性,并使软件开发费用减少,开发周期缩短,软件内部潜藏错误减少。开发周期缩短,软件内部潜藏错误减少。2023-1-25285.6.1 5.6.1 代码行度量法代码行度量法
33、度量程序的复杂性,最简单的方法就是统计程序的源度量程序的复杂性,最简单的方法就是统计程序的源代码行数。此方法的基本考虑是统计一个程序的源代码行代码行数。此方法的基本考虑是统计一个程序的源代码行数,并以源代码行数作为程序复杂性的度量。数,并以源代码行数作为程序复杂性的度量。2023-1-25295.6.2 McCabe5.6.2 McCabe度量法度量法 McCabe McCabe度量法度量法是由是由Thomas McCabeThomas McCabe提出的一种提出的一种基于程序控制流的复杂性度量方法。基于程序控制流的复杂性度量方法。McCabeMcCabe定义的程序定义的程序复杂性度量值又称环
34、路复杂度,它基于一个程序模块的程复杂性度量值又称环路复杂度,它基于一个程序模块的程序图中环路的个数,因此计算它先要画出程序图。序图中环路的个数,因此计算它先要画出程序图。2023-1-2530下面给出计算环路复杂性的方法。下面给出计算环路复杂性的方法。根据图论,在一个强连通的有向图根据图论,在一个强连通的有向图GG中,环的中,环的个数由以下公式给出:个数由以下公式给出:其中,是有向图其中,是有向图GG中环路数,是图中环路数,是图GG中弧数,是中弧数,是图图G G中结点数,是图中结点数,是图GG中的强连通分量个数。中的强连通分量个数。在一个程序中,从程序图的入口点总能到达图在一个程序中,从程序图
35、的入口点总能到达图中任何一个结点,因此,程序总是连通的,但不是中任何一个结点,因此,程序总是连通的,但不是强连通的。为了使图成为强连通图,从图的入口到强连通的。为了使图成为强连通图,从图的入口到出口加一条用虚线表示的有向边,使图成为强连通出口加一条用虚线表示的有向边,使图成为强连通图。这样可以使用上式计算环路复杂性。图。这样可以使用上式计算环路复杂性。()V Gmnp5.6.2 McCabe5.6.2 McCabe度量法度量法2023-1-2531利用利用McCabeMcCabe环路复杂度度量时,有几点说明:环路复杂度度量时,有几点说明:(1 1)环路复杂度取决于程序控制结构的复杂度。)环路复
36、杂度取决于程序控制结构的复杂度。(2 2)环路复杂度是可加的。)环路复杂度是可加的。(3 3)对于复杂度超过)对于复杂度超过1010的程序,应分成几个模块,使每个的程序,应分成几个模块,使每个模块复杂度小于模块复杂度小于1010。(4 4)这种度量的缺点:不区分不同种类的控制流的复杂性。)这种度量的缺点:不区分不同种类的控制流的复杂性。5.6.2 McCabe5.6.2 McCabe度量法度量法2023-1-25325.6.3 Halstead5.6.3 Halstead度量法度量法 当给出的源程序时,当给出的源程序时,HalsteadHalstead度量法根据其中的运算度量法根据其中的运算符
37、和操作数的总数来度量程序复杂性。符和操作数的总数来度量程序复杂性。它采用一组基本的度量值。它采用一组基本的度量值。其中其中n1n1表示程序中不同运算符表示程序中不同运算符(包括保留字包括保留字)的个数,令的个数,令n2n2表示程序中不同运算对象的个数,表示程序中不同运算对象的个数,N1N1为程序中实际出现为程序中实际出现的运算符总个数,的运算符总个数,N2N2为程序中实际出现的运算对象总个数。为程序中实际出现的运算对象总个数。运算符包括算术运算符、关系运算符、逻辑运算符、赋值符运算符包括算术运算符、关系运算符、逻辑运算符、赋值符(=(=或:或:=)=)、数组操作符、分界符、数组操作符、分界符(
38、,或;或:,或;或:)、于程序调用、于程序调用符、括号运算符、循环操作符等。符、括号运算符、循环操作符等。2023-1-2533(1 1)程序长度,即预测的)程序长度,即预测的HalsteadHalstead长度。长度。(2 2)实际的)实际的HalsteadHalstead长度长度(3 3)程序的词汇表)程序的词汇表(4 4)程序量)程序量 221 log12 log2Hnnnn12NNN12nnn2log12VNnn5.6.3 Halstead5.6.3 Halstead度量法度量法2023-1-2534(5 5)程序员工作量)程序员工作量(6 6)程序的潜在错误)程序的潜在错误(7 7)
39、HalsteadHalstead的重要结论之一:预测的的重要结论之一:预测的HalsteadHalstead长度长度HH与实际的与实际的HalsteadHalstead长度长度N N非常接近。非常接近。2log1212/22EHnnnNn212log12/3000BNNnn2023-1-2535HalsteadHalstead度量法的缺点:度量法的缺点:没有区别自己编的程序与别人编的程序。这是与实际经验相没有区别自己编的程序与别人编的程序。这是与实际经验相违背的。这时应将外部调用乘上一个大于违背的。这时应将外部调用乘上一个大于1 1的常数的常数Kf(Kf(应在应在1515之之间,它与文档资料的
40、清晰度有关间,它与文档资料的清晰度有关)。没有考虑非执行语句。补救办法:在统计没有考虑非执行语句。补救办法:在统计n1n1,n2n2,N1N1,N2N2时,可以把非执行语句中出现的运算对象,运算符统计在内。时,可以把非执行语句中出现的运算对象,运算符统计在内。在允许混合运算的语言中,每种运算符必须与它的运算对象在允许混合运算的语言中,每种运算符必须与它的运算对象相关。如果一种语言有整型、实型、双精度型三种不同类型的相关。如果一种语言有整型、实型、双精度型三种不同类型的运算对象,则任何一种基本算术运算符(运算对象,则任何一种基本算术运算符()实际上代)实际上代表了表了 种运算符。如果语言中有种运
41、算符。如果语言中有4 4种不同类型的算术运算种不同类型的算术运算对象,那么每一种基本算术运算符实际上代表对象,那么每一种基本算术运算符实际上代表 种运算种运算符。在计算时应考虑这种因数据类型而引起差异的情况。符。在计算时应考虑这种因数据类型而引起差异的情况。236P/2412P 2023-1-25365.7 5.7 软件测试软件测试5.7.1 5.7.1 软件测试的意义软件测试的意义 软件测试是软件开发过程的重要组成部分,是用来确认软件测试是软件开发过程的重要组成部分,是用来确认一个系统的品质或性能是否符合用户提出的要求的标准。一个系统的品质或性能是否符合用户提出的要求的标准。2023-1-2
42、5375.7.2 5.7.2 软件测试的基本概念软件测试的基本概念1.1.软件测试的概念软件测试的概念2.2.软件测试的角色软件测试的角色3.3.关于软件测试的一些常用术语关于软件测试的一些常用术语(1)(1)测试测试(2)(2)测试用例测试用例(3)(3)测试步骤测试步骤2023-1-2538测试步骤测试步骤 事故 修复 故障 故障 故障 故障 故障 故障 故障 需求规格说故障隔离 编码 测试 故障分析 设计 故障清除 2023-1-25391 1软件测试的目的软件测试的目的 确认软件的质量确认软件的质量 提供信息提供信息 软件测试不仅是在测试软件产品的本身,而且还包括软件开发的软件测试不仅
43、是在测试软件产品的本身,而且还包括软件开发的过程。过程。5.7.3 5.7.3 软件测试的目的、任务、原则和研究对象软件测试的目的、任务、原则和研究对象2023-1-25402 2软件测试的任务软件测试的任务测试人员在软件开发过程中的任务:测试人员在软件开发过程中的任务:(1)(1)寻找寻找BugBug;(2)(2)避免软件开发过程中的缺陷;避免软件开发过程中的缺陷;(3)(3)衡量软件的品质;衡量软件的品质;(4)(4)关注用户的需求。关注用户的需求。5.7.3 5.7.3 软件测试的目的、任务、原则和研究对象软件测试的目的、任务、原则和研究对象2023-1-25413 3软件测试的原则软件
44、测试的原则(1)(1)应当尽早地和不断地进行软件测试应当尽早地和不断地进行软件测试(2)(2)测试用例应由测试输入数据和与之对应的预期输出结果这两部分组成测试用例应由测试输入数据和与之对应的预期输出结果这两部分组成(3)(3)程序员应避免检查自己的程序程序员应避免检查自己的程序(4)(4)在设计测试用例时,应当包括有效的输入条件和无效的输入条件在设计测试用例时,应当包括有效的输入条件和无效的输入条件 (5)(5)充分注意测试中的群集现象充分注意测试中的群集现象(6)(6)严格执行测试计划,排除测试的随意性。严格执行测试计划,排除测试的随意性。(7)(7)应当对每一个测试结果做全面检查应当对每一
45、个测试结果做全面检查(8)(8)妥善保存测试计划、测试用例、出错统计和最终分析报告,为维护提供方便。妥善保存测试计划、测试用例、出错统计和最终分析报告,为维护提供方便。2023-1-25424 4软件测试中研究的对象软件测试中研究的对象 软件测试并不等于程序测试。软件测试应该贯穿软件定义与软件测试并不等于程序测试。软件测试应该贯穿软件定义与开发整个期间。在对需求理解与表达的正确性、设计与表达的正确开发整个期间。在对需求理解与表达的正确性、设计与表达的正确性、实现的正确性以及运行的正确性的验证中,任何一个环节发生性、实现的正确性以及运行的正确性的验证中,任何一个环节发生了问题都可能在软件测试中表
46、现出来。了问题都可能在软件测试中表现出来。5.7.3 5.7.3 软件测试的目的、任务、原则和研究对象软件测试的目的、任务、原则和研究对象2023-1-25435.7.4 5.7.4 软件测试的发展历史及趋势软件测试的发展历史及趋势第一个阶段是第一个阶段是6060年代及其以前年代及其以前 第二个阶段是第二个阶段是7070年代年代 第三个阶段是第三个阶段是8080年代及其以后年代及其以后 2023-1-25445.7.5 5.7.5 软件测试的需求规格说明软件测试的需求规格说明 1.1.采用软件需求规格说明模版采用软件需求规格说明模版 2.2.指明需求来源指明需求来源 3.3.为每项需求注上标号
47、为每项需求注上标号 4.4.记录业务规范记录业务规范 5.5.创建需求跟踪能力矩阵创建需求跟踪能力矩阵2023-1-25455.7.6 5.7.6 软件测试的设计说明软件测试的设计说明测试设计的以下几个原则测试设计的以下几个原则:(1)(1)对被测试程序的每一个对被测试程序的每一个(公共公共)功能,都需要有一个测试用功能,都需要有一个测试用例例(2)(2)测试任何可能出错的地方测试任何可能出错的地方(3)(3)测试边界条件测试边界条件(4)(4)测试设计前提测试设计前提(5)(5)测试设计过程测试设计过程(6)(6)建议程序开发时预留测试点建议程序开发时预留测试点2023-1-25465.8
48、5.8 软件测试的方法软件测试的方法5.8.1 5.8.1 静态测试和动态测试静态测试和动态测试1 1静态测试静态测试 2 2动态测试动态测试2023-1-25475.8 5.8 软件测试的方法软件测试的方法5.8.2 5.8.2 黑盒测试法和白盒测试法黑盒测试法和白盒测试法 从测试是否针对系统的内部结构和具体实现算法的角从测试是否针对系统的内部结构和具体实现算法的角度来看,可分为白盒测试和黑盒测试。度来看,可分为白盒测试和黑盒测试。2023-1-25485.8 5.8 软件测试的方法软件测试的方法1.1.黑盒测试黑盒测试 (1)(1)划分等价类划分等价类 (2)(2)确定测试用例确定测试用例
49、 (3)(3)边界值分析边界值分析 (4)(4)错误推测错误推测 (5)(5)因果图因果图 (6)(6)综合策略综合策略黑盒测试的优点黑盒测试的优点2023-1-25495.8 5.8 软件测试的方法软件测试的方法(1)(1)划分等价类划分等价类 如果某个输入条件规定了取值范围或值的个数,则可确如果某个输入条件规定了取值范围或值的个数,则可确定一个有效的等价类定一个有效的等价类(输入值或某个数值在此范围内输入值或某个数值在此范围内)和两个无和两个无效等价类效等价类(输入值或某个数值小于这个范围的最小值或大于这个输入值或某个数值小于这个范围的最小值或大于这个范围的最大值范围的最大值)。如果规定了
50、输入数据的一组值,而且程序对不同的输如果规定了输入数据的一组值,而且程序对不同的输入值做不同的处理,则每个允许输入值是一个有效等价类,此入值做不同的处理,则每个允许输入值是一个有效等价类,此处还有一个无效等价类处还有一个无效等价类(任何一个不允许的输入值任何一个不允许的输入值)。如果规定了输入数据必须遵循的规则,可确定一个有如果规定了输入数据必须遵循的规则,可确定一个有效等价类效等价类(符合规则符合规则)和若干个无效等价类和若干个无效等价类(从各种不同角度违反从各种不同角度违反规则规则)。如果已划分的等价类中各元素在程序中的处理方式不如果已划分的等价类中各元素在程序中的处理方式不同,则应将此等