1、JML理论基础
JML(Java Modeling Language)是用于对Java程序进行规格化设计的一种表示语言。JML是一种行为接口规格语言(Behavior Interface Specifification Language,BISL),基于Larch方法构建。BISL提供了对方法和类型的规格定义手段。通过JML及其支持工具,不仅可以基于规格自动构造测试用例,并整合了SMT Solver等工具以静态方式来检查代码实现对规格的满足情况。
以上内容摘自JML level0 手册。至于我个人理解的JML,则更像是一种描述代码实现者和使用者之间契约的形式化语言。根据各种JML语句的约束,可以直接从形式层面上验证代码实现的正确性。所以JML不仅可以协调调用者和实现者,还可以使得代码检验的效率更高。
这里关于JML的语法部分就不过多叙述,更详细内容可以参考上文中提到的JML手册。
2、JML应用工具链
这里首先要反省一下自己,本单元编写代码的过程中,除了官方要求的Junit测试以外,自己并未使用包括下文中的任何JML的工具。可能这种懒惰也是自己本单元bug百出的重要原因吧。
-
OpenJML
OpenJML主要功能包括三种:Parsing and Type-checking、Extended Static Checking、以及Runtime Assertion Checking。分别对应着对JML语法的检查和对代码的静态、动态检查。总的来说,可以对JML语言及其实现做一个比较全面的验证。
-
JMLUnitNG
JMLUnitNG主要起到一个针对JML的实现自动生成测试样例的作用,下文中将会有具体应用。
二、基于SMT Solver的验证
感谢讨论区同学提供的帖子:https://www.cnblogs.com/pekopekopeko/p/12920417.html
根据检验,出现了很莫名其妙的JML语法错误。询问运行成功的同学发现根本没有相同的情况,根据自己的判断,这次运行应该是有问题的。。。。然而由于网上关于OpenJML的SMT solver资料实在是很少,而且经过同学的讨论也不能得出一个很好的结果,因此只能遗憾地结束这部分的验证。查阅其他同学的总结,我发现大部分同学在这部分验证时都会碰到各种各样的玄学bug,最后只能进行一些十分简单方法的验证。故在此我想对此工具的实用性提出自己的疑问。。。(仅代表个人观点
三、JMLUnitNG自动测试样例的生成
生成关于Group接口及其实现的JMLUnitNG的自动测试如下图: