1、项目五 软件实现项目五 软件实现任务一 软件编码任务二 软件测试习题项目五 软件实现项目引导本项目主要介绍软件开发中实现阶段相关内容,包含将软件设计的结果转化为计算机可运行的程序代码的编码阶段及发现软件在整个软件设计过程中存在的问题并加以纠正的软件测试阶段。项目五 软件实现知识目标(1)认识软件编码的组成内容。(2)掌握统一、符合标准的编码规范。(3)理解软件测试基本理论。(4)掌握常见测试用例设计方法。能力目标 使用Rational Rose建模工具绘制详细类图,并能依据设计文档进行实际开发。项目五 软件实现任务一 软 件 编 码编码就是把软件设计结果翻译成用某种程序设计语言书写的程序。编码
2、是对设计的进一步具体化。编码过程中所选用的程序设计语言的特点及编码风格,将对程序的可靠性、可读性、可测试性和可维护性产生深远的影响。通常把编码和测试统称为实现。项目五 软件实现严格说来,计算机语言包括机器语言、汇编语言和高级语言这三类语言。如果不涉及汇编语言,程序设计语言往往就是指高级语言。从某种意义上将,计算机语言从机器语言发展到汇编语言,标志着人类与计算机首次有了基于符号共同的语言,即这种语言(汇编语言)是人类(借助助记符)和计算机(借助汇编程序)都能够理解的语言,它也是人类将符号引入程序设计的开始。项目五 软件实现机器语言是机器指令的集合。机器指令指计算机的CPU能够识别并处理的二进制代
3、码,由这些二进制代码组成的二进制代码串称为机器程序。以把立即数5传送到累加器的操作为例,在以80X86为CPU的计算机中的二进制代码是B80005,在以Z80为CPU的计算机中的二进制代码是3E05。项目五 软件实现汇编语言是一种使用助记符的语言。助记符是一些缩写的英文单词,这些缩写的英文单词都有特定的操作含义,如MOV或LD表示传送、ADD表示乘法运算等。因此,汇编语言是一种面向机器的计算机语言。用汇编语言编写的程序称为汇编语言程序或源程序。将汇编语言程序翻译成机器语言程序(也称为目标程序)的程序称为汇编程序。仍以把立即数5传送到累加器的操作为例:在以80X86 为CPU的计算机中的汇编语言
4、程序是:MOV AX,5。而在以Z80为CPU的计算机中的汇编语言程序是:LD A,5。项目五 软件实现一、程序设计语言概述什么是程序?什么是程序设计呢?程序是用程序设计语言表示的计算机解题算法或计算机解题任务。程序设计是将解题任务转变成程序的过程。Nell Dale等人则指出:程序就是要求计算机执行的指令序列,程序设计就是如何计划、安排计算机必须遵循的操作步骤顺序的过程。项目五 软件实现人类所使用的语言称为自然语言。它是以语音为物质外壳、以词汇为建筑材料、以语法为结构规律而构成的体系。与此类似,程序设计语言是以具有特定语义的符号为基本构成单位、以语法为程序构成规律、专门用于定义、组织、并完成
5、各种各样的计算任务而形成的体系。程序设计语言是程序设计的基础,了解程序设计语言的特点、分类、选择原则,对于学习程序设计是非常必要的。项目五 软件实现1程序设计语言的组成程序设计语言的基本成分包含数据成分、运算成分、控制成分、函数。数据成分是程序语言的数据类型。数据是程序操作的对象,包括常量和变量、全局量和局部量。数据类型有基本类型(如整型、字符型等)、特殊类型(如空类型)、构造类型(如数组、结构、联合)、指针类型等。运算成分指明允许使用的运算符号及运算规则,一般包括算术运算、关系运算、逻辑运算。项目五 软件实现控制成分指明语言允许表述的控制结构,包括顺序结构、选择结构和循环结构。参见教材中讲述
6、的C(C+)提供的控制语句。函数是程序模块的主要成分,是一段具有独立功能的程序。函数的使用涉及3个概念:函数定义、函数声明和函数调用。函数调用时实参与形参之间交换信息的方法有传值调用和引用调用两种。项目五 软件实现2程序设计语言的分类程序设计语言是指用来书写计算机程序的语言,是人与计算机进行信息通信的工具。程序设计语言目前多达上千种,常用的也有几十种。众多的程序设计语言如何进行分类,目前众说纷纭,多数人认为程序设计语言分为四大类:面向机器的语言、面向过程的语言、面向对象的语言和面向问题的语言。项目五 软件实现1)面向机器的语言面向机器的语言是针对特定的计算机而设计的语言,是不能独立于机器的语言
7、。如机器语言和汇编语言。机器语言也称为低级语言,是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。它是计算机的设计者通过计算机的硬件结构赋予计算机的操作功能。机器语言具有灵活、直接执行和速度快等特点。项目五 软件实现2)面向过程的语言从1956年到1984年近30年间,面向过程的程序设计语言取得了巨大发展,它是当时程序设计的主要工具。面向过程的语言适用于各种计算机并能解决各种题目的语言,它是独立于机器的。使用面向过程的语言,用户不仅要告诉计算机“做什么”,而且还要告诉计算机“如何做”,需要详细地描述解题过程,因此称为面向过程的语言即为过程化语言。如FORTRAN语言、PASCAL
8、语言、C语言、Ada语言等。项目五 软件实现Fortran的全称是Formula Translation,是一种编程语言。它是世界上最早出现的计算机高级程序设计语言,广泛应用于科学和工程计算领域。FORTRAN语言接近数学公式的自然描述,在计算机里具有很高的执行效率,以其特有的功能在数值、科学和工程计算领域发挥着重要作用。COBOL(Common Business Oriented Language)是数据处理领域最为广泛的程序设计语言,是第一个广泛使用的高级编程语言。项目五 软件实现Pascal是一种计算机通用的高级程序设计语言。它由瑞士Niklaus Wirth教授于60年代末设计并创立。
9、以法国数学家命名的Pascal语言现已成为使用最广泛的基于DOS的语言之一,其主要特点有:严格的结构化形式,丰富完备的数据类型,运行效率高,查错能力强。C语言是一种通用的、面向过程式的编程语言,广泛用于系统与应用软件的开发。1969年至1973年间,为了移植与开发UNIX操作系统,由丹尼斯里奇与肯汤普逊,以B语言为基础,在贝尔实验室设计、开发出来。项目五 软件实现Ada是一种表现能力很强的通用程序设计语言,它是美国国防部为克服软件开发危机,耗费巨资,历时近20年研制成功的。它被誉为第四代计算机语言的成功代表。与其他流行的程序设计语言不同,它不仅体现了许多现代软件的开发原理,而且将这些原理付诸实
10、现。因此,Ada语言的使用可大大改善软件系统的清晰性、可靠性、有效性、可维护性。Ada语言的重要特征就是其嵌入式风格、模块化设计、编译检查、平行处理、异常处理及泛型编程。Ada在1995年加入了对面向对象设计的支持,包括动态分配等。项目五 软件实现3)面向对象的语言从1985年至迄今,是面向对象的程序设计语言的产生和发展阶段。面向对象语言借鉴了20世纪50年代的人工智能语言LISP,引入了动态绑定的概念和交互式开发环境的思想;始于20世纪60 年代的离散事件模拟语言SIMULA67,引入了类的要领和继承,其最终成形于20世纪70年代的Smalltalk。面向对象语言的发展有两个方向:一种是纯面
11、向对象语言,如Smalltalk、EIFFEL、Java、C#等;另一种是混合型面向对象语言,即在过程式语言及其他语言中加入类、继承等成分,如C+、Objective-C等。项目五 软件实现Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE,JavaME,JavaSE)的总称。Java自面世后就非常流行,发展迅速,对C+语言形成了有力冲击。Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,
12、同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。Java是一种简单的、跨平台的、面向对象的、分布式的、解释的、健壮的、安全的、结构的、中立的、可移植的、性能很优异的、多线程的、动态的语言。项目五 软件实现C+是在C语言的基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言。它应用较为广泛,是一种静态数据类型检查的,支持多重编程的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象设计、制作图标等多种程序设计风格。C+语言的主要特点表现在两个方面,一是尽量兼容C,二是支持面向对象的方法。它保留了C的简洁、高效的接近
13、汇编语言的特点,对C的类型系统进行了改革性的扩充,因此C+比C更安全,C+的编译系统能检查出更多的类型错误。另外,由于C语言的广泛使用,因而极大地促进了C+的普及和推广。项目五 软件实现4)面向问题的语言面向问题的语言也是独立于计算机的语言,利用这种语言解题,不仅摆脱计算机内部逻辑,而且不必关心问题的解法和解题的过程,只需要指出问题、输入数据和输出形式,就能得到所需要的结果。面向问题的语言与面向过程的语言之间区别就是不需要要告诉计算机“如何做”,即不需要描述解题过程。因此,面向问题的语言又称为非过程化语言或陈述性语言,如报表语言、判定语言、SQL(Structured Query Langua
14、ge)语言等。项目五 软件实现SQL语言是数据库查询和操纵语言,可直接使用数据库管理系统。结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统,同时也是数据库脚本文件的扩展名。结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作,它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同的结构化查询语言作为数据输入与管理的接口。项目五 软件实现3程序设计语言的选择选择程序设计语言是软件编码阶段必须考虑的一个关键问题。程序设计语言的选择需要根据组织和项目的实际情况做出选择,这
15、里给出几个原则和依据:(1)系统的应用领域。(2)系统用户的要求。(3)软件的执行环境。(4)目标系统的性能要求。(5)程序员的知识水平。(6)软件的可移植性。(7)工程规模。项目五 软件实现二、编码规范编码规范是软件公司制订一套统一标准的代码编写规则,用于规范开发人员在软件编码中的代码编写。优秀的程序员在代码编写中应该注意执行编码规范。编码规范的重要性包括:(1)促进团队合作。一个项目大多都是由一个团队来完成,如果没有统一的代码规范,那么每个人的代码必定会风格迥异。多个人同时开发同一模块,即使是分工十分明晰,整合代码的时候也会问题重重。项目五 软件实现(2)降低维护成本。随着项目经验的累积,
16、会越来越重视后期维护的成本,而开发过程中的代码质量直接影响着维护的成本,因此,我们不得不从开发时便小心翼翼。在上文中曾提到,规范的代码大大提高了程序的可读性,几乎所有的程序员都曾做过维护的工作,不用多说,可读性高的代码维护成本必然会大大降低。(3)有助于代码审查。代码审查可以及时纠正一些错误,而且可以对开发人员的代码规范作出监督,团队的代码审查同时也是一个很好的学习机会,对成员的进步也是很有益的。项目五 软件实现三、编码工具1IDE开发工具IDE,即Integrated Development Environment,是“集成开发环境”的英文缩写,可以辅助开发程序的应用软件,一般包括代码编辑器
17、、编译器、调试器和图形用户界面工具,就是集成了代码编写功能、分析功能、编译功能、debug功能等的开发软件套。所有具备这一特性的软件或者软件套(组)都可以叫做IDE,如微软的Visual Studio系列,Borland的C+Builder、Delphi系列等。该程序可以独立运行,也可以和其他程序并用。项目五 软件实现2配置管理工具软件配置管理(Configuration Management)是通过技术或行政手段对软件产品及其开发过程和生命周期进行控制、规范的一系列措施。常用的配置管理工具有:VSS、SVN、Clearcase等。项目五 软件实现任务二 软 件 测 试一、软件基础1软件测试定
18、义观点一:1972年,软件测试领域先驱Bill Hetzel博士在美国的北卡罗来纳大学组织了历史上第一次正式的关于软件测试的会议。1973年他首先给出软件测试的定义:“测试就是建立一种信心,确信程序能够按预期的设想运行”。项目五 软件实现1983年他又将软件测试的定义修改为:“评价一个程序和系统的特性或能力,并确定它是否达到预期的结果。软件测试就是以此为目的的任何行为”。他定义中的“设想”和“预期结果”其实就是现在所说的“用户需求”。他把软件的质量定义为“符合要求”。他认为测试方法是试图验证软件是“工作的”,所谓“工作的”就是指软件的功能是按照预先的设想执行的。项目五 软件实现观点二:与观点一
19、相反,代表人物是Glenford J.Myers。他认为应该首先认定软件是有错误的,然后用测试去发现尽可能多的错。除此之外,Myers还给出了与测试相关的三个重要观点,如下:(1)测试是为了证明程序有错,而不是证明程序无错。(2)一个好的测试用例是在于它发现以前未能发现的错误。(3)一个成功的测试是发现了以前未发现的错误测试。项目五 软件实现2软件测试术语软件测试环境:就是软件运行的平台,包括软件、硬件和网络的集合。用一个等式来表示:测试环境=软件+硬件+网络。其中,“硬件”主要包括PC机(包括品牌机和兼容机)、笔记本、服务器、各种PDA终端等;“软件”主要指软件运行的操作系统;“网络”主要针
20、对的是C/S结构和B/S结构的软件。项目五 软件实现软件缺陷(Bug):软件的缺陷即Bug指的是软件中(包括程序和文档)不符合用户需求的问题。测试用例(Test Case):包含输入条件、执行步骤和测试期望的正确结果的文档。缺陷跟踪系统(DTS):管理软件缺陷的整个生命周期的工具。静态测试与动态测试(Statistic Testing and Dynamic Testing):不执行/执行程序进行的测试。项目五 软件实现白盒测试与黑盒测试(White Box Testing and Black Box Testing):测试软件代码结构的测试;不关心软件代码结构,以软件输入和输出来测试软件功能
21、的测试。回归测试与冒烟测试(Regression Testing and Smoke Testing):在新的软件Build上验证修正的缺陷是否不再现;在大规模测试前,快速执行的基本功能测试。软件里程碑(SW Milestone):软件项目开发的各个关键过程。项目五 软件实现3软件测试目的与原则1)软件测试目的(1)寻找软件的缺陷;(2)跟踪修正软件缺陷;(3)验证修正的软件缺陷。项目五 软件实现2)软件测试的原则(1)尽早进行软件测试,以在早期发现和报告软件缺陷;(2)全程测试,测试过程贯穿于整个项目的生命周期;(3)测试独立于开发,开发人员不能测试自己的软件;(4)软件的缺陷驱动开发(基本
22、代码完成后愈加明显)。项目五 软件实现4软件测试类型按照比较的方式,一般把测试分为静态测试与动态测试,白盒测试与黑盒测试等。另外,常见的软件测试类型还有:BVT(Build Verification Test,BVT)是在所有开发工程师都已经检入自己的代码、项目组编译生成当天的版本之后进行,主要目的是验证最新生成的软件版本在功能上是否完整,主要的软件特性是否正确。Scenario Tests(基于用户实际应用场景的测试),在做BVT、功能测试的时候,可能测试主要集中在某个模块,或比较分离的功能上。项目五 软件实现Smoke Test,在测试中发现问题,找到了一个Bug,然后开发人员会来修复这个
23、Bug。此外,常见的软件测试类型还包括:Application Compatibility Test(兼容性测试),主要目的是为了兼容第三方软件,确保第三方软件能正常运行,用户不受影响;Accessibility Test(软件适用性测试),是确保软件对于某些有残疾的人士也能正常的使用,但优先级比较低;其他的测试还有Functional Test(功能测试)、Security Test(安全性测试)、Stress Test(压力测试)、Performance Test(性能测试)、Regression Test(回归测试)、Setup/Upgrade Test(安装升级测试)等。项目五 软件实
24、现1)静态测试静态测试包括代码检查、静态结构分析、代码质量度量等。它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行。(1)代码检查:代码检查包括代码走查、桌面检查、代码审查等,主要检查代码和设计的一致性,代码对标准的遵循、可读性,代码的逻辑表达的正确性,代码结构的合理性等方面。项目五 软件实现(2)静态结构分析:静态结构分析主要是以图形的方式表现程序的内部结构,例如函数调用关系图、函数内部控制流图。其中,函数调用关系图以直观的图形方式描述一个应用程序中各个函数的调用和被调用关系;控制流图显示一个函数的逻辑结构,它由许多节点组成,一个节点代表一条语句或数条语句,连接结点的叫
25、边,边表示节点间的控制流向。(3)代码质量度量:ISO/IEC 9126国际标准所定义的软件质量包括六个方面:功能性、可靠性、易用性、效率、可维护性和可移植性。软件的质量是软件属性的各种标准度量的组合。项目五 软件实现针对软件的可维护性,目前业界主要存在三种度量参数:Line复杂度、Halstead复杂度和McCabe复杂度。其中Line复杂度以代码的行数作为计算的基准;Halstead以程序中使用到的运算符与运算元数量作为计数目标(直接测量指标),然后可以据此计算出程序容量、工作量等;McCabe复杂度一般称为圈复杂度(Cyclomatic Complexity),它将软件的流程图转化为有向
26、图,然后以图论来衡量软件的质量;McCabe复杂度包括圈复杂度、基本复杂度、模块设计复杂度、设计复杂度和集成复杂度。项目五 软件实现静态测试的要点如下:(1)同一程序内的代码书写是否为同一风格;(2)代码布局是否合理、美观;(3)程序中函数、子程序块分界是否明显;(4)注释是否符合既定格式;(5)注释是否正确反映代码的功能;(6)变量定义是否正确(长度、类型、存储类型);(7)是否引用了未初始化变量;(8)数组和字符串的下标是否为整数;项目五 软件实现(9)数组和字符串的下标是否在范围内(不“越界”);(10)进行数组的检索及其他操作中,是否会出现“漏掉一个这种情况”;(11)是否在应该使用常
27、量的地方使用了变量(例:数组范围检查);(12)是否为变量赋予不同类型的值的情况下,赋值是否符合数据类型的转换规则;(13)变量的命名是否相似;(14)是否存在声明过,但从未引用或者只引用过一次的变量;项目五 软件实现(15)在特定模块中所有的变量是否都显式声明过;(16)非(15)的情况下,是否可以理解为该变量具有更高的共享级别;(17)是否为引用的指针分配内存;(18)数据结构在函数和子程序中的引用是否明确定义了其结构;(19)计算中是否使用了不同数据类型的变量;(20)计算中是否使用了不同的数据类型相同但长度不同的变量;项目五 软件实现(21)赋值的目的变量是否小于赋值表达式的值;(22
28、)数值计算是否会出现溢出(向上)的情况;(23)数值计算是否会出现溢出(向下)的情况;(24)除数是否可能为零;(25)某些计算是否会丢失计算精度;(26)变量的值是否超过有意义的值;(27)计算式的求值的顺序是否容易让人感到混乱;(28)比较是否正确;(29)是否存在分数和浮点数的比较;项目五 软件实现(30)如果(29),精度问题是否会影响比较;(31)每一个逻辑表达式是否都得到了正确表达;(32)逻辑表达式的操作数是否均为逻辑值;(33)程序中的BeginEnd和DoWhile等语句中,End是否对应;(34)程序、模块、子程序和循环是否能够终止;(35)是否存在永不执行的循环;(36)
29、是否存在多循环一次或少循环一次的情况;(37)循环变量是否在循环内被错误地修改;项目五 软件实现(38)多分支选择中,索引变量是否能超过可能的分支数;(39)如果(38),该情况是否能够得到正确处理;(40)子程序接受的参数类型、大小、次序是否和调用模块相匹配;(41)全局变量定义和用法在各个模块中是否一致;(42)是否修改了只作为输入用的参数;(43)常量是否被作为形式参数进行传递。项目五 软件实现2)动态测试动态测试包括功能测试与接口测试、覆盖率分析、性能分析、内存分析等。(1)功能与接口测试:这部分的测试包括各个单元功能的正确执行、单元间的接口,包括单元接口、局部数据结构、重要的执行路径
30、、错误处理的路径和影响上述几点的边界条件等内容。(2)覆盖率分析:覆盖率分析主要对代码的执行路径覆盖范围进行评估,语句覆盖、判定覆盖、条件覆盖、条件/判定覆盖、修正条件/判定覆盖、基本路径覆盖都是从不同要求出发,为设计测试用例提供依据的。项目五 软件实现(3)性能分析:代码运行缓慢是开发过程中一个重要问题。一个应用程序运行速度较慢,程序员不容易找到是在哪里出现了问题,如果不能解决应用程序的性能问题,将降低并极大地影响应用程序的质量,于是查找和修改性能瓶颈成为调整整个代码性能的关键。目前性能分析工具大致分为纯软件的测试工具、纯硬件的测试工具(如逻辑分析仪和仿真器等)和软硬件结合的测试工具三类。项
31、目五 软件实现(4)内存分析:内存泄漏会导致系统运行的崩溃,尤其对于嵌入式系统这种资源比较匮乏、应用非常广泛,而且往往又处于重要部位的系统,将可能导致无法预料的重大损失。通过测量内存使用情况,可以了解程序内存分配的真实情况,发现对内存的不正常使用,在问题出现前发现征兆,在系统崩溃前发现内存泄露错误、发现内存分配错误,并精确显示发生错误时的上下文情况,指出发生错误的原由。项目五 软件实现(5)连接方式:在嵌入式软件测试中,测试系统Host与被测试系统Target的连接有两种方式:直接连接和通过仿真器连接。直接连接是Host与Target通过串口、并口或网口直接连接。动态测试要点如下:(1)测试数
32、据是否具有一定的代表性;(2)测试数据是否包含测试所用的各个等价类(边界条件、次边界条件、空白、无效);(3)是否可能从客户那边得到测试数据;项目五 软件实现(4)非(3)的情况下,所用的测试数据是否具有实际的意义;(5)是否每一组测试数据都得到了执行;(6)每一组测试数据的测试结果是否与预期结果一致;(7)文件的属性是否正确;(8)打开文件语句是否正确;(9)输入/输出语句是否与格式说明书所记述的一致;(10)缓冲区大小与记录长度是否匹配;(11)使用文件前是否已打开了文件;项目五 软件实现(12)文件结束条件是否存在;(13)产生输入/输出错误时,系统是否进行检测并处理;(14)输出信息中
33、是否存在文字书写错误和语法错误;(15)控件尺寸是否大小适宜;(16)控件颜色是否符合规约;(17)控件布局是否合理、美观;(18)控件TAB顺序是否从左到右,从上到下;(19)数字输入框是否接受数字输入;(20)在(19)的情况下、数字是否按既定格式显示;(21)数字输入框是否拒绝字符串和“非法”数字的输入;项目五 软件实现(22)组合框是否的能够进行下拉选择;(23)组合框是否能够进行下拉多项选择;(24)对于可添加数据组合框,添加数据后数据是否能够得到正确显示和进行选择;(25)列表框是否能够进行选择;(26)多项列表框是否能够进行多数据项选择;(27)日期输入框是否接受正确的日期输入;
34、(28)日期输入框是否拒绝错误的日期输入;(29)日期输入框在日期输入后是否按既定的日期格式显示日期;项目五 软件实现(30)单选组内是否有且只有一个单选钮可选;(31)如果单选组内无单选钮可选,这种情况是否允许存在;(32)复选框组内是否允许多个复选框(包括全部可选)可选;(33)如果复选框组内无复选框可选,这种情况是否允许存在;(34)文本框及某些控件拒绝输入和选择时显示区域是否变灰或按既定规约处理;(35)密码输入框是否按掩码的方式显示;项目五 软件实现(36)Cancel之类的按钮按下后,控件中的数据是否清空复原或按既定规约处理;(37)Submit之类的按钮按下后,数据是否得到提交或
35、按既定规约处理;(38)异常信息表述是否正确;(39)软件是否按预期方式处理错误;(40)文件或外设不存在的情况下是否存在相应的错误处理;(41)软件是否严格的遵循外设的读写格式;(42)画面文字(全、半角、格式、拼写)是否正确;项目五 软件实现(43)产生的文件和数据表的格式是否正确;(44)产生的文件和数据表的计算结果是否正确;(45)打印的报表是否符合既定的格式;(46)错误日志的表述是否正确;(47)错误日志的格式是否正确。项目五 软件实现3)白盒测试白盒测试是指在测试时能够了解被测对象的结构,可以查阅被测代码内容的测试工作。它需要知道程序内部的设计结构及具体的代码实现,并以此为基础来
36、设计测试用例。如下例程序代码:项目五 软件实现项目五 软件实现白盒测试的直接好处就是知道所设计的测试用例在代码级上哪些地方被忽略掉,它的优点是帮助软件测试人员增大代码的覆盖率,提高代码的质量,发现代码中隐藏的问题。白盒测试的缺点有:(1)程序运行会有很多不同的路径,不可能测试所有的运行路径;(2)测试基于代码,只能测试开发人员做的对不对,而不能知道设计的正确与否,可能会漏掉一些功能需求;(3)系统庞大时,测试开销会非常大。项目五 软件实现4)黑盒测试黑盒测试顾名思义就是将被测系统看成一个黑盒,从外界取得输入,然后再输出。整个测试基于需求文档,看是否能满足需求文档中的所有要求。黑盒测试要求测试者
37、在测试时不能使用与被测系统内部结构相关的知识或经验,它适用于对系统的功能进行测试。项目五 软件实现黑盒测试的优点有:(1)比较简单,不需要了解程序内部的代码及实现;(2)与软件的内部实现无关;(3)从用户角度出发,能很容易的知道用户会用到哪些功能,会遇到哪些问题;(4)基于软件开发文档,所以也能知道软件实现了文档中的哪些功能;(5)在做软件自动化测试时较为方便。项目五 软件实现黑盒测试的缺点有:(1)不可能覆盖所有的代码,覆盖率较低,大概只能达到总代码量的30%;(2)自动化测试的复用性较低。项目五 软件实现二、软件测试过程1软件测试过程概述软件测试过程是一种抽象的模型,用于定义软件测试的流程
38、和方法。众所周知,开发过程的质量决定了软件的质量,同样的,测试过程的质量将直接影响测试结果的准确性和有效性。软件测试过程和软件开发过程一样,都遵循软件工程原理,遵循管理学原理。项目五 软件实现1)测试过程管理理念生命周期模型提供了软件测试的流程和方法,为测试过程管理提供了依据。但实际的测试工作是复杂而烦琐的,可能不会有哪种模型完全适用于某项测试工作。所以,应该从不同的模型中抽象出符合实际现状的测试过程管理理念,依据这些理念来策划测试过程,以不变应万变。项目五 软件实现(1)尽早测试。“尽早测试”是从W模型中抽象出来的理念。我们说测试并不是在代码编写完成之后才开展的工作,测试与开发是两个相互依存
39、的并行过程,测试活动在开发活动的前期已经开展。“尽早测试”包含两方面的含义:第一,测试人员早期即参与软件项目,及时开展测试的准备工作,包括编写测试计划、制定测试方案以及准备测试用例;第二,尽早地开展测试执行工作,一旦代码模块完成就应该及时开展单元测试,一旦代码模块被集成为相对独立的子系统,便可以开展集成测试,一旦有Build提交,便可以开展系统测试工作。项目五 软件实现(2)全面测试。软件是程序、数据和文档的集合,那么对软件进行测试,就不仅仅是对程序的测试,还应包括软件“副产品”的“全面测试”,这是W模型中一个重要的思想。需求文档、设计文档作为软件的阶段性产品,直接影响到软件的质量。阶段产品质
40、量是软件质量的量的积累,不能把握这些阶段产品的质量将导致最终软件质量的不可控。项目五 软件实现“全面测试”包含两层含义:第一,对软件的所有产品进行全面的测试,包括需求、设计文档,代码,用户文档等;第二,软件开发及测试人员(有时包括用户)全面地参与到测试工作中,例如对需求的验证和确认活动,就需要开发、测试及用户全面参与,毕竟测试活动并不仅仅是保证软件运行正确,同时还要保证软件满足了用户的需求。“全面测试”有助于全方位把握软件质量,尽最大可能的排除造成软件质量问题的因素,从而保证软件满足质量需求。项目五 软件实现(3)全过程测试。在W模型中充分体现的另一个理念就是“全过程测试”。双V字过程图形象地
41、表明了软件开发与软件测试的紧密结合,这就说明软件开发和测试过程会彼此影响,这就要求测试人员对开发和测试的全过程进行充分的关注。项目五 软件实现“全过程测试”包含两层含义:第一,测试人员要充分关注开发过程,对开发过程的各种变化及时做出响应,例如开发进度的调整可能会引起测试进度及测试策略的调整,需求的变更会影响到测试的执行等;第二,测试人员要对测试的全过程进行全程的跟踪,例如建立完善的度量与分析机制,通过对自身过程的度量,及时了解过程信息,调整测试策略。“全过程测试”有助于及时应对项目变化,降低测试风险。同时对测试过程的度量与分析也有助于把握测试过程,调整测试策略,便于测试过程的改进。项目五 软件
42、实现(4)独立的、迭代的测试。我们知道,软件开发瀑布模型只是一种理想状况。为适应不同的需要,人们在软件开发过程中摸索出了如螺旋、迭代等诸多模型,这些模型中需求、设计、编码工作可能重叠并反复进行,这时的测试工作将也是迭代和反复的。如果不能将测试从开发中抽象出来进行管理,势必使测试管理陷入困境。软件测试与软件开发是紧密结合的,但并不代表测试是依附于开发的一个过程,测试活动是独立的,这正是H模型所主导的思想。“独立的、迭代的测试”着重强调了测试的就绪点,也就是说,只要测试条件成熟,测试准备活动完成,测试的执行活动就可以开展。项目五 软件实现所以,在遵循尽早测试、全面测试、全过程测试理念的同时,应当将
43、测试过程从开发过程中适当的抽象出来,作为一个独立的过程进行管理,时刻把握独立的、迭代测试的理念,减小因开发模型的繁杂给测试管理工作带来的不便。对于软件过程中不同阶段的产品和不同的测试类型,只要测试准备工作就绪,就可以及时开展测试工作,把握产品质量。项目五 软件实现2)测试过程管理实践整个项目开发共分三个阶段完成:第一阶段实现进销存的简单的功能和工作流;第二阶段:实现固定资产管理、财务管理,并完善第一阶段的进销存功能;第三阶段:增加办公自动化的管理(OA)。该项目每一阶段工作是对上一阶段成果的一次迭代完善,同时将新功能进行了一次叠加。项目五 软件实现(1)策划测试过程。依据传统的方法,将系统测试
44、作为软件开发的一个阶段,系统测试执行工作将在三个阶段完成后开展,很明显,这样做不利于Bug的及时暴露。有些缺陷可能会埋藏至后期发现,这时的修复成本将大大提高。该系统的三个阶段具有相对的独立性,在每一阶段完成所提交的阶段产品具有相对的独立性,可以作为系统测试准备的就绪点。故而,在该系统开发过程中,系统测试组计划开展三阶段的系统测试,每个阶段系统测试具有不同的侧重点,目的在于更好的配合开发工作尽早发现软件Bug,降低软件成本。软件开发与系统测试过程的关系如图5-1所示。项目五 软件实现图5-1 软件开发与系统测试关系图项目五 软件实现(2)把握需求。在本系统开发过程中,需求的获取和完善贯穿每个阶段
45、,对需求的把握很大程度上决定了软件测试是否能够成功。系统测试不仅需要确认软件是否正确实现功能,同时还要确认软件是否满足用户的需要。依据“尽早测试”和“全面测试”原则,在需求的获取阶段,测试人员参与到了对需求的讨论之中。测试人员与开发人员及用户一起讨论需求的完善性与正确性,同时从可测试性角度为需求文档提出建议。这些建议对开发人员来说,是从一个全新的思维角度提出的约束。同时,测试组结合前期对项目的把握,很容易制定出了完善的测试计划和方案,将各阶段产品的测试方法及进度、人员安排进行了策划,使整个项目的进展有条不紊。项目五 软件实现(3)变更控制。变更控制体现的是“全过程测试”理念。在软件开发过程中,
46、变更往往是不可避免的,变更也是造成软件风险的重要因素。在本系统测试中,仅第一阶段就发生了7次需求变更,调整了两次进度计划。依据“全过程测试”理念,测试组密切关注开发过程,跟随进度计划的变更调整测试策略,依据需求的变更及时补充和完善测试用例。由于充分的测试准备工作,在测试执行过程中,没有废弃一个测试用例,测试的进度并没有因为变更而受到过多影响。项目五 软件实现(4)度量与分析。对测试过程的度量与分析同样体现的“全过程测试”理念。对测试过程的度量有利于及时把握项目情况,对过程数据进行分析,很容易发现优势劣势,找出需要改进的地方,及时调整测试策略。在ERP项目中,我们在测试过程中对不同阶段的Bug数
47、量进行了度量,并分析测试执行是否充分。如图5-2所示,通过分析我们得出:相同时间间隔内发现的Bug数量呈收敛状态,测试是充分的。在Bug数量收敛的状态下结束细测是恰当的。项目五 软件实现图5-2 软件开发与系统测试关系图项目五 软件实现测试中,我们对不同功能点的测试数据覆盖率和发现问题数进行度量,以便分析测试用例的充分度与Bug发现率之间的关系。如表5-1所示,对类似模块进行对比发现:某一功能点上所覆盖的测试数据组越多,用例Bug的发现率越高。如果再结合工作量、用例执行时间等因素进行统计分析,便可以找到适合实际情况的测试用例书写粒度,从而帮助测试人员判断测试成本和收益间的最佳平衡点。项目五 软
48、件实现项目五 软件实现3)测试过程可持续改进测试技术发展到今天,已经存在诸多可供参考的测试过程管理思想和理念。但信息技术发展一日千里,新技术不断涌现,这就注定测试过程也需要不断地改进。我们提倡基于度量与分析的可持续过程改进方法(本文不做详细论述)。在这种方法中,对现状的度量被制度化,并作为过程改进的基础,组织可以自定义需要度量的过程数据,将收集来的数据加以分析,以找出需要改进的因素,在不断地改进中,同步地调整需要度量的过程数据,使度量与分析始终为了过程改进服务,而过程改进也包含对度量和分析的改进。项目五 软件实现4)软件测试过程模型(1)V模型。V模型最早是由Paul Rook在20世纪80年
49、代后期提出的,旨在改进软件开发的效率和效果。V模型反映出了测试活动与分析设计活动的关系。在图5-3中,从左到右描述了基本的开发过程和测试行为,非常明确地标注了测试过程中存在的不同类型的测试,并且清楚地描述了这些测试阶段和开发过程期间各阶段的对应关系。项目五 软件实现图5-3 软件测试V模型项目五 软件实现(2)W模型。W模型由Evolutif公司提出,相对于V模型,W模型增加了软件各开发阶段中应同步进行的验证和确认活动。如图5-4所示,W模型由两个V字形模型组成,分别代表测试与开发过程,图中明确表示出了测试与开发的并行关系。项目五 软件实现图5-4 软件测试W模型项目五 软件实现(3)模型。V
50、模型和W模型均存在一些不妥之处。如前所述,它们都把软件的开发视为需求、设计、编码等一系列串行的活动,而事实上,这些活动在大部分时间内是可以交叉进行的,所以,相应的测试之间也不存在严格的次序关系,同时,各层次的测试(单元测试、集成测试、系统测试等)也存在反复触发、迭代的关系。为了解决以上问题,有专家提出了H模型。它将测试活动完全独立出来,形成了一个完全独立的流程,将测试准备活动和测试执行活动清晰地体现出来,如图5-5所示。项目五 软件实现图5-5 软件测试H模型项目五 软件实现(4)其他模型。除上述几种常见模型外,业界还流传着其他几种模型,例如X模型、前置测试模型等。X模型提出针对单独的程序片段