1、第第6 6章章 软件开发过程与调试软件开发过程与调试6.1 6.1 开发过程概述开发过程概述 计算机软件尤其是数据库软件已成为当代计算机应用的主流。软件开发人员必须了解软件开发的主要过程,掌握正确的开发手段,以达到事半功倍的效果。开发过程概述(续)开发过程概述(续)6.1.1 开发前的准备工作开发前的准备工作 项目在开发前都有系统任务书,主要规定软件的开发目标、主要任务、功能、性能指标及研制人员和经费、进度等安排,作为系统设计开发和检验的基本依据。系统任务书的基本内容如下: (1)引言,包括编写目的、背景、参考资料。 (2)系统目标及任务,包括系统建设目标、主要任务、性能指标、标准化要求等。
2、(3)系统的结构及功能,包括系统应用组成及结构,系统主要功能等。 (4)系统的规模及进度要求,包括系统规模、研制进度、人员计划等。 开发过程概述(续)开发过程概述(续) 系统任务书只是开发软件项目的一个基本要求。在实际应用中,软件开发人员和需求分析人员要对软件项目的细节进行具体分析,必要时还要进行实地调研,然后共同商讨并确定系统的需求分析,需求分析的编写目的在于: (1)说明系统在现有技术、经济和人员等条件下的可行性。 (2)分析原系统(工作环境)现状,描述待开发系统的详细需求,提供项目设计需要的基本信息,并使这些信息成为用户和开发人员之间沟通的基础。 开发过程概述(续)开发过程概述(续) 需
3、求分析报告的基本内容如下: (1)概述,包括编写目的、背景、参考资料、术语及缩略语。 (2)对现有系统的分析。(3)待开发系统的详细需求,包括功能需求、使用范围、业务流程、用户界面、输出要求、故障处理。 (4)使用环境(如网络环境、硬件环境、软件环境),以及与其他系统的关系。 (5)可行性分析,包括技术可行性分析、经济可行性分析、人员可行性分析,以及影响待开发系统的主要因素。 (6)结论意见。开发过程概述(续)开发过程概述(续)6.1.2 软件开发过程软件开发过程 有了系统任务书和需求分析报告,软件设计人员就可以对软件项目的实现进行系统分析,系统分析包括系统的总体设计方案、系统设计说明等,以作
4、为软件设计的依据。 1.系统总体方案系统总体方案 系统开发单位在与用户充分沟通的基础上,提出系统的技术构架,描述系统功能、性能等主要指标,规定实现方法和要求,系统总体方案是系统进行详细设计的依据。系统总体方案基本内容包括: 开发过程概述(续)开发过程概述(续) (1)引言,包括编写目的、背景、参考资料、术语及定义。 (2)项目概述,包括: 项目的主要内容。 系统需求分析,即用户需求调查分析、现行系统的现状调查分析等。 系统功能,即系统的功能要求、主要技术性能。 系统的数据要求,即基础数据、业务数据、交换数据及其他数据等。 系统的设计要求,即技术结构要求、系统划分及其接口要求、系统运行环境要求、
5、系统标准化综合要求。 (3)实施总计划,包括进度、预算、可能出现的问题和措施等。 开发过程概述(续)开发过程概述(续)2系统设计说明系统设计说明 系统设计说明根据系统总体方案提出的系统构架、功能、性能及数据要求确定系统的物理结构,说明系统主要的技术设计和采用的技术方法,以及系统的标准化约束等。系统设计说明是系统实施的基本依据,其主要内容有: (1)引言,包括编写目的、背景、条件和限制、参考资料、术语及定义。 (2)系统总体技术方案,包括: 概述,即系统目标、基本要求等。 系统结构,即应用结构、功能结构、技术结构等。 开发过程概述(续)开发过程概述(续) 系统功能设计。功能设计包括业务管理功能设
6、计、综合查询功能设计、邮件收发功能设计、数据库接口设计。在对这些功能进行综合分析的基础上,进行数据库表的设计。在对表的设计过程中,既要考虑关系数据库冗余字段的处理,又要考虑系统运行的速度和实现的方便性等因素。开发过程概述(续)开发过程概述(续) 系统安全设计。可以考虑以下安全设计思想,例如系统的数据传输通过电子邮件实现,要求电子邮件内部只传代码,不传涉密数据;系统的数据库操作需要充分利用数据库的事务提交和回滚机制,确保业务处理的完整性和一致性;系统的数据结构应充分利用存储空间,在不同的用户之间通过数据冗余提高整个系统的数据安全性;系统中存储的用户口令、备份口令、数据库连接信息等重要数据必需经过
7、安全加密。 数据库优化设计。 界面友好设计。开发过程概述(续)开发过程概述(续) 3软件开发软件开发 客户/服务器结构经常把应用系统的业务逻辑编写在客户端的应用程序中,因此,当应用系统需要改变时,所有客户端的应用程序都必须改变,这对于系统维护来说成本太高了。为了解决这些重复开发应用系统的成本以及为了增加应用系统的重复使用性发挥面向对象分析/面向对象设计的功能,就必须导入所谓的应用程序服务器,这就要采用B/S架构,软件开发人员以一种特定的组件形式,组装企业的逻辑程序代码。这种经过组装,能够执行特定功能的对象便称为“企业对象”,然后把这些企业对象分发到此应用程序服务器。 开发过程概述(续)开发过程
8、概述(续)6.1.3 软件开发后的工作软件开发后的工作 软件项目在开发完成后还要对系统进行测试和维护,以测试开发出的软件的功能和性能是否达到预定要求,当系统更新或出现问题时要进行维护以确保系统正常运行。软件测试大纲是软件设计人员用来自测系统的。它包括: (1)环境测试:硬件环境软件环境开发过程概述(续)开发过程概述(续)(2)功能测试:模拟现场测试应用现场测试。 (3)性能测试:服务器性能测试是服务器响应客户请求、处理请求的时间,以及同时处理多用户请求的能力。系统性能测试测试系统灵敏度和处理作业的频率。(4)系统维护主要指系统运行后的人员培训,排除运行时出现的错误和故障等。6.2 6.2 调试
9、与测试调试与测试6.2.1 程序调试程序调试 Visual C# 2005集成开发环境提供了一个功能强大的内置调试器,用于对程序进行调试。1.程序中的错误程序中的错误 程序调试中可能出现各种各样的错误是,但主要有以下3类: 1)语法错误 这种错误通常在编译时便可发现。程序中如果有语法错误,在编译时编译器将以错误或警告的方式指出这类问题,并提供错误的地方及错误的原因等信息。 调试与测试(续)调试与测试(续) 2)运行错误 程序能通过编译,但用户输入了不正确的信息,例如,使用一个整型变量来存储姓名,让程序打开一个不存在的文件等,都会在程序运行时引发异常。虽然系统也会提示错误或警告,但程序会不正常终
10、止,甚至造成死机现象。处理这种运行错误的办法有两种:一是通过添加一些编程逻辑来对用户输入的值进行检查(这种办法不彻底);二是在程序中加入异常处理来捕获并处理运行阶段的异常错误。调试与测试(续)调试与测试(续) 3)逻辑错误 程序的逻辑错误会导致运行结果错误,也就是在问题的控制逻辑上产生了错误。要查出这类逻辑错误是最困难的,仅通过检查代码很难找到这类错误。2.程序调试的方法程序调试的方法 程序调试的方法可以概括为以下几种: (1)程序调试的设置。 (2)断点的使用。 (3)控制程序的执行。 (4)监视和检查数据的值。调试与测试(续)调试与测试(续) 6.2.2 软件质量与测试软件质量与测试 优质
11、软件是这样定义的:软件能够满足用户显式或隐式需求,文档齐全,符合规定的操作标准,在其基于开发的硬件上能高效运行。 软件在正式投入使用以前,必须经过严格的测试。在大型开发项目中,通常由专业测试人员和开发团队共同来完成测试工作,以确保系统正常运行。调试与测试(续)调试与测试(续)1白盒测试和黑盒测试白盒测试和黑盒测试 白盒测试的对象是源程序,并以程序内部的逻辑结构为依据来设计测试用例。在这种情况下,程序就像玻璃房子,其中的每件事情都是可见的。 白盒测试一般由程序员来完成,程序员都必须确保其编写的每一条指令和程序运行时的每一种情况都被测试过。 与白盒测试相比,黑盒测试是指程序就像看不见内部的黑盒,对
12、其进行测试时不需要知道程序内部细节及程序是如何工作的。 黑盒测试计划是根据需求说明编制的,因此,在软件开发的需求分析阶段编制详尽的需求说明文档相当重要。测试工程师以需求文档为依据进行软件测试。 调试与测试(续)调试与测试(续)2测试中要考虑的问题测试中要考虑的问题 测试的目的是在系统开发的每一阶段,通过适当的测试手段检查系统是否按照正确方向发展,及时发现不足和错误之处并予以改正,在测试中要考虑以下几个问题: (1)不可能完全测试: 鉴于用户系统的多样性、复杂性和开发人员对用户系统了解的局限性,任何测试都只能尽量地发现问题,减少错误,而不能确保没有问题,因而要做到完全测试是不可能的。调试与测试(
13、续)调试与测试(续) (2)测试要有独立性: 在进行黑盒测试时,测试人员不能是系统开发人员,这两种人员必须独立而并行地开展工作。这就要求测试人员对系统要有足够的了解,并能熟练地运用各种测试方法,在开发的每一阶段完成之前做好全面测试准备,以保证测试顺利进行。 (3)测试有风险性:因为完全的测试是不可能的,而且从时间上来说,也不容许在系统开发中间加入很长的测试时间,因此在制定测试目标与测试计划时,必须抓住重点,尽量使开发工作不发生大漏洞与大错误。因此,测试工作是有风险的。调试与测试(续)调试与测试(续)3软件测试阶段软件测试阶段 一般来说,软件测试可分为3种,即程序测试、系统测试和用户测试。程序测
14、试是指程序编完后进行的检查和测试;系统测试是指在系统开发的整个生命周期中,对各个阶段进行的工作;用户测试属于黑盒测试,是指部分有代表性的用户对软件进行测试和评价。6.3 6.3 异常与异常处理异常与异常处理 在编写程序时,不仅要注意程序代码的准确性与合理性,还要处理程序中可能出现的异常情况。.NET框架提供了一套称为结构化异常处理的标准错误机制,在这种机制中,如果出现错误或者任何预期之外的事件,都会引发异常。 6.3.1 异常处理概述异常处理概述 在编写程序时,不仅要关心程序的正常运行,还应具有相应的对各种可能发生的不可预测的事件的处理措施。在现代编程语言中,异常处理是解决这些问题的主要方法。
15、异常处理是一种功能强大的机制,用于处理应用程序可能产生的错误或是其他可以中断程序执行的异常情况。异常处理可以捕捉程序执行时发生的错误,使程序更具健壮性。异常与异常处理(续)异常与异常处理(续)异常与异常处理(续)异常与异常处理(续)1.异常类异常类 【例6-1】在程序中应用异常处理的示例。using System;namespace TestExceptionclass Class1STAThreadstatic void Main(string args)int a,b,result;try异常与异常处理(续)异常与异常处理(续) Console.WriteLine(please input
16、 a:);a=int.Parse(Console.ReadLine(); Console.WriteLine(please input b:);b=int.Parse(Console.ReadLine();result=a/b;catch(Exception e)Console.WriteLine(0,e.Message);Console.WriteLine(this is a test example);Console.ReadLine(); 异常与异常处理(续)异常与异常处理(续) 2两种派生的异常类两种派生的异常类 Exception是C#异常的基类,其两种派生的异常类如下: (1)Ap
17、plicationException: ApplicationException是由用户程序(而不是由公共语言运行库)引发的,如果需要自定义异常处理程序,需要从ApplicationException类派生。 (2)SystemException:一般是在发生非致命的、可由用户程序恢复的错误时由公共语言运行时引发。这些错误(如数组超出界限)是由运行时检查失败引起的可以在任何方法的执行过程中发生。SystemException不向Exception添加新功能,不提供导致Exception原因的信息。 6.3.2 异常处理语句异常处理语句 在C#程序中,可以使用异常处理语句处理异常。主要的异常处理
18、语句有throw语句、trycatch语句和trycatchfinally语句。通过这3个异常处理语句可以对可能产生异常的程序代码进行监控。异常与异常处理(续)异常与异常处理(续)异常与异常处理(续)异常与异常处理(续)1.trycatch语句语句 trycatch语句允许在try后面的大括号中放置可能发生异常情况的程序代码,以对这些程序代码进行监控,并在catch后面的大括号中放置处理错误的程序代码,以处理程序发生的异常。trycatch语句的格式如下:try/可能引发异常的语句catch(异常类名 异常变量名)/包括异常处理、异常信息显示等异常与异常处理(续)异常与异常处理(续)2.try
19、catchfinally语句语句 在trycatchfinally语句中,finally语句同样以区块的方式存在,并放在所有trycatch语句的最后面,无论程序是否产生异常,最后都会执行finally语句区块中的程序代码,其格式如下: try /可能引发异常的语句 catch(异常类名 异常变量名) /异常处理部分 finally /最后程序代码 6.3.3 使用使用throw语句语句 使用throw语句可以在特定的情形下,强制抛出异常。throw语句的格式如下: throw 其中,ExObject表示要抛出的异常对象。使用throw语句显式地抛出异常,有助于开发人员控制抛出的异常的相关消息
20、,并允许使用catch语句抛出其他异常,从而使异常处理机制更为灵活。异常与异常处理(续)异常与异常处理(续)异常与异常处理(续)异常与异常处理(续)【例6-4】一个使用throw强制抛出异常的示例。using System;using System.Collections.Generic;using System.Text;namespace TestThrowException class Program static void Main(string args) int a, b; try 异常与异常处理(续)异常与异常处理(续) Console.Write(please input a:
21、); a = int.Parse(Console.ReadLine(); Console.Write(please input b:); b = int.Parse(Console.ReadLine(); if (b = 0) throw new DivideByZeroException(); Console.WriteLine(result=0, a / b); catch (DivideByZeroException e) Console.WriteLine(0, e.Message); 异常与异常处理(续)异常与异常处理(续) catch (FormatException e) Console.WriteLine(0, e.Message); catch (Exception e) Console.WriteLine(0, e.Message); Console.ReadLine(); 小小 结结 典型的软件系统开发过程包括需求分析、系统设计、编码实现和测试发布等主要环节。软件调试和测试是确保软件质量的关键所在。读者应结合本章的内容,在实践中掌握各种程序调试方法。异常出来机制对于保障软件的健壮性和系统的安全性非常重要,因此也应该熟练掌握。第第6 6章结束章结束 谢谢!