软件构造实验四

2020年春季学期
计算机学院《软件构造》课程

 

 

 

 

Lab 4实验报告
 

 

 

 

 

 

 

 

 

 

 

 

目录

 

1 实验目标概述··· 1

2 实验环境配置··· 1

3 实验过程··· 1

3.1 Error and Exception Handling· 2

3.1.1 处理输入文本中的三类错误··· 2

3.1.2 处理客户端操作时产生的异常··· 2

3.2 Assertion and Defensive Programming· 2

3.2.1 checkRep()检查rep invariants· 2

3.2.2 Assertion/异常机制来保障pre-/post-condition· 2

3.2.3 你的代码的防御式策略概述··· 2

3.3 Logging· 2

3.3.1 异常处理的日志功能··· 2

3.3.2 应用层操作的日志功能··· 2

3.3.3 日志查询功能··· 2

3.4 Testing for Robustness and Correctness· 2

3.4.1 Testing strategy· 2

3.4.2 测试用例设计··· 2

3.4.3 测试运行结果与EclEmma覆盖度报告··· 2

3.5 SpotBugs tool 2

3.6 Debugging· 3

3.6.1 EventManager程序··· 3

3.6.2 LowestPrice程序··· 3

3.6.3 FlightClient/Flight/Plane程序··· 3

4 实验进度记录··· 3

5 实验过程中遇到的困难与解决途径··· 4

6 实验过程中收获的经验、教训、感想··· 4

6.1 实验过程中收获的经验和教训··· 4

6.2 针对以下方面的感受··· 4

 

 

 

  1. 实验目标概述

本次实验重点训练学生面向健壮性和正确性的编程技能,利用错误和异常处理、断言与防御式编程技术、日志/断点等调试技术、黑盒测试编程技术,使程序可在不同的健壮性/正确性需求下能恰当的处理各种例外与错误情况,在出错后可优雅的退出或继续执行,发现错误之后可有效的定位错误并做出修改。

实验针对Lab 3中写好的ADT代码和基于该ADT的三个应用的代码,使用以下技术进行改造,提高其健壮性和正确性:

  1. 错误处理
  2. 异常处理
  3. Assertion和防御式编程
  4. 日志
  5. 调试技术
  6. 黑盒测试及代码覆盖度
  1. 实验环境配置

简要陈述你配置本次实验所需环境的过程,必要时可以给出屏幕截图。

特别是要记录配置过程中遇到的问题和困难,以及如何解决的。

 

在网上找到实验手册给的网址,访问它的教程界面,找到直接在market里面安装的方法,如图安装了spotbugs。

 

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

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

  1. 实验过程

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

    1. Error and Exception Handling
      1. 处理输入文本中的三类错误

三种错误包括输入文件中存在不符合语法规则的语句,输入文件中存在标签完全一样的元素,输入文件中各元素之间的依赖关系不正确

 

 

对于其他操作符号的处理

检查是否已经加入了resource list

 

创建的myexception类,用来定义上述的三类异常,并且在应用中加以捕捉,同时可用在后面的日志里加以捕捉

 

针对上述可能出现的异常加以捕捉

 

 

也可以直接搭配if语句 抛出 myexception 打印错误信息

      1. 处理客户端操作时产生的异常

 

 

随时会检查输入数据个数,格式等

 

 

自己还编写了check函数用于检查,对应数据结构的正确性,再做后续操作

通过设置flag的方法也可以,检查flag的值有没有被改变,从而判断,输入情况

通过判断由输入数据解析出的由输入数据分割成的组长短,判断输入数据的输入情况

 

 

 

 

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

 

有些类的RI 比较明显的,可以设置如上图的checkrep,定义年,月,日,小时,分,秒的范围,避免输入的值不在范围内,对后面的程序造成影响,所以设定checkrep。

有许多RI比较明显:

 

 

      1. Assertion/异常机制来保障pre-/post-condition

 

时间类的checkrep里面就使用了assert

 

      1. 你的代码的防御式策略概述

 

首先是普通的异常抛出和捕捉,常见的io的地方

也通过把读入句子进行分割,得到要处理的数组,对数组的长度做判断,这样可以在一些方面检验错误,算一种防御机制。

 

自己创建chek函数,可以针对某种特定的数据结构,可复用性优良,在程序中多次调用

也在部分地方抛出自己定义的myexception,然后在之后的函数里面捕捉。

    1. Logging

首先是下载 log4j,然后做一些适当的配置

 

 

 

配置到库

 

添加一个是必备的配置文件

 

 

在程序中的实际调用情况

 

 

      1. 异常处理的日志功能

 

 

在程序中的实际调用情况,在try catch语句里混合使用,在抛出异常之前使用,调用logger变量下的方法

 

 

      1. 应用层操作的日志功能

 

 

 

直接在try catch语句里面使用,可以在抛出异常之前,然后日志会被储存在之前设定的路径里面。

 

 

      1. 日志查询功能

 

用contian方法,三个主程序都添加了日志查询功能,按行读取文件,根据输入的查询信息进行筛选

 

