OO第三单元总结

 

Part 1 JML基础

 Java Modeling Language(JML)是一种行为规范语言吗,用于规定Java类和方法的行为和接口。通过jml可以严谨的定义方法和类的行为,只需要阅读jml就可以无歧义的理解类和方法的功能,并可以开展测试。

 

使用JML的两个主要好处是:

1、对Java程序模块(即类和接口)的行为的准确,明确的描述以及Java代码的文档 

2、工具支持的可能性

 

jml工具目前仍在开发中(疑似弃坑),工具链尚不完善

jml工具链:

openJML:对JML注释的完整性进行检查。

JMLUnitNG:根据jml自动生成测试样例并进行测试。

Part 2 JMLunit测试

感谢https://www.cnblogs.com/nbao01/p/12935615.html这位同学的傻瓜式教程

C:Usersa0061Desktopjmltest>java -cp jmlunitng.jar test.MyGroup_JML_Test
[TestNG] Running:
  Command line suite

Failed: racEnabled()
Passed: constructor MyGroup(-2147483648)
Passed: constructor MyGroup(0)
Passed: constructor MyGroup(2147483647)
Failed: <<test.MyGroup@6842775d>>.addPerson(null)
Failed: <<test.MyGroup@574caa3f>>.addPerson(null)
Failed: <<test.MyGroup@1761e840>>.addPerson(null)
Passed: <<test.MyGroup@6c629d6e>>.addRelationn(-2147483648, -2147483648, -2147483648)
Passed: <<test.MyGroup@5ecddf8f>>.addRelationn(-2147483648, -2147483648, -2147483648)
Passed: <<test.MyGroup@3f102e87>>.addRelationn(-2147483648, -2147483648, -2147483648)
Passed: <<test.MyGroup@27abe2cd>>.addRelationn(0, -2147483648, -2147483648)
Passed: <<test.MyGroup@5f5a92bb>>.addRelationn(0, -2147483648, -2147483648)
Passed: <<test.MyGroup@6fdb1f78>>.addRelationn(0, -2147483648, -2147483648)
Passed: <<test.MyGroup@51016012>>.addRelationn(2147483647, -2147483648, -2147483648)
Passed: <<test.MyGroup@29444d75>>.addRelationn(2147483647, -2147483648, -2147483648)
Passed: <<test.MyGroup@2280cdac>>.addRelationn(2147483647, -2147483648, -2147483648)
Passed: <<test.MyGroup@1517365b>>.addRelationn(-2147483648, 0, -2147483648)
Passed: <<test.MyGroup@4fccd51b>>.addRelationn(-2147483648, 0, -2147483648)
Passed: <<test.MyGroup@44e81672>>.addRelationn(-2147483648, 0, -2147483648)
Passed: <<test.MyGroup@60215eee>>.addRelationn(0, 0, -2147483648)
Passed: <<test.MyGroup@4ca8195f>>.addRelationn(0, 0, -2147483648)
Passed: <<test.MyGroup@61baa894>>.addRelationn(0, 0, -2147483648)
Passed: <<test.MyGroup@768debd>>.addRelationn(2147483647, 0, -2147483648)
Passed: <<test.MyGroup@490d6c15>>.addRelationn(2147483647, 0, -2147483648)
Passed: <<test.MyGroup@7d4793a8>>.addRelationn(2147483647, 0, -2147483648)
Passed: <<test.MyGroup@449b2d27>>.addRelationn(-2147483648, 2147483647, -2147483648)
Passed: <<test.MyGroup@5479e3f>>.addRelationn(-2147483648, 2147483647, -2147483648)
Passed: <<test.MyGroup@27082746>>.addRelationn(-2147483648, 2147483647, -2147483648)
Passed: <<test.MyGroup@66133adc>>.addRelationn(0, 2147483647, -2147483648)
Passed: <<test.MyGroup@7bfcd12c>>.addRelationn(0, 2147483647, -2147483648)
Passed: <<test.MyGroup@42f30e0a>>.addRelationn(0, 2147483647, -2147483648)
Passed: <<test.MyGroup@24273305>>.addRelationn(2147483647, 2147483647, -2147483648)
Passed: <<test.MyGroup@5b1d2887>>.addRelationn(2147483647, 2147483647, -2147483648)
Passed: <<test.MyGroup@46f5f779>>.addRelationn(2147483647, 2147483647, -2147483648)
Passed: <<test.MyGroup@1c2c22f3>>.addRelationn(-2147483648, -2147483648, 0)
Passed: <<test.MyGroup@18e8568>>.addRelationn(-2147483648, -2147483648, 0)
Passed: <<test.MyGroup@33e5ccce>>.addRelationn(-2147483648, -2147483648, 0)
Passed: <<test.MyGroup@5a42bbf4>>.addRelationn(0, -2147483648, 0)
Passed: <<test.MyGroup@270421f5>>.addRelationn(0, -2147483648, 0)
Passed: <<test.MyGroup@52d455b8>>.addRelationn(0, -2147483648, 0)
Passed: <<test.MyGroup@4f4a7090>>.addRelationn(2147483647, -2147483648, 0)
Passed: <<test.MyGroup@18ef96>>.addRelationn(2147483647, -2147483648, 0)
Passed: <<test.MyGroup@6956de9>>.addRelationn(2147483647, -2147483648, 0)
Passed: <<test.MyGroup@769c9116>>.addRelationn(-2147483648, 0, 0)
Passed: <<test.MyGroup@6aceb1a5>>.addRelationn(-2147483648, 0, 0)
Passed: <<test.MyGroup@ba4d54>>.addRelationn(-2147483648, 0, 0)
Passed: <<test.MyGroup@12bc6874>>.addRelationn(0, 0, 0)
Passed: <<test.MyGroup@de0a01f>>.addRelationn(0, 0, 0)
Passed: <<test.MyGroup@4c75cab9>>.addRelationn(0, 0, 0)
Passed: <<test.MyGroup@1ef7fe8e>>.addRelationn(2147483647, 0, 0)
Passed: <<test.MyGroup@6f79caec>>.addRelationn(2147483647, 0, 0)
Passed: <<test.MyGroup@67117f44>>.addRelationn(2147483647, 0, 0)
Passed: <<test.MyGroup@5d3411d>>.addRelationn(-2147483648, 2147483647, 0)
Passed: <<test.MyGroup@2471cca7>>.addRelationn(-2147483648, 2147483647, 0)
Passed: <<test.MyGroup@5fe5c6f>>.addRelationn(-2147483648, 2147483647, 0)
Passed: <<test.MyGroup@6979e8cb>>.addRelationn(0, 2147483647, 0)
Passed: <<test.MyGroup@763d9750>>.addRelationn(0, 2147483647, 0)
Passed: <<test.MyGroup@5c0369c4>>.addRelationn(0, 2147483647, 0)
Passed: <<test.MyGroup@2be94b0f>>.addRelationn(2147483647, 2147483647, 0)
Passed: <<test.MyGroup@d70c109>>.addRelationn(2147483647, 2147483647, 0)
Passed: <<test.MyGroup@17ed40e0>>.addRelationn(2147483647, 2147483647, 0)
Passed: <<test.MyGroup@50675690>>.addRelationn(-2147483648, -2147483648, 2147483647)
Passed: <<test.MyGroup@31b7dea0>>.addRelationn(-2147483648, -2147483648, 2147483647)
Passed: <<test.MyGroup@3ac42916>>.addRelationn(-2147483648, -2147483648, 2147483647)
Passed: <<test.MyGroup@47d384ee>>.addRelationn(0, -2147483648, 2147483647)
Passed: <<test.MyGroup@2d6a9952>>.addRelationn(0, -2147483648, 2147483647)
Passed: <<test.MyGroup@22a71081>>.addRelationn(0, -2147483648, 2147483647)
Passed: <<test.MyGroup@3930015a>>.addRelationn(2147483647, -2147483648, 2147483647)
Passed: <<test.MyGroup@629f0666>>.addRelationn(2147483647, -2147483648, 2147483647)
Passed: <<test.MyGroup@1bc6a36e>>.addRelationn(2147483647, -2147483648, 2147483647)
Passed: <<test.MyGroup@1ff8b8f>>.addRelationn(-2147483648, 0, 2147483647)
Passed: <<test.MyGroup@387c703b>>.addRelationn(-2147483648, 0, 2147483647)
Passed: <<test.MyGroup@224aed64>>.addRelationn(-2147483648, 0, 2147483647)
Passed: <<test.MyGroup@c39f790>>.addRelationn(0, 0, 2147483647)
Passed: <<test.MyGroup@71e7a66b>>.addRelationn(0, 0, 2147483647)
Passed: <<test.MyGroup@2ac1fdc4>>.addRelationn(0, 0, 2147483647)
Passed: <<test.MyGroup@5f150435>>.addRelationn(2147483647, 0, 2147483647)
Passed: <<test.MyGroup@1c53fd30>>.addRelationn(2147483647, 0, 2147483647)
Passed: <<test.MyGroup@50cbc42f>>.addRelationn(2147483647, 0, 2147483647)
Passed: <<test.MyGroup@75412c2f>>.addRelationn(-2147483648, 2147483647, 2147483647)
Passed: <<test.MyGroup@282ba1e>>.addRelationn(-2147483648, 2147483647, 2147483647)
Passed: <<test.MyGroup@13b6d03>>.addRelationn(-2147483648, 2147483647, 2147483647)
Passed: <<test.MyGroup@f5f2bb7>>.addRelationn(0, 2147483647, 2147483647)
Passed: <<test.MyGroup@73035e27>>.addRelationn(0, 2147483647, 2147483647)
Passed: <<test.MyGroup@64c64813>>.addRelationn(0, 2147483647, 2147483647)
Passed: <<test.MyGroup@3ecf72fd>>.addRelationn(2147483647, 2147483647, 2147483647)
Passed: <<test.MyGroup@483bf400>>.addRelationn(2147483647, 2147483647, 2147483647)
Passed: <<test.MyGroup@21a06946>>.addRelationn(2147483647, 2147483647, 2147483647)
Failed: <<test.MyGroup@77f03bb1>>.delPerson(null)
Failed: <<test.MyGroup@326de728>>.delPerson(null)
Failed: <<test.MyGroup@25618e91>>.delPerson(null)
Passed: <<test.MyGroup@7a92922>>.equals(null)
Passed: <<test.MyGroup@71f2a7d5>>.equals(null)
Passed: <<test.MyGroup@2cfb4a64>>.equals(null)
Passed: <<test.MyGroup@5474c6c>>.equals(java.lang.Object@4b6995df)
Passed: <<test.MyGroup@2fc14f68>>.equals(java.lang.Object@591f989e)
Passed: <<test.MyGroup@66048bfd>>.equals(java.lang.Object@61443d8f)
Passed: <<test.MyGroup@445b84c0>>.getAgeMean()
Passed: <<test.MyGroup@61a52fbd>>.getAgeMean()
Passed: <<test.MyGroup@233c0b17>>.getAgeMean()
Passed: <<test.MyGroup@63d4e2ba>>.getAgeVar()
Passed: <<test.MyGroup@7bb11784>>.getAgeVar()
Passed: <<test.MyGroup@33a10788>>.getAgeVar()
Passed: <<test.MyGroup@7006c658>>.getConflictSum()
Passed: <<test.MyGroup@34033bd0>>.getConflictSum()
Passed: <<test.MyGroup@47fd17e3>>.getConflictSum()
Passed: <<test.MyGroup@7cdbc5d3>>.getId()
Passed: <<test.MyGroup@3aa9e816>>.getId()
Passed: <<test.MyGroup@17d99928>>.getId()
Passed: <<test.MyGroup@3834d63f>>.getRelationSum()
Passed: <<test.MyGroup@1ae369b7>>.getRelationSum()
Passed: <<test.MyGroup@6fffcba5>>.getRelationSum()
Passed: <<test.MyGroup@34340fab>>.getValueSum()
Passed: <<test.MyGroup@2aafb23c>>.getValueSum()
Passed: <<test.MyGroup@2b80d80f>>.getValueSum()
Failed: <<test.MyGroup@3ab39c39>>.hasPerson(null)
Failed: <<test.MyGroup@2eee9593>>.hasPerson(null)
Failed: <<test.MyGroup@7907ec20>>.hasPerson(null)
Passed: <<test.MyGroup@546a03af>>.size()
Passed: <<test.MyGroup@721e0f4f>>.size()
Passed: <<test.MyGroup@28864e92>>.size()

