OO_Unit3总结

OO_Unit3总结

一、JML梳理

将JML体系以思维导图的形式进行整理,如下所示。

OO_Unit3总结_第1张图片

二、SMT Solver

配置过程中出现了蜜汁bug,修复未果,这个坑之后再填吧……

三、JMLUnitNG

JMLUnitNG主要用来根据JML语言自动生成数据并进行测试。针对Group接口进行测试,结果如下所示。

 1 java -jar .\jmlunitng.jar .\jml\MyGroup.java
 2  javac -cp .\jmlunitng.jar .\jml\*.java
 3  java -jar .\openjml.jar -rac .\jml\MyGroup.java
 4  java -cp .\jmlunitng.jar jml.MyGroup_JML_Test
 5  [TestNG] Running:
 6    Command line suite
 7  8  Failed: racEnabled()
 9  Passed: constructor MyGroup(0)
10  Passed: constructor MyGroup(-2147483648)
11  Passed: constructor MyGroup(2147483647)    
12  Passed: <>.addPerson(null)
13  Passed: <>.addPerson(null)
14  Passed: <>.addPerson(null)  
15  Passed: <>.addPerson(java.lang.Object@3db361f2)
16  Passed: <>.addPerson(java.lang.Object@7a52b631)
17  Passed: <>.addPerson(java.lang.Object@81a3b443)
18  Passed: <.equals(null)
19  Passed: <>.equals(null)
20  Passed: <.equals(null)
21  Passed: <>.addrelation()
22  Passed: <>.addrelation()
23  Passed: <>.addrelation()
24      
25  ===============================================
26  Command line suite
27  Total tests run: 16, Failures: 0, Skips: 0
28  ===============================================

个人认为这样的测试仍然比较简单且测试压力小,可以用于学习,还是需要自己构建更有覆盖性的测试。

四、架构设计

架构设计上基本上按照JML规格的直观描述进行构建,依照题目要求设计最基本的类Main,MyPerson,MyNetWork,MyGroup,继承自官方给出的接口。此外在部分类中还自行设计了一些新的方法,以满足要求并降低单个方法的复杂度。

第一次作业

第一次作业由于不是很熟悉JML,完全按照规格描述进行构建,相信架构和多数人是一样的。层次较少,主要功能都在MyNetwork中实现,其复杂度稍微高了些。

OO_Unit3总结_第2张图片

OO_Unit3总结_第3张图片

第二次作业

第二次作业新增了MyGroup类,层次化更加凸显,相比于上次作业最显著的改进在于数据结构的管理上,不再一味使用ArrayList保存数据,而是增加了HashMap作为补充,以id作为key值,提高数据的查询效率,同时优化了相应的方法,缩短程序运行时间。

OO_Unit3总结_第4张图片

OO_Unit3总结_第5张图片

第三次作业

第三次作业架构上没有太大变化,新增了一些方法,其中queryMinPath,queryStrongLinked,queryBlockSum几个方法对性能的要求比较高,需要花一些功夫学习高级的算法,还要复习离散数学和数据结构的相关知识。在这方面我做的不是很好,基本功能满足了但还是出现几个rtle。此外,由于这个单元我将注意力都放在JML规格描述如何转化为我的代码这一过程,忽略了自行设计架构的可能,层次化设计没有做好。

OO_Unit3总结_第6张图片

OO_Unit3总结_第7张图片

五、Bug情况

本次作业的评测情况可以说是很不好了,第一次作业由于对JML不太熟悉,只关注到JML的具体描述,对整体结构没有很好的把握,在判断isLinked和isCircle上对id相等的情况处理错误,造成强测测试点基本没有过去。而最后一次作业主要的问题在于算法的优化,由于采取了较低级的算法和数据管理,造成rtle的情况较多。

另一方面是本单元的弱侧中测和强测的测试强度相差较大,中测也没有很好的覆盖到要点,因此不能依赖,我在这上面也是栽了跟头。自行构建测试也是作业目的之一,我还需要强化这方面的工作。我在本地采取的测试只是比较简单的功能验证,测试压力有待提高。

六、心得体会

虽然表面上看来,本单元的代码量要比前两个单元小很多了,但是最终结果却不比前面好,对于JML作用和定位的理解有所偏差,仅仅完成JML规定的部分并不能满足测试,性能优化上仍需努力,也要注意自己构建高效的架构。此外,契约式编程的学习让我对不同编程者之间的沟通有了新的认识,了解了调用者和被调用者如何配合使得程序完美运行。还有就是JML工具链的使用体验真的不佳,构造junit测试效率也不高,随着理解的深入,希望我能最大化地运用好JML这一工具吧。

你可能感兴趣的:(OO_Unit3总结)