增加第9个操作,给出操作命令例子,用户可以根据自己的需求

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    1. Testing for Robustness and Correctness
      1. Testing strategy

 

 

      1. 测试用例设计

开头格式被改变不完整

 

空白文件

 

 

 

可能存在小错误的文件

 

 

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

 

整体覆盖率差不多27%,还有许多地方需要修改一下,至少应该补充到50%

    1. SpotBugs tool

发现了哪些错误,每种错误代表什么不良的编程习惯

 

Bug: Nullcheck of FlightScheduleApp.flight_resource at line 102 of value previously dereferenced in apps.FlightScheduleApp.delete_plane()

 

A value is checked here to see whether it is null, but this value can't be null because it was previously dereferenced and if it were null a null pointer exception would have occurred at the earlier dereference. Essentially, this code and the previous dereference disagree as to whether this value is allowed to be null. Either the check is redundant or the previous dereference is erroneous.

 

Rank: Troubling (11), confidence: Normal

Pattern: RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE

Type: RCN, Category: CORRECTNESS (Correctness)

这里检查一个值,看它是否为空,但是这个值不能为空,因为它以前被解引用过,如果它是空的,那么在之前的解引用中就会出现空指针异常。实际上,这段代码和前面的解引用不同意是否允许该值为null。要么检查是多余的,要么之前的取消引用是错误的。

 

 

Bug: Dereference of the result of readLine() without nullcheck in apps.FlightScheduleApp.add_flightentry()

 

The result of invoking readLine() is dereferenced without checking to see if the result is null. If there are no more lines of text to read, readLine() will return null and dereferencing that will generate a null pointer exception.

 

Rank: Of Concern (15), confidence: Normal

Pattern: NP_DEREFERENCE_OF_READLINE_VALUE

Type: NP, Category: STYLE (Dodgy code)

调用readLine()的结果在不检查结果是否为空的情况下被解除引用。如果没有更多的文本可读,readLine()将返回null或者解引用,这会生成空指针异常。

 

    1. Debugging
      1. EventManager程序

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

发现并定位错误的过程

你如何修正错误

修复之后的测试结果

 

之前的代码容易出现空指针问题,尤其在加入第一组数据的时候

 

改变数结构,把结构变成list套list的方式,能够储存多对时间的信息,方便后续比较。

 

              try {

                     if (day <0 || day>365) {

                            throw new RuntimeException("day is not proper");

                     }

                     if (start <0 || start>=24) {

                            throw new RuntimeException("start time is not proper");

                     }

                     if (end <=0 || end>24) {

                            throw new RuntimeException("end time is not proper");

                     }

              } catch (RuntimeException  e) {

                     // TODO: handle exception

                     System.out.println(e.getMessage());

              }

还添加了对于时间的判断,防止出现异常时间。

主要内核改成了双重循环嵌套,依次比较

 

 

修复之后的测试结果

 

      1. LowestPrice程序

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

发现并定位错误的过程

你如何修正错误

修复之后的测试结果

 

       程序思想为递归和贪心,若减去特价商品得出负数则直接break

测试时抛出空指针异常

修正:

避免指针越界,特价size比其他长。

Continue改为break。

 

 

最后的测试结果

      1. FlightClient/Flight/Plane程序

代码对航班按出发时间进行排序,遍历,随再机选取一个飞机,如果与该航班无冲突,则分配,如果冲突的话又再次重新随机选取,重复多次没有分配成功退出,最后检查所有航班是否都已经分配了不同的飞机

 

三个测试都完全通过

静态检查错误, compareto方法不能进行排序,第二个错误calendar不能用大于小于,一个地方未用equals,运行时出现死循环。

       重写compareto方法使list能够排序,把大于小于号改为compareto,我循环了10000次还没结束的话自动退出,将==改为equals

  1. 实验进度记录

请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。

每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。

不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。

日期

时间段

计划任务

实际完成情况

6.1

8:00-22:00

阅读 实验报告,配置工具环境

完全完成

6.3

8:00-22:00

完成3.1

完全完成

6.4

8:00-10:00

完成3.2

完全完成

6.5

8:00-20:00

完成3.3

完全完成

6.6

8:00-24:00

完成3.4

完全完成

6.8

8:00-24:00

完成3.5,3.6

没有完全完成

  1. 实验过程中遇到的困难与解决途径

遇到的难点

解决途径

工具网站是全英文的,看不太懂,不知道怎么用,半天也下载不下来

 

 

翻译理解,上国内网站查询相关工具的使用

上次实验RI不怎么完整,AF也是,有些功能文件的作用忘记了

 

 

阅读代码回忆功能,加上必要的注释,加上一些RI AF

测试代码度盖度太低

 

 

重新阅读代码,改写测试文件,上互联网查询相关方法

 

Debug部分感觉难度比较大,不会

 

阅读代码的注释部分,重新理解

 

总是遇到测试不通过问题

 

耐心重新审查文件

  1.  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值