软件构造lab4

目录

1 实验目标概述 1
2 实验环境配置 1
3 实验过程 1
3.1 Error and Exception Handling 2
3.2 Assertion and Defensive Programming 2
3.2.1 checkRep()检查invariants 2
3.2.2 Assertion保障pre-/post-condition 2
3.3 Logging 2
3.3.1 写日志 2
3.3.2 日志查询 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 理解待调试程序的代码思想 3
3.6.2 发现并定位错误的过程 3
3.6.3 如何修正错误 3
3.6.4 结果 3
4 实验进度记录 3
5 实验过程中遇到的困难与解决途径 3
6 实验过程中收获的经验、教训、感想 4
6.1 实验过程中收获的经验和教训 4
6.2 针对以下方面的感受 4

1实验目标概述
本次实验重点训练学生面向健壮性和正确性的编程技能,利用错误和异常处
理、断言与防御式编程技术、日志/断点等调试技术、黑盒测试编程技术,使程序 可在不同的健壮性/正确性需求下能恰当的处理各种例外与错误情况,在出错后 可优雅的退出或继续执行,发现错误之后可有效的定位错误并做出修改。
实验针对 Lab 3 中写好的 ADT 代码和基于该 ADT 的三个应用的代码,使用
以下技术进行改造,提高其健壮性和正确性:
? 错误处理
? 异常处理
? Assertion 和防御式编程
? 日志
? 调试技术
? 黑盒测试及代码覆盖度
2实验环境配置
简要陈述你配置本次实验所需环境的过程,必要时可以给出屏幕截图。
特别是要记录配置过程中遇到的问题和困难,以及如何解决的。
实验环境设置请参见 Lab-0 实验指南。
除此之外,本次实验需要你在 Eclipse IDE 中安装配置 SpotBugs

3.实验过程
请仔细对照实验手册,针对每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。
3.1Error and Exception Handling
Exception包: 包含各个异常类
exception1 :前缀不符合规范
exception2 :标签非法
exception3 :超出元素限定范围
exception4 :缺省属性
exception5 :未使用规定字符
exception6 :元素名称重复
exception7 :依赖关系错误
每个异常类包含构造函数和tostring方法

AtomStructure
检查方式: assert this.Tracks.size()>=this.trackobject.size();,检查轨道数量和电子组集合大
小是否相等
SocialCircleSystem
int j=0;
for(int i=0;i {
for(Friend aFriend :this.trackobject.get(i))
{
j++;
}
}
assert j ==allfriend.size();
即检查朋友数量和加入该关系 络的是否相等

3.2.2Assertion保障pre-/post-condition
对于增加和减少元素的地方,每次检查是否加入和减少成功

3.3Logging
3.3.1写日志
使用 log4j 库 对于每个用户的选项,执行一次之后就将其加入日志,加入日志的 debug 级别,对于捕获到每个异常时,将其信息加入 error 级别。

3.3.2日志查询
用split进行分隔匹配,如果符合要求,就加入字符串数组,最后输出字符串数组
这里选择用日期进行查询,输入日期即可查询

3.4Testing for Robustness and Correctness
3.4.1Testing strategy
为每种异常写各自的文件,并进行测试,测试各种不合法的数据
共21个异常文件

3.4.2测试用例设计
例如:try {
aStellarSystem.readfromfile(“txtexception/StellarSystem.txt”);
} catch (exception1 e) {
assertEquals(“文件内容错误,定义前缀不合规范”, e.toString());
}
Catch每种异常,抛出其它异常,判断异常输出字符串是否和期望相等
3.4.3测试运行结果与EclEmma覆盖度 告

3.5SpotBugs tool
发现了哪些错误,每种错误代表什么不良的编程习惯
对代码修改,消除这些错误。
对于不使用的变量,删除即可.

3.6Debugging
3.6.1理解待调试程序的代码思想
6 FindMedianSortedArrays: 思想:这里采用了一种比较独特的算法来取中位数,由于输入数组是两个有序数组,所以这 里将两个数组定义分别分割成左右两部分, A [0],A [1],…,A [i-1] | A [i],A [i + 1],…,A [m-1] B [0],B [1],…,B [j-1] | B [j],B [j + 1],…,B [n-1]这两部分满足 1)left_part.size() == right_part.size() (2)max(left_part) = m,我们只需要设置:i = 0?m,j =(m + n + 1)/ 2-i (2)B [j-1] A [i] 意味着 A [i]太小。必须调整 i 得到 B [j-1] B [j] 意味着 A [i-1]太大,必须减少 i 得到 A [i-1] ”,若碰到,则将其 变为 false,防止记录/ *** /中的信息,将原字符数组每个字符串转为 char【】型,通过判 断是否为/ /中信息来将/ */ 中的信息去掉 TopVotedCandidate: 该算法用 A 来记录某个时间点的获胜者,再用二分查找来在里面查找获胜者是谁。

3.6.2发现并定位错误的过程
FindMedianSortedArrays:
看来整个函数,发现判断奇数偶数的部分不太对
(m + n + 1) % 2 == 1
应该是判断为奇数就返回最左边最大值,这里不应该再+1
RemoveComments:
首先,发现最后 if (inBlock && newline.length() > 0) {
ans.add(new String(newline));
}
这里 inblock 错位,这里应该是 false 时表示可以加入,而这里确实 inBlock 为为真时可以加
入。
其次,调试时发现将/也加入了改结果,用 debug 发现是最后判断*/时,由于判断 char[i]和
Char【i+1】时提前将 inblock 置为 false,导致将这个加入软件构造课程实验 告 实验 4:异常与错误处理、防御式编程、测试和调试
8
同时发现缺少了判断//出现的情况处理的结果
int c = count.getOrDefault(p, 1);这里应该是 c 是 p 这个人当前的得票数+1,即指这个人在这
时候得票
int j = Math.max(lo, 0);这里应该 lo-1
if (A.get(i).get(mi).time 这里应该改成

3.6.3如何修正错误
FindMedianSortedArrays:
改为(m + n ) % 2 == 1
RemoveComments:
将判断是否到/的条件改为(i>2&&inBlock && i ’ &&
chars[i] == ‘/’),这样就不会提前修改 inblock 了,需要注意的是,应该加一个判断 i 是否>2
,其实是为了避免开始时访问 char[-1]导致数组越界。
同时加入if(i //这个功能
{
break;
}
来处理//时的情况。
int c = count.getOrDefault(p, 1);这里应该是 c 是 p 这个人当前的得票数+1,即指这个人在这
时候得票即改为 int c = count.getOrDefault(p, 0) 指这个人要是没票则将他得票置零后+1
否则取出他得的票+1
int j = Math.max(lo, 0);这里改成 lo-1
if (A.get(i).get(mi).time 这里应该改成

3.6.4结果

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年5月16日
下一篇 2019年5月16日

相关推荐