Java程序设计大学教程第九章 开发过程与程序质量保证程序设计首先是一个过程,分为问题建模、
算法设计、编写代码和编译调试等阶段。即使是一个比较简单的程序,我们也应该养成先分析,再下手,最后调试的习惯,严格遵循程序设计过程。
本章介绍软件的开发过程及过程的实施管理,
从程序质量保证的高度讨论了程序的调试与测试,重点讲述了 Java程序的调试方法、程序中的异常处理以及单元测试方法。
Java程序设计大学教程
9.1 软件开发过程概述
软件生命周期
软件开发过程
软件质量与测试
Java程序设计大学教程
9.1.1 软件生命周期计算机软件开发有它们自己的周期,称为系统开发生命周期
( SDLC)。 SDLC分为多个阶段,包括:
分析需求、设计系统、
创建系统、运行系统、
维护系统。每个阶段包括有许多任务。
分析需求维护系统运行系统创建系统设计系统问题发现系统运行问题陈述 解决方案描述软件和硬件实现
Java程序设计大学教程
9.1.2 软件开发过程
开发一个软件系统的参与者包括:系统所有者、使用者、分析者、设计者、构建者以及 IT供货商和顾问这
6类。他们的共同目标是创建符合需要的软件系统。
软件开发的项目管理是和软件开发的基本过程紧密结合的。
通常软件开发过程可以分为若干个不同的开发阶段实施,每个阶段都由不同角色的开发人员担当,并产生可交付的软件制品。
一个典型的软件系统开发过程包含了定义边界、问题分析、需求分析、系统分析、系统设计、构造实现、
测试和发布等 7个阶段。
Java程序设计大学教程
9.1.3 软件质量与测试
优质软件的定义是:软件能够满足用户显式或隐式的需求,文档齐全,符合规定的操作标准,在其开发使用的硬件上高效运行。
软件测试是软件质量的首要保证。测试应包括黑盒测试和白盒测试。
一般来说,软件测试可分为三种测试,即程序测试、系统测试和用户测试。
Java程序设计大学教程
9.2 程序调试
程序是软件的本体,又是软件研究的对象。
程序的质量决定软件的质量。
在软件开发过程中,程序编码、调试、测试是一个持续的循环过程,只有在对程序进行了彻底地调试与测试后才能交付最终用户使用。
Java程序设计大学教程
9.2.1 程序调试的概念
在程序在编译通过以后,仍然可能会出现以下两类错误:
运行时刻错误
逻辑错误
对于这两类错误,调试器都可以帮助我们快速定位错误,
并通过对程序运行的跟踪和对变量值的监视帮助我们找到错误的真正原因和解决错误的途径。
程序调试的主要内容可以概括为如下的几方面:
调试的准备和开始
控制程序的执行
断点的使用
监视和检查数据的值
Java程序设计大学教程
9.2.1 程序调试的概念通过,窗口,->“调试,
菜单项打开各种调试窗口 。
在,监视,窗口中监视当前表达式运行中的值 。
单击选定代码行左边的空白,设置调试断点 。
“调用栈,窗口列出了程序最近的函数调用 。
显示当前程序执行到的位置 。
,局部变量,窗口显示局部变量的值 。
NetBeans IDE的调试环境
Java程序设计大学教程
9.2.2 使用断点
设置断点
察看断点
Java程序设计大学教程
9.2.3 监视和检查数据的值
观察局部变量,
打开,局部变量,窗口( Alt-Shift-1)或,监视,窗口( Alt-Shift-2)。右键单击某个变量或监视,然后选择,创建固定监视,。
跟踪变量或表达式值的变化:
通过选择,窗口,->“调试,->“监视,菜单可以打开,监视,窗口。
察看调用栈,
可以随时选择,窗口,->“调试,->“调用栈,
( Alt -Shift-3)来打开,调用栈,窗口。
Java程序设计大学教程
9.2.4 调试过程
1,准备调试
2,启动调试
3,监视代码
单步执行代码。
越过( F8)
步入( F7)
步出( Alt-Shift-F7)
查看调试信息。
修复任何错误并继续调试。
4,完成调试
Java程序设计大学教程
9.3 单元测试
单元测试是一种小粒度的测试,以测试程序的某个功能或代码块。单元测试是程序设计中的白盒测试,
可以完成语义检查。
由 Erich Gamma和 Kent Beck提供的 JUnit是一个开放源代码的 Java测试框架,用于编写和运行可重复的测试。它可以使测试代码与产品代码分开,易于集成到测试人员的程序设计过程中。
先写测试,再写代码是面向对象提倡的一种设计原则。 JUnit单元测试可以支持这种测试驱动的软件开发方式。
Java程序设计大学教程
9.3 单元测试
通过使用 NetBeans IDE的 JUnit测试生成器,可以创建在单元测试中用作框架的兼容测试类。一旦设计好测试类,NetBeans IDE将在调试器中运行测试,
以检查测试是否有错误。
在单元测试代码中,所有的测试类都继承自
TestCase抽象类,TestCase类中包含有 setUp、
tearDown方法分别用于测试的初始化和结束后的清理任务。
在编写的测试代码中可使用 Assert静态类,它是一系列断言方法的集合。 JUnit提供的断言方法包括基础断言、数字断言、字符断言、布尔断言、对象断言。
Java程序设计大学教程
9.4 异常与异常处理在应用程序开发中如何检测、处理程序的运行错误是一个很重要的问题。虽然调试和测试可以帮助我们发现大部分程序错误,但有些错误是不可预料的。例如,当程序涉及到与外设的数据交换或操作外设,如要求用户输入、读写磁盘等时,
错误的发生是程序无法控制的,如输入非法字符、
磁盘不能读写等。这些情况不仅会导致应用程序异常中止而且可能引起系统的崩溃。针对这些问题,Java同时提供了一套强大的异常处理机制,
可以帮助我们处理和预防潜在的错误。巧妙地利用它,可以使程序更为健壮,使用更为安全。
Java程序设计大学教程
9.4.1 异常与异常类
就程序运行而言,异常就是指程序运行时所发生错误或不正常的情况。就程序设计而言,Java中所谓,异常,是指程序抛出的一个异常对象,通常用来标志一个程序错误的发生。
异常类是 Java异常处理机制的核心,Java提供的所有异常类都是
Exception类的派生类。用户也可以从 Exception类或其子类派生一个自定义的异常类。
受查异常能够由 java编译器进行分析。受查异常在那些显然可能产生错误的方法中抛出。非受查异常是派生自
RuntimeException类的所有异常。非受查异常不能由编译器进行检查。
在 Java中,错误和各种异常情况都是通过抛出和捕获异常对象来进行处理的。当一个对象抛出异常后,可以自己捕获处理,也可以交给其他对象处理。如果捕获异常的对象无法处理,还可以继续抛出,由其他对象捕获处理。
Java程序设计大学教程
9.4.1 异常与异常类
Java异常类的层次结构
Java程序设计大学教程
9.4.2 异常处理机制
1.抛出异常
2.捕获和处理异常
3.重抛和传递异常
4.异常保护块异常对象对象 对象抛出异常的程序捕获异常的程序抛出 捕获
Java中使用 throw语句抛出异常。
对于受查异常,必须在其方法头用
throws关键字声明它可能抛出的异常。
Java中使用 try-catch语句块捕获和处理异常。如果 try块内的任何代码抛出了由 catch子句指定类型的异常,则程序跳过 try块中的其他代码,
执行 catch语句块中的处理器代码。
还可以使用多个 catch语句块捕捉多个类型的异常。
Java中使用 finally语句可以形成一个资源保护块,确保回收受保护的资源。 finally后面的语句不论是否发生异常,都会执行的。
Java程序设计大学教程
9.4.3 利用异常处理编程
异常处理机制是一种将程序中的普通代码和错误处理分开来解决问题的有效途径。利用异常处理编程不仅能使程序更加健壮,而且使程序更加简洁、明了。
在 try块中可以同时捕捉多个类型的异常,并分别对每种类型加以不同的处理。
捕获多个异常时,catch语句块的顺序十分关键。
设计良好的代码应该预见潜在的问题,特别是用户操作导致的潜在问题。有效地使用异常有助于解决潜在的问题,做到预防性设计。