302
社区成员
发帖
与我相关
我的任务
分享在OO_Unit3单元中,我们学习并实践了如何使用JML进行规格化设计。例如,我们可以使用JML来描述一个方法的输入参数、输出结果以及可能的异常,这样不仅可以帮助开发者更好地理解方法的使用方式,还可以在后续的代码实现和测试过程中提供指导。
本次作业,需要完成的任务为实现简单社交关系的模拟和查询,学习目标为 入门级 JML 规格理解与代码实现。
JML,即JAVA Modeling Language,是一种基于Larch方法构建的行为接口规格语言,主要用于对Java程序进行规格化设计。
JML的优点在于它的精准性与可读性。使用JML,我们可以将模糊的自然语言描述替换为逻辑严密的规格语言,从而更好地表达设计思路,并为代码书写规格,提高代码的可读性和可维护性。
黑箱测试又叫功能测试、数据驱动测试或基于需求规格说明书的功能测试。该类测试注重于测试软件的功能性需求。
在Junit代码编写过程中,我们面对作业Network 类中的 queryTripleSum 方法,queryCoupleSum 方法,deleteColdEmoji 方法,进行测试时候采用随机参数生成,构建出来的就是简略版黑箱测试。
在该过程中,我们没有考虑到方法是如何实现,完全不考虑程序内部的逻辑结构和内部特性,只考虑到方法实现后的效果,即通过大量的数据测试来实现测试Bug的作用。
白盒测试又称为结构测试或逻辑驱动测试,它是把测试对象看成一个透明的盒子,它允许测试人员利用程序内部的逻辑结构设计测试用例,对程序所有逻辑路径进行测试。
我们这次面对的JML规格来编写的Junit测试代码,属于白盒测试,保证\ensures,\assignment,\not_assigned,pure等功效都要验证是否实现相应的功能。
qtvs * 1000,超多qts等,会出现CTLE的错误,这是由于压力测试下,代码的时间复杂度较高。面对作业中的压力测试,我们尽可能采取 $O(n^2)$ 以下的算法和相对优良的存储容器。int型,compare排列的返回不能直接作差,爆int。
qts,qtvs,qtav等采取动态优化,qsp 采用迪杰斯特拉,bfs等,qba采用优先队列。理解规格信息: 深入理解规格文档中描述的功能需求、接口规范和行为预期。这包括理解输入输出的前置条件、后置条件、副作用、格式、边界条件、异常情况等。
编写测试用例: 基于理解的规格信息编写测试用例。测试用例应该覆盖规格中描述的各种情况,包括正常情况和异常情况。确保测试用例能够检验代码的各种行为。
使用参数化测试: 使用参数化测试来轻松随机模拟地覆盖JML描述的情况。参数化测试允许使用不同的输入参数运行相同的测试方法。
断言和验证: 确保每个测试用例都有明确的断言和验证步骤,验证代码的输出是否符合规格中描述的预期行为。
边界条件测试: 规格中描述边界条件和特殊情况,例如输入的最大值、最小值、空值、相等条件等。在编写测试用例时,要特别关注这些边界条件,确保代码在边界条件下的行为符合预期。
学会使用JML规范编写代码对于本单元作业至关重要。理解后,编写规范的代码需要技巧和实践。尤其需要注重的是如何高效地实现方法规范,这需要技巧和算法的积累。JML在软件开发中扮演重要角色,因此学会阅读,并且熟练掌握掌握它是必要的。