其他分享
首页 > 其他分享> > OO Unit3 Summary

OO Unit3 Summary

作者:互联网

OO Unit3 Summary

目录

一、测试方法

本单元我采用的测试方法分为两种:一是针对某些复杂指令,基于其JML规格的测试,保证单个方法运行的正确性;二是随机数据生成测试,从全局保证程序正确性。

1. 基于JML规格的测试

对于某个特定的方法基于JML规格进行针对性测试,要点在于覆盖方法的所有前置条件,从而对所有相应后置条件情况进行正确性判断。要想覆盖所有前置条件,不仅要根据JML规格进行分类考虑,还要求对该类的状态变化具有全面的把握。对于后置条件的正确性判断,异常行为较容易进行判定,只需要观察相应异常即可。对于常规行为,需要基于数据计算正确结果进行比对(准备难度大但准确率能充分保证),或者采用对拍的方式(准备难度低但准确率只能相对保证)。下面进行举例说明:

/*@ public normal_behavior
 @ requires !(\exists int i; 0 <= i && i < messages.length; messages[i].equals(message)) &&
 @           (message instanceof EmojiMessage) ==> containsEmojiId(((EmojiMessage) message).getEmojiId()) &&
 @           (message.getType() == 0) ==> (message.getPerson1() != message.getPerson2());
 @ assignable messages;
 @ ensures messages.length == \old(messages.length) + 1;
 @ ensures (\forall int i; 0 <= i && i < \old(messages.length);
 @         (\exists int j; 0 <= j && j < messages.length; messages[j].equals(\old(messages[i]))));
 @ ensures (\exists int i; 0 <= i && i < messages.length; messages[i].equals(message));
 @ also
 @ public exceptional_behavior
 @ signals (EqualMessageIdException e) (\exists int i; 0 <= i && i < messages.length;
 @                                     messages[i].equals(message));
 @ signals (EmojiIdNotFoundException e) !(\exists int i; 0 <= i && i < messages.length;
 @                                       messages[i].equals(message)) &&
 @                                       (message instanceof EmojiMessage) &&
 @                                       !containsEmojiId(((EmojiMessage) message).getEmojiId());
 @ signals (EqualPersonIdException e) !(\exists int i; 0 <= i && i < messages.length;
 @                                     messages[i].equals(message)) &&
 @                                     ((message instanceof EmojiMessage) ==>
 @                                     containsEmojiId(((EmojiMessage) message).getEmojiId())) &&
 @                                     message.getType() == 0 && message.getPerson1() == message.getPerson2();
 @*/
public void addMessage(Message message) throws
       EqualMessageIdException, EmojiIdNotFoundException, EqualPersonIdException;

addMessage指令有四类可能的前置条件,分别是:

  1. 网络中已存在相同messageId的情况

  2. message是EmojiMessage但网络中不包含该Emoji

  3. message是单发消息但发送者和接收者相同的情况

  4. 上述三种情况均非的正常情况。

所以在覆盖这四种情况的时候,首先要构造出相应状态的网络类。

观察后置条件时,对于前三种情况,观察对应异常输出即可。对于最后一种情况,可以在输入构造指令前后对message容器遍历输出,观察是否满足条件。

2. 随机数据测试

随机数据生成中,首先在开头生成若干ap、ag、ar、atg、sei、am等指令,为后续指令测试准备的同时测试这些指令的异常情况。之后,再以均等概率生成各类指令进行测试。

def datagenerator(self):
   data = ''
   self.names = copy.deepcopy(names)
   for j in range(self.pre_person):
       pid = self.generatorPerson()
       name = self.rdname()
       age = self.rdage()
       data += ("ap " + str(pid) + " " + name + " " + str(age) + "\n")
   # 生成 ap
   
   for i in range(num):
       instr = self.rdInstr()
       # 随机确定一个instr
   
       if (instr == 'qgps'):
           gid = self.getGroup()
           data += ("qgps " + str(gid) + " " + "\n")
       # 生成一个指令
       
  return data

数据生成以后,再利用数据进行对拍。实现自动化测评。

3. 测试总结

基于JML规格测试从理论上来说,只要保证了前置条件全覆盖,相应后置条件输出全部正确,就能保证单个方法的正确性。但是程序运行不仅是单个方法的问题。方法运行改变类的状态,不同类交互构成了程序。因此我们还需要测试类的状态改变以及不同类之间的交互,此时测试的构建难度加大了很多,由于完成作业时间有限,因此又采取了随机数据生成+对拍的方式进行自动测试。二者互补,相得益彰。

二、架构设计及图模型

1. 架构分析

由于是根据接口实现的各个类,关键方法已经注明且各个类之间的关系较为清晰,此处不再画UML图进行展示分析,只简略介绍各类的设置。

1. 第九次作业

2. 第十次作业

3. 第十一次作业

2. 图构建和维护策略

社交网络以Network类为整个网络,Group类为簇,Person类为结点,relation为边。对该社交网络定义了一系列方法,可以采用修改网络时维护图的属性的方式,降低查询方法的复杂度。这是图构建维护的整体思路。下面以各查询方法为出发点进行分析:

三、性能问题及修复

社交网络中有两个性能提升点:

  1. 管理的对象使用HashMap提高检索速度。

  2. 各个图查询方法按照JML规格实现其时间复杂度将会非常高。具体处理方法参见 二、2. 图构建和维护策略。

由于在架构设计和图维护时考虑了方法性能问题,因此我没有出现性能问题。

四、扩展作业

假设出现了几种不同的Person

如此Network可以支持市场营销,并能查询某种商品的销售额和销售路径等 请讨论如何对Network扩展,给出相关接口方法,并选择3个核心业务功能的接口方法撰写JML规格(借鉴所总结的JML规格模式)

五、学习体会

标签:OO,old,int,mid,Summary,getMessage,&&,Unit3,message
来源: https://www.cnblogs.com/sleepEarlyGuy/p/16343838.html