===============================================
Command line suite
Total tests run: 121, Failures: 10, Skips: 0
===============================================

jmlunit只能对int参数测试0 极大 极小三个值,对其他参数测试null,基本不能起到帮助作用

Part 3 架构设计

hw9:

概述:

用每个person分别保存自己的link集合来保存整个社交网络,network只保存id到person的映射关系。从图上可以看出,person用一个hashmap保存id-value的link信息,并保存所有name age等个人属性,network只保存id-person的hashmap

hw10:

概述:

这次添加了Group,需要额外维护group层的人数、年龄平均等信息。

与Group层级有关的询问的信息都保存在group里,每次addRelation和addToGroup时对更新所有group的信息。从图中可以看到valuesum agemean都以数值形式直接保存在group类中。

hw11:

概述:

这次group增加了删除的需求,network层面增加了查询最短路、双连通等需求,还另外添加了借钱这个功能。并不需要改变架构,只需要添加对这些需求的支持。从图中可以看出Network类中增加了dfn、low、fa用于支持图操作,增加了money用于支持借钱。

Part 4 BUG分析

hw9:

wa:认为自己与自己没有relation,导致querylink等函数出错。

hw10:

wa:如果addrelation重复添加自己,则会重复计数。

oe:提交了官方包

hw11:

wa:稍微修改了一下tarjin算法,因为我们只需要求两个点是否双连通,但是出了bug。bug实现:从一个询问人出发,dfs到另一个人,若路上所有人的子孙都有返祖边,则stronglink。修改:在dfs树上确认另一个点的位置后从该点开始,记录其子孙返祖边返回的最高点,跳到高度为该点+1的点,若能一直返回根则stronglink

tle:有一个qmp测试点ctle。qmp我采用了每次dfs的方法实现,在极限数据下时间比较接近时间限制。

Part 5 心得体会

这个单元我们主要学习了契约式设计、规格化设计,完成了三次面向规格编程的作业和一次完善规格的实验。相比指导书,规格描述部分需求时更加简便、无歧义,但是在描述一些复杂功能时非常冗长,比如查询连通块和查询双连通等功能。由于工具链尚不完善,在编写规格时往往也会出现一些难以察觉的问题,这些在实验和作业中都有所体现。测试是一个复杂的工程,只根据jml生成完备的测试显然是不现实的,我觉得jml这样一种规格语言用途也不在于自动测试,而在于辅助我们实现契约式设计,将一个大的工程拆分为互不干涉的模块。感谢课程组的老师和助教的辛苦付出;感谢分享自己宝贵经验的同学们。

原文地址:https://www.cnblogs.com/lllllllllllllllllllllllllllll/p/12941601.html