OO_Unit3总结
一、JML梳理
二、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: <<MyGroup@6cec342d>>.addPerson(null) 13 Passed: <<MyGroup@1ad708cb>>.addPerson(null) 14 Passed: <<MyGroup@43e4567a>>.addPerson(null) 15 Passed: <<MyGroup@80e4ebdd>>.addPerson(java.lang.Object@3db361f2) 16 Passed: <<MyGroup@16e47edc>>.addPerson(java.lang.Object@7a52b631) 17 Passed: <<MyGroup@4b14684d>>.addPerson(java.lang.Object@81a3b443) 18 Passed: <<MyGroup@234908452>.equals(null) 19 Passed: <<MyGroup@46c37cb2>>.equals(null) 20 Passed: <<MyGroup@6c1894a2>.equals(null) 21 Passed: <<MyGroup@56c3a741>>.addrelation() 22 Passed: <<MyGroup@28b4a9ed>>.addrelation() 23 Passed: <<MyGroup@64d1a742>>.addrelation() 24 25 =============================================== 26 Command line suite 27 Total tests run: 16, Failures: 0, Skips: 0 28 ===============================================
个人认为这样的测试仍然比较简单且测试压力小,可以用于学习,还是需要自己构建更有覆盖性的测试。
四、架构设计
架构设计上基本上按照JML规格的直观描述进行构建,依照题目要求设计最基本的类Main,MyPerson,MyNetWork,MyGroup,继承自官方给出的接口。此外在部分类中还自行设计了一些新的方法,以满足要求并降低单个方法的复杂度。
第一次作业
第一次作业由于不是很熟悉JML,完全按照规格描述进行构建,相信架构和多数人是一样的。层次较少,主要功能都在MyNetwork中实现,其复杂度稍微高了些。
第二次作业
第二次作业新增了MyGroup类,层次化更加凸显,相比于上次作业最显著的改进在于数据结构的管理上,不再一味使用ArrayList保存数据,而是增加了HashMap作为补充,以id作为key值,提高数据的查询效率,同时优化了相应的方法,缩短程序运行时间。
第三次作业
第三次作业架构上没有太大变化,新增了一些方法,其中queryMinPath,queryStrongLinked,queryBlockSum几个方法对性能的要求比较高,需要花一些功夫学习高级的算法,还要复习离散数学和数据结构的相关知识。在这方面我做的不是很好,基本功能满足了但还是出现几个rtle。此外,由于这个单元我将注意力都放在JML规格描述如何转化为我的代码这一过程,忽略了自行设计架构的可能,层次化设计没有做好。
五、Bug情况
本次作业的评测情况可以说是很不好了,第一次作业由于对JML不太熟悉,只关注到JML的具体描述,对整体结构没有很好的把握,在判断isLinked和isCircle上对id相等的情况处理错误,造成强测测试点基本没有过去。而最后一次作业主要的问题在于算法的优化,由于采取了较低级的算法和数据管理,造成rtle的情况较多。
另一方面是本单元的弱侧中测和强测的测试强度相差较大,中测也没有很好的覆盖到要点,因此不能依赖,我在这上面也是栽了跟头。自行构建测试也是作业目的之一,我还需要强化这方面的工作。我在本地采取的测试只是比较简单的功能验证,测试压力有待提高。
六、心得体会