软件构造实验四

  1. 实验目标概述

本次实验重点训练学生面向健壮性和正确性的编程技能,利用错误和异常处 理、断言与防御式编程技术、日志/断点等调试技术、黑盒测试编程技术,使程序 可在不同的健壮性/正确性需求下能恰当的处理各种例外与错误情况,在出错后 可优雅的退出或继续执行,发现错误之后可有效的定位错误并做出修改。 实验针对 Lab 3 中写好的 ADT 代码和基于该 ADT 的三个应用的代码,使用 以下技术进行改造,提高其健壮性和正确性:

⚫ 错误处理

⚫ 异常处理

⚫ Assertion 和防御式编程

⚫ 日志

⚫ 调试技术

⚫ 黑盒测试及代码覆盖

  1. 实验环境配置

在marketplace中安装在 Eclipse IDE 中安装配置 SpotBugs

Windows 10

Eclipse

Git

在这里给出你的GitHub Lab4仓库的URL地址(Lab4-学号)。

https://github.com/ComputerScienceHIT/Lab4-1170300527.git

  1. 实验过程

请仔细对照实验手册,针对每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。

    1. Error and Exception Handling

创建异常类,继承exception,根据可能方式的异常定义异常类的名字,增加其可读性,构造方法继承有参和无参两种,有参可以获得更多的输出信息

软件构造实验四

其中有共有的异常属性,如初始化的格式错误,未使用科学计数法,lable类型的错误,缺失中心物体等,还有各个属性私有的,轨道相同,半径异常,轨道数目等等,可以根据异常类的名字和信息更好的定位发生错位的原因

在控制台简单输出,并将其存入日志中,提示用户输入新的文件路径,重新读取文件

    1. Assertion and Defensive Programming
      1. checkRep()检查invariants

为每个基础的类编写checkRep,判断是否满足要求,非null或是否为正数等,在lab3中以完成相应处理

      1. Assertion保障pre-/post-condition

对操作的前置条件和后置条件使用assert进行断言检查如输入的不为空字符串,返回的大于0,对象不是null例如:

新增轨道电子数大于0

删除轨道时包含该轨道

删除电子时包含该轨道且电子数小于轨道包含电子数

特定轨道增加电子

物理距离大于0

创建新person时检查了checkRep

删除人时检查name是否为空

增加关系时检查name和intimacy

可复用的API,输入对象不是null,返回值的大小

等等。。。。。。。。

主要根据lab3及函数运行过程中肯发生的错误及一定不可能输出的结果提前进行assert,确保用户得到正确的结果

    1. Logging
      1. 写日志

使用logging日志框架,使用handle设置输出文件,format设置输出格式。

为三个应用分别创建日志,所有异常设为severe级别,处理方法为warning级别,操作为info级别,保存格式为时间,级别,类,方法,异常类,具体异常,如何处理,对操作来说不包括后面的异常及处理。

      1. 日志查询

日志查询显然不是简单地输出到文件,关闭JVM后再手动去查询,而是需要在运行时读取输出的日志。由于日志系统只支持输出到控制台或文件,而控制台的日志无法读取,于是将日志输出到一个文件中,并读取即可

使用RandomAccessFile实时读取新增数据,只是读取新增的内容并存储,之后根据输入的时间,等级,方法进行过滤输出

    1. Testing for Robustness and Correctness
      1. Testing strategy

对含有输入的函数在测试时要重定向输入,使其可以无需手动输入

对一般情况进行测试,对极端边界情况,错误等等进行测试,检验其健壮性。使用合法和非法数据的边界值测试方法,判断是否可以对边界情况进行检查。具体在代码及注释中

对异常处理,需要包含输入的函数也进行了测试,采用了,重新定义输入,将正确的文件路径当作输入传入

      1. 测试用例设计

主要考虑边界情况,极端情况,增加代码覆盖率,具体在代码及注释中体现

      1. 测试运行结果与EclEmma覆盖度报告

对GUI,日志读取,故代码覆盖率较低,一些类的get,set等方法不需要测试

创建的异常类包含传入message和无参的两个构造方法,但使用的时候大部分只使用了一个,,为以后更改方便都保留了下来,也降低了覆盖率

Assert等检查遇到的也很少

软件构造实验四软件构造实验四软件构造实验四软件构造实验四

软件构造实验四

    1. SpotBugs tool

比较之后可以break的要及时退出,子类与父类转换的问题

String.bytes()里面用charset优于string软件构造实验四

仅有一个,为debug项目中,无需修改

    1. Debugging
      1. 理解待调试程序的代码思想

这不是debug。。。。。。。这是在理解算法啊

FindMedianSortedArrays用二分查找两个数组的中位数

removeComments较为简单,需要去掉注释,需要考虑//情况与/**/的嵌套

TopVotedCandidate应该是最难的了吧,算法真的神奇,看了好久,第i行代表获得了i票,每行按时间排序,第i行0列的时间为获得票数最多的数量,再查找i行时间最接近的即为最后获得票数最多的

      1. 发现并定位错误的过程

编写测试用例,临界情况测试,断点测试,print输出中间结果

      1. 如何修正错误

FindMedianSortedArrays

软件构造实验四

软件构造实验四

RemoveComments:增加去除//代码,下标存在越界,要-1

软件构造实验四

TopVotedCandidate:边界情况,c代表的含义,lo-1

软件构造实验四

软件构造实验四

软件构造实验四  软件构造实验四  软件构造实验四