$0 写在前面
善始善终,临近期末,为一学期的收获和努力画一个圆满的句号。
$1 测试与正确性论证的比较
$1-0 什么是测试?
测试是使用人工操作或者程序自动运行的方式来检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别的过程。
它是帮助识别开发完成(中间或最终的版本)的计算机软件(整体或部分)的正确度(correctness) 、完全度(completeness)和质量(quality)的软件过程;是SQA(software quality assurance)的重要子域。
Glenford J.Myers曾对测试的目的提出过以下观点:
(1)测试是为了发现程序中的错误而执行程序的过程。
(2)好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案。
(3)成功的测试是发现了至今为止尚未发现的错误的测试。
(4)测试并不仅仅是为了找出错误。通过分析错误产生的原因和错误的发生趋势,可以帮助项目管理者发现当前软件开发过程中的缺陷,以便及时改进。
(5)这种分析也能帮助测试人员设计出有针对性的测试方法,改善测试的效率和有效性。
(6)没有发现错误的测试也是有价值的,完整的测试是评定软件质量的一种方法。
(7)另外,根据测试目的的不同,还有回归测试、压力测试、性能测试等,分别为了检验修改或优化过程是否引发新的问题、软件所能达到处理能力和是否达到预期的处理能力等。
测试目标包括以下几点
(1) 发现一些可以通过测试避免的开发风险。
(2) 实施测试来降低所发现的风险。
(3) 确定测试何时可以结束。
(4) 在开发项目的过程中将测试看作是一个标准项目。
$1-1 什么是正确性论证?
程序正确性论证是程序设计理论的一个重要组成部分,研究如何使用程序设计语言编制程序,以正确实现预定的目标。
程序正确性论证提出编制正确程序的两种途径一种称为程序验证,研究如何使用数学推理来严格论证程序是否符合其目标。
另一种称为程序综合,研究如何由给定目标出发,逐步构造一个在计算机系统上可运行的程序,而且要求构造过程的每一步都是严格保持正确无误的。
在保证正确性的前提下,为提高程序运算效率而实现的程序之间的转换,称为程序变形,也是程序正确性论证的一个重要内容。
程序综合和程序变形是自动程序设计的理论基础。
$1-2 测试与正确性论证的效果差异
测试是使用测试样例对程序进行检测而正确性论证则是根据代码的逻辑进行验证。
测试想要完全覆盖的难度较大,需要大量的样例才能达到近似的完全覆盖,而正确性论证则不需要花费那么大的精力,只需要根据代码的逻辑和规格进行一系列验证即可。
二者相互补充,相辅相成。正确性论证可能由于一开始设计的错误导致程序运行的错误,而测试则难以覆盖全面,二者相互补充之后便可以对程序进行充分的测试。
总体而言,二者都是用于工程化测试的好方法,但是面向对象本身就是一种极为具体化的简单设计思路,大多数情况使用单元测试就能很好的应对测试需求。
$2 OCL语言调研
$2-0 关于OCL
对象约束语言是一种用于施加在指定的模型元素上约束的语言。
对象约束语言简称OCL(Object Constraint Language)。
对象约束语言(Object Constraint Language, OCL)作为图形符号的补充,说明建模元素的有关细节,例如:约束,前置条件,后置条件等。
OCL(object constraint language) 对象约束语言。用来进行约束定义的,形式化的无二义的语言。
OCL语言有如下特征
(1) 声明性语言,不会改变模型中的内容。
(2) 形式化语言语言。
(3) 无二义规范语言。
(4) 类型性语言,每一个表达式都有类型;
(5) 易学好用。
$2-1 OCL与JSF的异同
与JSF相比的相似点:二者都是形式语言,声明式的语言,都没有二义性,都有前置条件和后置条件以及不变式;
与JSF相比的不同点:OCL每个表达式都是具有类型的,且具有许多的基本数据类型等,不像JSF一样完全使用逻辑表达式。
$3 关于第14次作业的单电梯系统
根据第十四次作业的单电梯系统,针对调度器、电梯、请求队列和请求,整理出如下的UML类图以及时序图,采用图(graph)来演示成如下模型:
$3-0 类图
【图1】 单电梯系统的类图
类图中表示了不同类之间的继承依赖关系,在各个类中呈现了类全部的属性和方法。
$3-1 时序图
【图2】时序图
该时序图呈现了程序的执行过程,以及状态转换逻辑。
$4 学期小结
$4-0 阐述四个单元模块知识点之间的关系
(1) 单元一主要介绍了JAVA面向对象语言的思想等,主要注重对语言基础知识的训练以及对面向对象思想的初步了解;
(2) 单元二开始变涉及多线程的编程训练,介绍了多线程的机制、冲突,对面向对象的继承、封装、多态的特征也有了更进一步的深入介绍;
(3) 单元三开始进行规格化设计,通过JSF语言的书写来实现程序的规格化设计;
(4) 单元四则是队代码的验证与测试,编写JUnit测试单元对程序开展自动化测试、编写正确性论证文档对程序类和方法实现的正确性进行论证等。
这四个单元循序渐进,相辅相成,一步步引导我们逐步深入的对面向对象的编程思想进行了解。
$4-1 梳理自己所设计实现的程序,分析自己在设计、测试和质量上的进步
本学期我一共实现了两个独立作业和两个系列作业。
最开始的多项式处理作业,让我对JAVA语言的基本运用有了初步的了解;
到后来电梯、出租车系列作业让我接触到了面向对象编程思想以及多线程编程的模式;
编写单元测试JUnit,让我掌握了自动化测试方法;
从头至尾认真梳理下来,当我再次打开前几次的代码作业的时候,
令我欣慰的是,我能够从中看到自己的进步:
(1) 编码风格的进步:变量名、方法名的命名规范;方法的代码行数明显缩短;类的功能层次明显。
(2) 符合规格规范:通过对JSF的编写,能够按照规格,来编写符合规格约束的方法代码。
(3) 对SOLID设计原则的更深刻体会:代码不再是“灵机一动”的产物,而是经过思考和设计所编写的、符合设计原则的代码。
$4-2 阐述自己对工程化开发的理解
工程化开发和作业由着本质的不同。作业更注重的是结果的正确性,而工程化开发则要求设计人员有着良好的代码素养,和工程化开发规范。
“工程”和“过程”的不同,工程化开发要求将系统化的、规范的、可度量的方法应用于程序的开发、运行和维护的过程,即将工程化应用于软件过程。
工程着重应用,工程项目一定是软件过程的一个“产出”,一个个性化的实例!换句话来讲,工程也是由过程组成的。
工程化开发遵从一定的规格设计进行程序的开发,十分有利于于团队协作,提高工作效率和降低成本。
良好的工程化,能降低沟通成本,实现更好的协同,节省开发和测试人员的重复劳动,降低发布的常见问题的复现率等等。
$4-3 对课程的任何期望或建议
衷心的希望课程越办越好,让更多的人从中受益。