一、测试与正确性论证
测试主要是对产品进行检查和测试,及时地发现程序中的故障和逻辑错误,以保障程序的可靠性。测试可以分为许多种类。测试可以为黑盒,也可以通过程序的逻辑结构进行白盒测试。通过测试用例来构造的测试,只能证明程序有错,不能证明程序无错。
正确性论证是从理论上对程序的正确性进行论证,通过证明可以得出程序逻辑上是否正确。在许多情况下,一个完全的形式证明可能是不必要的。在某些情况下,若不能实现完全测试,则也不可能实现完全的形式证明。然而,我们常常用程序正确性证明所开发的推理风格来指导测试过程,以增强对程序的信任,有时可以把某些性质的程序证明和其他性质的测试结合起来。
测试的门槛相较于正确性论证是比较低的。如果是进行黑盒测试,你可以通过划分等价类等手段覆盖化测试,如果是白盒测试,则可以通过对程序结构分析构造相应的测试数据。测试本身是一种非常直观的判断正确性的方法。而正确性论证本身难度比较高,很多时候难以论证。对比较大的程序,正确性论证也会非常复杂。当测试无法覆盖一些部分时,可以考虑使用正确性论证作为辅助与补充。
二、OCL语言
OCL(对象约束语言)语言是一种形式化,无二义性语言,它主要用于表示UML模型中施加于模型上的约束。一个约束就是对一个(或部分)面向对象模型或者系统的一个或者一些值的限制。UML类图中的所有值都可以被约束,而表达这些约束的方法就是 OCL。OCL起源于1997年BIM公司为响应OMG的"面向对象分析和设计标准"征求稿所提交的"对象时间限制提议",OCL是该提议的部分内容。 用OCL可以描述四类约束,分别是不变量、前置条件、后置条件和监护条件。
与JSF的异同
相似之处:都用于表示面向对象中对模型的约束,都具有不变式,前置条件与后置条件。
不同之处:(1)OCL语言是基于数学基础的,没有二义性,不会像JSF一样容易产生歧义
(2)OCL语言没有JSF中的MODIFIES,相应的,有一个监护规则,是对象能够从一种状态转变为另一种状态前其值必须为真的约束。
三、UML图
四、顺序图
五、UML状态图
六、总结
1、四个单元模块知识点之间的联系
四个学习单元相互联系。第一个单元主要介绍面向对象的基本知识,如继承、多态、接口等面向对象基本知识与概念。第二单元学习了面向对象的一个重要应用,多线程编程,学习了多线程的基本模型,更加熟练了类的交互。第三单元介绍了程序的规格,学习如何先设计程序之处尽量保证程序的正确性与规格化。第四单元主要着眼于测试与论证,通过单元测试与形式化论证来证明程序的正确性。
第三个单元所介绍的规格化设计与第一二单元是相互关联的,在进行设计之初,我们就要着眼于线程安全,继承接口等设计,固定好规格。第四单元的测试与论证也是基于类和方法的规格来的。
2、自己设计、测试和质量的进步
这一个学期通过OO课程的学习,我对程序的设计能力肯定是有显著提高。最开始我不能很好地理解面向对象思想,设计的程序也比较乱。在进行多线程编程后,我真正认真学习了一定的设计模式,自己在写作业之前也对程序进行了设计,代码质量有了显著提高。
测试方面,自己第一次进行了单元测试与正确性论证。虽然在之前也知道相关知识,但几乎一直在采用覆盖化测试。对测试程序有了系统化的理解,会对一些薄弱单元进行分析之后构造相应的测试用例进行测试。
3、工程化开发的理解
(1)工程化开发意味着程序体量很大,程序人员或许比较多。不进行系统化设计,规定好规格,可能导致程序各个部分的交互出现错误。
(2)工程化开发要求程序有容错率与报错机制。设计好程序的错误处理对后序的检查十分有帮助。
(3)程序要有可移植性与可维护性。代码要尽量简单易懂,设计上需要考虑代码是否具有普遍性,是不是容易更新换代。
(4)工程化开发的程序要进行动态测试,静态测试,正确性论证等各种测试,来保证正确性。
4、对课程组的建议
(1)面向对象基本知识介绍的太少。我们只有三节课的时间来介绍继承,抽象,接口和多态等面向对象最重要的概念。这些概念的熟练运用也需要通过读代码,写代码来实现。课程对面向对象的介绍实在太少了。
(2)最后对于规格介绍和测试完全可以重新写一份代码,从头开始。我认为补充前面写过的程序的规格是十分不对的,先写代码再写规格完全是本末导致。而且,刚开始学习时,写出的代码质量也不高,对这样的代码写规格,做测试非常痛苦。我认为可以考虑从设计,写规格,写代码,测试,论证的流程再重新完成一份作业,这样或许更能体现规格设计的优势。